应对反爬如何爬取拉勾网信息(非常详细)

article/2025/7/11 10:05:25

目录

    • 前期准备
      • 请求头
      • Cookies
        • 问题
        • 手动提取Cookies和自动Cookies相结合
          • 自动提取Cookies实现
        • 手动提取Cookies实现
    • 页面分析
    • 代码实现

前期准备

我们知道百度其实就是一个爬虫,但是对方的服务器是没有对百度进行反爬的,所以为了防止对方服务器的反爬,我们在爬取网站的时候要尽可能地模拟我们使用的浏览器。

请求头

    headers = {'Origin': 'https://www.lagou.com','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3','Referer': 'https://www.lagou.com/utrack/trackMid.html?f=https%3A%2F%2Fwww.lagou.com%2Fjobs%2Flist_%3Fcity%3D%25E4%25B8%258A%25E6%25B5%25B7%26cl%3Dfalse%26fromSearch%3Dtrue%26labelWords%3D%26suginput%3D','Connection': 'keep-alive','X-Anit-Forge-Token': 'None',}

Cookies

我们开始给爬虫加登录信息。
思路是这样的,我们首先获取未登录的cookies信息,然后手动获取登录之后的cookies,最后将网页的未登录的cookies来更新手动获取的cookies。

Cookies更新之前:

在这里插入图片描述

Cookies更新之后:
在这里插入图片描述

问题

为什么我们要用登录之前的Cookies来替代未登录时候的Cookies,而不是直接用登录之后的Cookies呢?
我们来进行下面的操作:

我们用python获取未登录之前的Cookies,代码如下:

r = requests.utils.dict_from_cookiejar(response.cookies)  # 获取未登录之前的cookies,并将其保存为字典形式

得到Cookies为:
{'X_HTTP_TOKEN': '42daf4b72327b2815391767951bf5e71415983ed09', 'user_trace_token': '20200817214535-246f31d4-af7a-4789-91aa-8b78a9968cc2', 'JSESSIONID': 'ABAAABAABAGABFA4667C48E469AC7C13D950817DEE99E9E', 'SEARCH_ID': 'bcce59f10c2f47e092507fc45937b092'}

而登录之后的Cookies如下图:
在这里插入图片描述其中所包含的键值对比未登录之前的Cookies要多,如果我们用手动获取的Cookies来登录,代码是这样的:

response = requests.post('https://www.lagou.com/jobs/positionAjax.json', headers=headers, params=params,cookies=cookies, data=data)  # 

我们发现加了Cookies之后,还是获取不到我们想要的数据,还是会出现如下的图:
在这里插入图片描述

很多人到这一步如果再爬取不到数据,可能就要怀疑人生了。其实你只是有个小问题一直被你忽视了,那就是我们不能只用当前手动获取的Cookies,还是需要和程序获取的Cookies来结合。因为程序获得的Cookies是动态的,而我们手动获取的Cookies只能是静态的,所以这就导致了我们手动获取的Cookies在复制到了程序当中的时候出现了失效的情况了。

手动提取Cookies和自动Cookies相结合

通过手动提取的Cookies和程序自动Cookies相结合的方式,我们顺利爬取到了页面信息。

自动提取Cookies实现
    headers = {'Origin': 'https://www.lagou.com','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3','Referer': 'https://www.lagou.com/utrack/trackMid.html?f=https%3A%2F%2Fwww.lagou.com%2Fjobs%2Flist_%3Fcity%3D%25E4%25B8%258A%25E6%25B5%25B7%26cl%3Dfalse%26fromSearch%3Dtrue%26labelWords%3D%26suginput%3D','Connection': 'keep-alive','X-Anit-Forge-Token': 'None',}response = requests.get('https://www.lagou.com/jobs/list_?city=%E4%B8%8A%E6%B5%B7&cl=false&fromSearch=true&labelWords=&suginput=',   ##通过首页来提取未登录的Cookiesheaders=headers)r = requests.utils.dict_from_cookiejar(response.cookies)  # 获取未登录时cookies的字典形式

手动提取Cookies实现

cookies = {'X_MIDDLE_TOKEN': 'b378b95e10365bf661d07c4677d0796b','JSESSIONID': 'ABAAAECABIEACCA21A19A7E6AC502D30F9E0C895A9D728F','_ga': 'GA1.2.2029710160.1597402404','_gat': '1','Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1597402405','user_trace_token': '20200814185324-964f6276-b305-42bc-ace0-b2d9281183be','LGSID': '20200817212759-d10cedcc-a8bf-4217-be81-dd076a492bef','PRE_UTM': '','PRE_HOST': '','PRE_SITE': '','PRE_LAND': 'https%3A%2F%2Fwww.lagou.com%2F%3F_from_mid%3D1','LGUID': '20200814185325-2014f63b-09d9-4803-bbe1-88d52f7e09be','_gid': 'GA1.2.1977632940.1597402405','index_location_city': '%E4%B8%8A%E6%B5%B7','TG-TRACK-CODE': 'index_hotjob','LGRID': '20200814192428-6a6ac31c-af6b-4a6f-8310-1710a2b061a4','Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1597404269','SEARCH_ID': '50341c0aa78d427cb85b609ca8a00308','X_HTTP_TOKEN':'42daf4b72327b2819780767951bf5e71415983ed09'}

页面分析

首先我们对拉勾网的网站进行分析,找到数据是在哪个api接口下。这里重点找一个带json的文本信息链接,如下图所示:
在这里插入图片描述

其次,构造参数;我们发现浏览器请求的链接是:
https://www.lagou.com/jobs/positionAjax.json?city=%E4%B8%8A%E6%B5%B7&needAddtionalResult=false
我们直接访问这个网址,是得不到任何数据的,我们还需要给链接构造参数:
在这里插入图片描述这里有三个参数,通过对比分析得到first为true时为第一页,pn代表了第几页,kd代表搜索关键词。

cookies = {'X_MIDDLE_TOKEN': 'b378b95e10365bf661d07c4677d0796b','JSESSIONID': 'ABAAAECABIEACCA21A19A7E6AC502D30F9E0C895A9D728F','_ga': 'GA1.2.2029710160.1597402404','_gat': '1','Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1597402405','user_trace_token': '20200814185324-964f6276-b305-42bc-ace0-b2d9281183be','LGSID': '20200817212759-d10cedcc-a8bf-4217-be81-dd076a492bef','PRE_UTM': '','PRE_HOST': '','PRE_SITE': '','PRE_LAND': 'https%3A%2F%2Fwww.lagou.com%2F%3F_from_mid%3D1','LGUID': '20200814185325-2014f63b-09d9-4803-bbe1-88d52f7e09be','_gid': 'GA1.2.1977632940.1597402405','index_location_city': '%E4%B8%8A%E6%B5%B7','TG-TRACK-CODE': 'index_hotjob','LGRID': '20200814192428-6a6ac31c-af6b-4a6f-8310-1710a2b061a4','Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1597404269','SEARCH_ID': '50341c0aa78d427cb85b609ca8a00308','X_HTTP_TOKEN':'42daf4b72327b2819780767951bf5e71415983ed09'}'''参数的解释放在后面
params = (('px', 'default'),('city',city),('needAddtionalResult', 'false'),)
data = {"first":"true",    'kd': '数据分析','pn': pn}if pn>1:data["first"] = "false"
代码运行时候需要取消注释'''
response = requests.post('https://www.lagou.com/jobs/positionAjax.json', headers=headers, params=params,data=data)  # 请求接口

于是乎我们开始访问,却得到了这样的链接,等等,我们刚不是已经将参数构造完成了吗?为什么还是出现这样的情况?
在这里插入图片描述
我们考虑可能是没有带cookies访问,我们开始尝试加Cookies,这里回到上一节的Cookies
尝试加了Cookies之后对页面爬取,代码如下:

    response = requests.post('https://www.lagou.com/jobs/positionAjax.json', headers=headers, params=params,cookies=cookies, data=data) return response.json()

顺利输出:
在这里插入图片描述

但是这里的数据没有结构化显示出来,所以我们需要使用以下代码来获得结构化数据:

response_json = json.dumps(response_json,indent=4,ensure_ascii=False)

在这里插入图片描述
通过字典形式来获取我们想要的数据:

position_list = response_json["content"][ 'positionResult']["result"]

在这里插入图片描述
至此,我们就完成了页面的分析

代码实现

import json
import random
import timeimport requestsdef get_cookie():headers = {'Connection': 'keep-alive','Cache-Control': 'max-age=0','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}response = requests.get('https://www.lagou.com/jobs/list_?city=%E4%B8%8A%E6%B5%B7&cl=false&fromSearch=true&labelWords=&suginput=',headers=headers)  # 请求原网页r = requests.utils.dict_from_cookiejar(response.cookies)  # 获取cookiesprint(r)cookies = {'X_MIDDLE_TOKEN': 'b378b95e10365bf661d07c4677d0796b','JSESSIONID': 'ABAAAECABIEACCA21A19A7E6AC502D30F9E0C895A9D728F','_ga': 'GA1.2.2029710160.1597402404','_gat': '1','Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1597402405','user_trace_token': '20200814185324-964f6276-b305-42bc-ace0-b2d9281183be','LGSID': '20200817212759-d10cedcc-a8bf-4217-be81-dd076a492bef','PRE_UTM': '','PRE_HOST': '','PRE_SITE': '','PRE_LAND': 'https%3A%2F%2Fwww.lagou.com%2F%3F_from_mid%3D1','LGUID': '20200814185325-2014f63b-09d9-4803-bbe1-88d52f7e09be','_gid': 'GA1.2.1977632940.1597402405','index_location_city': '%E4%B8%8A%E6%B5%B7','TG-TRACK-CODE': 'index_hotjob','LGRID': '20200814192428-6a6ac31c-af6b-4a6f-8310-1710a2b061a4','Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6': '1597404269','SEARCH_ID': '50341c0aa78d427cb85b609ca8a00308','X_HTTP_TOKEN':'42daf4b72327b2819780767951bf5e71415983ed09'}cookies.update(r)  # 更新接口的cookies  #以r为准print(cookies)  return cookiesdef crawl(city = "", pn = 1, cookies = None):headers = {'Origin': 'https://www.lagou.com','X-Anit-Forge-Code': '0','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Accept': 'application/json, text/javascript, */*; q=0.01','Referer': 'https://www.lagou.com/jobs/list_java?px=new&city=%E4%B8%8A%E6%B5%B7','X-Requested-With': 'XMLHttpRequest','Connection': 'keep-alive','X-Anit-Forge-Token': 'None',}params = (('px', 'default'),('city',city),('needAddtionalResult', 'false'),)data = {"first":"true",'kd': '数据分析','pn': pn}if pn>1:data["first"] = "false"response = requests.post('https://www.lagou.com/jobs/positionAjax.json', headers=headers, params=params,cookies=cookies, data=data)  # 请求接口return response.json()
city_list = ["北京","上海","深圳","广州","杭州","成都","南京","武汉","西安","厦门","长沙","苏州","天津"]for city in city_list:print("*"*60)print("{city} start".format(city=city))for i in range(1,31):if (i-1)%5==0:cookies = get_cookie()  ##因为Cookies是有时效性的,每隔一段时间Cookies就会动态地发生变化time.sleep(random.random()+random.randint(1,2))  ##很重要!!加随机时间防止反爬response_json = crawl(city=city,pn=i,cookies=cookies) ##pn是第几页time.sleep(1.2)# response_json = json.dumps(response_json,indent=4,ensure_ascii=False)# print('response_json',response_json)   ##输出结构化数据try:position_list = response_json["content"][ 'positionResult']["result"]print(position_list)except:print(response_json)if len(position_list)<1:print("{city} start".format(city=city))print("*"*60)breakprint("{city} end".format(city=city))print("*"*60)

至此,我们就完成了对拉勾网数据的爬取了,需要注意的有以下几点:

  1. 在爬取网页之前要尽可能让你的爬虫伪装成浏览器的访问。这里加了Cookies和Headers。
  2. 在批量爬取时候要加随机时间,特别重要!!!
  3. Cookies是有时效的,切忌将手动提取的登陆之后的Cookies来替代未登陆时的Cookies

小贴士:根据经验来看,网页的数据一般是在json链接中,所以我们一般情况下重点关注带json的链接信息。

至此,我们的数据爬取任务就完成了,后面会专门写一个清洗和写入数据库,以及通过爬取的数据来分析就业的文章,有需要的可以继续关注别的博客。

如有转载请注明出处!!!


http://chatgpt.dhexx.cn/article/jXYg1HIc.shtml

相关文章

【Python】模拟登陆并抓取拉勾网信息(selenium+phantomjs)

环境 python3.5pip install seleniumphantomjs-2.1.1pip install pyquery 代码 # -*- coding:utf-8 -*-# 防止print中文出错 import time import sys import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodinggb18030)from pyquery import PyQuery as pq from se…

Python爬虫实战,requests模块,Python实现拉勾网求职信息数据分析与可视化

前言 利用requests爬取拉勾网求职信息数据分析与可视化&#xff0c;废话不多说。 让我们愉快地开始吧~ 开发工具 **Python版本&#xff1a;**3.6.4 相关模块&#xff1a; requests模块&#xff1b; re模块&#xff1b; os模块 jieba模块&#xff1b; pandas模块 num…

爬虫学习之17:爬取拉勾网网招聘信息(异步加载+Cookie模拟登陆)

很多网站需要通过提交表单来进行登陆或相应的操作&#xff0c;可以用requests库的POST方法&#xff0c;通过观测表单源代码和逆向工程来填写表单获取网页信息。本代码以获取拉勾网Python相关招聘职位为例作为练习。打开拉钩网&#xff0c;F12进入浏览器开发者工具&#xff0c;可…

python成功爬取拉勾网——初识反爬(一个小白真实的爬取路程,内容有点小多)

python成功爬取拉勾网&#xff08;一个小白的心里路程&#xff09; 最开始想爬取拉钩是因为半年前上python实验课的时候&#xff0c;老师给了两个任务&#xff0c;一个时爬取糗百的笑话内容&#xff0c;另一个时爬取拉勾网的职位信息&#xff0c;当时因为课时紧张的缘故&#…

爬虫实例二:爬取拉勾网招聘信息

爬虫实例二&#xff1a;爬取拉勾网招聘信息 如果是第一次看本教程的同学&#xff0c;可以先从一开始&#xff1a; 爬虫实例一&#xff1a;爬取豆瓣影评 欢迎关注微信公众号&#xff1a;极简XksA 微信账号&#xff1a;xksnh888 转载请先联系微信号&#xff1a;zs820553471 …

python爬虫之爬取拉勾网

这次要爬取拉勾网&#xff0c;拉勾网的反爬做的还是很不错的啊&#xff0c;因为目标网站是Ajax交互的我一开始是直接分析json接口来爬取的&#xff0c;但是真的很麻烦&#xff0c;请求头一旦出点问题就给识别出来了后续我就改了一下方法用selenium来模拟浏览器去获取 招聘求职…

爬虫练习六:爬取拉勾招聘信息

1. 明确需求 1. 初学爬虫时&#xff0c;看着各路大佬以拉勾网为案例进行爬虫讲解&#xff0c;自己也这样尝试。结果因为个人水平实在太低&#xff0c;很快就触发反爬虫机制&#xff0c;甚至连个人的账号都被封禁。所以这次想要重新挑战一下&#xff0c;爬取拉勾展示的招聘数据。…

用接口登录拉勾网

前段时间一直忙于公司项目的测试工作导致一周多没有撸代码&#xff0c;所以今天通过悠悠是博客学习了一下如何让用接口登录拉勾网 下面介绍一下吧&#xff01;分享下经验以及心得&#xff0c;&#xff0c;虽然我知道也没什么人会看&#xff01; 首先呢要先登录拉钩网的网站&am…

拉勾网登录问题

拉钩登录问题&#xff0c;在参考别人的博客后&#xff0c;解决啦 class lagouSpider(CrawlSpider):name lagouallowed_domains [www.lagou.com]start_urls [https://www.lagou.com/]agent "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/" \"537.36 (…

selenium实例登陆拉勾网 外加手动验证验证码

selenium模拟登陆拉钩网 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import os, json, time from urllib import parse from lxml import etree from fake_…

python -- 拉勾网爬虫模拟登录

入门爬虫一段时间&#xff0c;最近在做一个拉勾网的数据爬虫分析&#xff0c;项目也快接近尾声了&#xff0c;于是抽个时间写一下这个项目中遇到的一些问题。 目前拉勾网的反爬虫机制还是可以的&#xff0c;一开始用scrapy shell 分析拉勾网&#xff0c;发现拉勾网要校验usera…

基于Python的拉勾网的模拟登录获取cookie

lagou_login 拉勾网的模拟登录获取cookie&#xff0c;为爬虫做准备, 喜欢的点个赞&#xff0c;谢谢 入门爬虫一段时间&#xff0c;最近在做一个拉勾网的数据爬虫分析&#xff0c;项目也快接近尾声了&#xff0c;于是抽个时间写一下这个项目中遇到的一些问题。 目前拉勾网的反…

selenium模拟登陆拉勾网

初学selenium&#xff0c;尝试了一下模拟登录拉勾网&#xff0c;感觉还挺好玩的 就剩下最后的验证码不会处理了。。。 思路就是在网页代码中找到对应的框的属性进行查询&#xff0c;然后点击、输入就进行了。 之后就会看到Chrome弹出来自动完成一系列动作&#xff0c;感觉很…

如何高效地学习编程语言?

学习编程语言是一种技巧&#xff1a;做好了&#xff0c;你会感受到掌握新事物之后的快感&#xff1b;做不好&#xff0c;就会接二连三的沮丧&#xff0c;甚至放弃。下面我将介绍一些技巧与方法&#xff0c;以便帮助大家高效地学习。 持续测试自己以抵抗胜任力错觉 最不济的学习…

完全零基础,到底该怎样学习编程?

学习编程的过程&#xff0c;大致如下&#xff1a; 看书、看博客、学课程或者看视频等 模仿着书上或者博客的代码&#xff0c;进行复现&#xff0c;复现不重要&#xff0c;思考才是关键 ⚠️ 思考学习别人思路后&#xff0c;脱离书本和博客&#xff0c;完全自己实现功能 自己…

学习编程先学什么?怎么学习编程?

怎么学习编程 随着IT行业的快速发展&#xff0c;现在越来越多的人看中IT行业的前景&#xff0c;很多的人选择IT行业。其中大部分人会选择了学习编程语言&#xff0c;那么&#xff0c;怎么学习编程语言、学习编程先学什么就是人们最常遇到的困难&#xff0c;因此&#xff0c;小编…

我是如何学习编程的

我是如何学编程的 前世因今世果一轮回一回眸理论基础资源选择编程没有捷径合格程度兴趣培养学习时长解决问题推荐资源 学习资源推荐 微信扫码关注公众号 &#xff1a;前端前端大前端&#xff0c;追求更精致的阅读体验 &#xff0c;一起来学习啊关注后发送关键资料,免费获取一整…

骨灰级程序员告诉你,怎样学习编程,才能快速从0基础,变成编程大师

本文章向大家介绍怎样学习编程&#xff0c;才能快速从0基础&#xff0c;变成编程大师&#xff0c;主要包括骨灰级程序员告诉你&#xff0c;怎样学习编程&#xff0c;才能快速从0基础&#xff0c;变成编程大师使用实例、应用技巧、基本知识点总结和需要注意事项&#xff0c;具有…

新手如何学习编程?

文章来源&#xff1a;微信公众号丨代码情缘 这篇文章就和大家简单聊聊&#xff0c;如何学习编程&#xff1f; 2021 年内卷、躺平从一个小圈子话题快速升温为社会话题&#xff0c;其实很多人都想过躺平&#xff0c;那么首先问一下自己&#xff0c;有什么资本躺平&#xff1f; …

想自学编程,先学什么好?给你三个建议,自己斟酌

要学一门编程语言&#xff0c;我们要了解相应的语法规则&#xff0c;大概知道计算机读取代码的逻辑&#xff0c;培养机器思维。 学习编程&#xff0c;最开始应该先了解一下计算机的历史&#xff0c;计算机基础。因为你在编程的时候&#xff0c;你需要让计算机知道你的思维&…