IP被封?NO!Python解决各路反爬措施,强势采集拉勾网数据

2020-04-22  本文已影响0人  一起学编程

保持Cookie与浏览器来源(User-Agent)的说明,如果不加浏览器来源会造成一个IP频繁的假象。

为什么说是假象呢?因为当你用浏览器再次访问是可以正常访问的,自行测试即可。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:595948765
欢迎加入,一起讨论 一起学习!

不建议小白阅读此文,不建议不喜欢动手的人阅读此文,因为不做的话,永远不知道事情的真相。

由于网页源代码中并没有我们需要的信息:

image.png

那么我们进行抓包测试:

IP被封?NO!Python解决各路反爬措施,强势采集拉勾网数据!

发现此包中的确包含了我们想要的信息。

注意:

这个post请求当中 表单数据first=ture 是不变的,pn代表页码,当然kd代表我们需要查找的关键词。

请求这个url必须带上referer,这个报文代表我们的url来源。还有我们的浏览器来源user-agent用户代理也要添加!

IP被封?NO!Python解决各路反爬措施,强势采集拉勾网数据!

这样请求,你会发现还是无法正常的获取到数据,那么别忘记我前面说的,保持cookie。在此处有人会直接复制cookie报文,但是别忘了cookie是有时效性的,所以怎么办?

最好的办法就是 提前访问此url的来源,从来源中把cookie取下来,添加到这个请求当中。

最好筛选数据即可:

IP被封?NO!Python解决各路反爬措施,强势采集拉勾网数据!
kw = input('请输入你想要查询的工作:')
for i in range(1, 10):
    data = {
        'first': 'true',
        'pn': i,
        'kd': kw
    }
    headers = {
        'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
    }
    session = requests.session()
    session.get('https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=', headers=headers)
    cookies = session.cookies
    cookies = cookies.get_dict()

    res = session.post('https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false', data=data, headers=headers, cookies=cookies).json()
    # print(res)
    res = res.get('content',)
    # print(res)
    res = res['positionResult']['result']
    # pprint.pprint(res)

    cities = jsonpath.jsonpath(res, '$..city')
    print(len(cities))
    salaries = jsonpath.jsonpath(res, '$..salary')
    print(len(salaries))
    positionNames = jsonpath.jsonpath(res, '$..positionName')
    print(len(positionNames))
    print(cities, salaries, positionNames, sep='|')
    # data = pandas.DataFrame({'职位': positionNames, '地址': cities, '薪水': salaries})
    # print(data)
    # data.to_excel(f'{kw}.xls', index=None)
    for positionName, city, salary in zip(positionNames, cities, salaries):
        print(positionName, city, salary)
        with open(f'{kw}.csv', 'a', newline='') as f:
            csvWriter = csv.writer(f, dialect='excel')
            # csvWriter.writerow(['职位', '地址', '薪资'])
            csvWriter.writerow([positionName, city, salary])
上一篇 下一篇

猜你喜欢

热点阅读