写在前面

Python反反爬系列

  1. JS混淆---源码乱码
  2. JS混淆---动态Cookie

这次的题目相比于前两次的题目简单一些,话不多说,我们直接开整

题目


题目网址,点我去刷题

抓取下列5页商标的数据,并将出现频率最高的申请号填入答案中

分析网页

老规矩,我们还是首先打开刷题网站,接着打开谷歌调试工具
查看【XHR】里面的内容

跟前两道题是一样的,数据都是通过ajax传递的,我们也不用去打开这个网址了
经过前面两道题的经验,直接打开肯定是不行的
我们来到【ALL】里面,查看一下所有的请求

我们可以看到有两个名为【3】的请求,但是这两个是不一样的
第一个的url是:http://match.yuanrenxue.com/match/3,也就是题目的这个网址
第二个的url是:http://match.yuanrenxue.com/api/match/3,是网页数据来源的网址
根据我们第二题的经验可能会去对比两个名字相同的请求,但是在这道题里面,可比性不大

那么就点击数据来源的网址,看看请求的一些信息

可以发现有一条【Set-Cookie】的信息,很特别

查看前面的几条请求,可以发现,只有红色方框请求有这个值,连第一个名为【3】的请求也没有

那么,我们就可以推测,是不是这个名为【logo】的请求动了什么手脚

我们点击页面的下一页,看看有没有新的变化


可以发现,名为【logo】的请求又出现了,而且每次都是在网页数据来源请求之前
那么,这道题目的逻辑就很清楚了,要想正常的拿到网页数据,就必须先访问【logo】这个请求

【logo】到底做了什么


我们查看【logo】这个请求,也没有发现JS的代码,平平无奇
所以,我们可以大胆的做这个猜测

  1. 首先访问http://match.yuanrenxue.com/logo,在响应头中取得sessionid的值
  2. 接着再去访问网页数据来源的网址

验证猜想

import requests

# 实例化session
session = requests.session()

# 设置请求头,必须这么写,不然会请求失败,
# 具体原因我也不是很知道,如果有大佬知道的话,可以分享一下
headers = { 'Connection': 'keep-alive',
            'User-Agent': 'yuanrenxue.project',
            'Accept': '*/*',
            'Origin': 'http://match.yuanrenxue.com',
            'Referer': 'http://match.yuanrenxue.com/match/3',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7',
           }
# 名为【logo】请求的url
url = 'http://match.yuanrenxue.com/logo'
# 设置请求头数据
session.headers = headers
# 使用session发起请求
response = session.post(url=url)

url_api = f'http://match.yuanrenxue.com/api/match/3'
res = session.get(url=url_api).json()
# 成功获取到数据,猜想成功
print(res)
#{'status': '1', 'state': 'success',
# 'data': [{'value': 2838}, {'value': 7609}, {'value': 8717},
# {'value': 6923}, {'value': 5325}, {'value': 4118}, {'value': 8884},
# {'value': 8717}, {'value': 2680}, {'value': 3721}]}

通过这样的方式,我们如愿以偿地拿到了数据,我们就可以愉快地写Python代码解答题目啦

解出答案

# @BY     :Java_S
# @Time   :2020/12/31 15:45
# @Slogan :够坚定够努力大门自然会有人敲,别怕没人赏识就像三十岁的梵高

import requests
import pandas as pd

def get_data(page_num):
    session = requests.session()

    headers = { 'Connection': 'keep-alive',
                'User-Agent': 'yuanrenxue.project',
                'Accept': '*/*',
                'Origin': 'http://match.yuanrenxue.com',
                'Referer': 'http://match.yuanrenxue.com/match/3',
                'Accept-Encoding': 'gzip, deflate',
                'Accept-Language': 'zh-CN,zh;q=0.9,en-GB;q=0.8,en;q=0.7',
               }
    url = 'http://match.yuanrenxue.com/logo'
    session.headers = headers
    response = session.post(url=url)

    url_api = f'http://match.yuanrenxue.com/api/match/3?page={page_num}'
    res = session.get(url=url_api).json()
    data = [i['value']for i in res['data']]
    return data


if __name__ == '__main__':
    data = []
    for i in range(1,6):
        data_list = get_data(i)
        data.extend(data_list)
    count = pd.value_counts(data)
    print(count)

这次的题目是:统计出现频率最高的申请号,因为我之前学过Pandas,所以直接用了里面的函数得出答案

世界因代码而改变 Peace Out
最后修改:2021 年 01 月 18 日 08 : 02 PM
如果觉得我的文章对你有用,请随意赞赏