Python爬虫 | 猿人学第三题

今天讲猿人学第三题,这道题为难度为简单,但说真的我只做得出更新前的,目前的版本我一开始是做不出来的,我也是依据大佬的讲解才懂的。


地址:

match.yuanrenxue.com/ma


目录:

1、环境

2、分析请求

3、实现爬取


1、环境

Python3.7、requests


2、分析网站

先找到数据接口

6dec9711f58c6b4331d28731bda4c1b8.jpeg
图2-1

很容易通过测试就知道是cookie加密(先不带cookie请求一次就知道),关于cookie加密的类型我之前已经讲过几次了这里就不讲了可以看猿人学第二题

18b7a905950effc3cde86891f06299b5.jpeg
图2-2

这题的cookie为服务器返回的,如图2-2每次请求数据接口前都会请求一次logo这个接口,那这就简单了,用session保持会话它怎么请求我们就怎么请求就好了。

这是最开始的版本的解决方案,但是现在不行了,解决方案看第三节吧。


3、代码实现

  • 1、有些反爬采用的是检测headers的顺序,且不能使用headers=headers进行赋值,原因为get/post会改变顺序,所以只能使用自定义的items方法
  • 2、之所以定义为items方法,是因为系统在获取headers值的时候会自动调用items方法,所以需要自定义一个类,实例化的时候自动调用items方法
  • 3、headers中的属性值的顺序需要按F12中Headers标签的Request Headers中选择view source,整个复制过来即可
  • 4、items的返回值必须为元组格式,get/post会自动转成字典格式的headers
import requests
from collections import Counter


class MyHeaders(object):
    def items(self):
        return (('Host', 'match.yuanrenxue.com'),
                ('Pragma', 'no-cache'),
                ('Connection', 'keep-alive'),
                ('Accept', 'application/json, text/javascript, */*; q=0.01'),
                ('User-Agent', 'yuanrenxue.project'),
                ('X-Requested-With', 'XMLHttpRequest'),
                ('Referer', 'http://match.yuanrenxue.com/match/3'),
                ('Origin', 'http://match.yuanrenxue.com'),
                ('Cache-Control', 'no-cache'),
                ('Accept-Encoding', 'gzip, deflate'),
                ('Accept-Language', 'zh-CN,zh;q=0.9,en;q=0.8'),)


def get_json(page):
    logo_url = "http://match.yuanrenxue.com/logo"
    api_url = "http://match.yuanrenxue.com/api/match/3?page={}".format(page)
    resp = requests.get(logo_url, headers=MyHeaders())
    response = requests.get(api_url, cookies=resp.cookies.get_dict(), headers=MyHeaders())
    return response.json()


if __name__ == '__main__':
    data_list = []
    for page in range(1, 6):
        json = get_json(page)
        data = json.get('data')
        for d in data:
            data_list.append(d['value'])

    top_1 = Counter(data_list).most_common(1)[0]
    print("出现频率最高的申请号:", top_1[0])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值