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

article/2025/7/11 9:47:15

python成功爬取拉勾网(一个小白的心里路程)

最开始想爬取拉钩是因为半年前上python实验课的时候,老师给了两个任务,一个时爬取糗百的笑话内容,另一个时爬取拉勾网的职位信息,当时因为课时紧张的缘故,老师讲解了关于爬虫的相关的库(requests,BeautifulSoup库等)的基本使用方法,发下了爬取糗百网的源码,让我们自己试一试,说是拉勾网不好爬取,目前的水平不够。疫情在家这几天我基本可以容易的爬取静态网页相关的内容,便想的试试爬取拉钩。

先观察网页源码:
在这里插入图片描述
在这里插入图片描述
很容易从源码看出所有相关的信息都放在li标签的属当中,具体的工资值放在span标签当中

我用直接用原来爬取静态网页的方法直接爬取:

import bs4
import requests
import re
from bs4 import BeautifulSoupurl = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
try:hd = {'user-agent': 'chorme/10'}r = requests.get(url, headers=hd)r.raise_for_status()r.encoding = r.apparent_encodingtext = r.text#print(text)
except:print("")soup = BeautifulSoup(text,'html.parser')
#print(soup.prettify())
'''
salary = re.findall(r'<span class="money">(.*?)</span>',str(text),re.S)
print(salary)
'''for i in soup.find_all('li',attrs={'class':'con_list_item first_row default_list'}):print(i)

代码中很容易看出,我用正则表达式对span标签进行查找,可是有返回的结果,但并不是自己想要的结果,后用soup.findall方式尝试对li标签直接进行查找,但却返回的是空的结果,但之前输出返回的网页源码内容均存在,我想不通是为什么。。。
在这里插入图片描述
在这里插入图片描述
一开始我认为是正则表达式出错,但检查过后并不是这样的错误,我便上网查找大佬们已经成功的案例,发现大佬代码中的headers内容不仅仅只是伪装的了发起请求的浏览器,而且还带了许多我没有见到的方法属性值,我也更换了相同的头部进行了再次尝试。。。

try:hd = {'Accept': 'application/json, text/javascript, */*; q=0.01','Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}r = requests.get(url, headers=hd)r.raise_for_status()r.encoding = r.apparent_encodingtext = r.text#print(text)
except:print("")

出现了这样的错误
在这里插入图片描述
到这里开始我便知道不能轻易的爬取拉钩,我便开始了解拉钩的反爬机制。

常见的反爬虫策略

请求头校验
这应该是最常见最容易解决的反爬虫。python的库自动生成的请求头的’user-agent’里常常带有python这样的关键字,网站一看就发现并不是正常的用户访问,直接拒绝请求。有些网站还会注意请求头里的’referer’这样的属性,所以在构建爬虫的时候,伪装请求头是必须的,尤其是’user-agent’这一项。
cookie校验
有些网站会检验访问的时候携带的cookie,如果是直接向某个指定url发起连接而没有携带上一级网页的cookie,就会拒绝你的访问。
IP校验和设备ID校验
检查访问的IP地址已经是反爬虫的常见手段。当某一个IP频繁访问就会激活网站的反爬虫机制,所以IP池的建立和维护也是爬虫工程师的必修功课。每一个设备都有一个唯一的device-id,部分网站会通过检查频繁访问的设备ID进行反爬虫,当遇到了这样的网站的时候,做设备ID的伪装也是必要的。
通过网页动态加载提高爬取门槛
静态网站一个简单的请求就能拿到所有信息,动态网页加载会让爬虫工程师花更多的精力在网页的分析上。当然,任何网站都是能爬的,只是简单和困难的区别而已。 通过登陆提高爬取门槛很多网站会把信息隐藏起来,只对登陆用户可见,同时大部分网站都会有验证码,以大名鼎鼎的12306的验证码最为著名。同时和登陆一起做反爬虫的还有登陆元素的动态生成,所以熟练的做模拟登录和cookie池的维护也是必须会使用的技能。

这是我查找的反爬资料,拉钩网本身属于动态页面,请求信息返回在json数据格式当中,而且在模拟请求访问的时候,头部信息中不带本页面的cookies信息也无法正确返回所要的内容,其反爬方式囊括可上述所有的基本反爬机制。

按我自己的理解来解析反爬(模仿大佬们的路程加自己的理解)

使用谷歌浏览器来搜索拉勾网,用f12来查看器其网页请求信息等。(只能是谷歌浏览器)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在Network -> XHR -> Headers 中记录了所有头部的信息,包括url链接,data内容,请求方式,cookies等所有相关的内容,可以用这些东西去拼接更加完整的请求头部。

这里附上一个关于谷歌network详解的链接,因为是一位csdn大佬缩写,很详细。
network详解

在Network -> XHR -> Preview中可以找到请求返回的信息,是josn格式
在这里插入图片描述

所以在爬取信息处理时我们可以采用json数据格式来处理数据。在查阅大佬们完成的代码中,可以得出,要想正确的获取请求信息,关键在于cookies,因为拉钩网的反爬机制在设置时头部信息中必须包含本页面所带的cookies信息,需要获取搜索结果那一页的cookie 以及header里面需要添加Accept、Referer、User-Agent。

在对cookise的信息处理时,requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数

尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的时强制登陆,有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求。

在了解了整个后,直接上整个源代码:

import requests
import json
import timeurl_request = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'   #network -> headers中显示的请求链接
url_html = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='   #网页显示访问链接
hd = {'Accept': 'application/json, text/javascript, */*; q=0.01','Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}'''
爬取多页职位信息for i in range(1,6):data = {'first': 'true','pn': 'str(i)','kd': 'python'
}
'''#根据network -> headers显示的data来设置data
data = {'first': 'true','pn': '1','kd': 'python'
}# 创建一个session对象
s = requests.Session()
#发送请求,获得cookies
s.get(url_html,headers = hd,data = data,timeout = 4)
cookie = s.cookies
response = s.post(url_request,data = data,headers = hd,cookies = cookie,timeout = 4) #获得此次文本
#print(response)
response.encoding = response.apparent_encoding
time.sleep(6)
#response.encoding = response.apparent_encoding
#print(response.text)
text = json.loads(response.text)
#print(text)
info = text["content"]["positionResult"]["result"]
for i in info:#print(i)print(i["companyFullName"])companyFullName = i["companyFullName"]print(i["positionName"])positionName = i["positionName"]print(i["salary"])salary = i["salary"]print(i["companySize"])companySize = i["companySize"]print(i["skillLables"])skillLables = i["skillLables"]print(i["createTime"])createTime = i["createTime"]print(i["district"])district = i["district"]print(i["stationname"])stationname = i["stationname"]print("-------------------------")

运行后的结果:
在这里插入图片描述

我自己需要学习的还有很多,还年轻,努力!


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

相关文章

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

爬虫实例二&#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;你需要让计算机知道你的思维&…

微信小程序map组件地图定位当前位置

小程序map组件的应用方式&#xff1a;简单版 wxml: <map id"map" latitude"{{latitude}}" longitude"{{longitude}}" controls"{{controls}}" bindcontroltap"controltap"markers"{{markers}}" bindmarkerta…

Android 开发百度地图定位显示当前位置

Android 开发百度地图定位显示当前位置 配置百度地图-获取 SHA1 找到自己安装 Android SDK 的位置&#xff08;&#xff0c;该位置下面有一个 .android 文件夹&#xff1b;使用 cmd 命令进入该文件夹下&#xff1b;然后执行命令 keytool -list -v -keystore debug.keystore&a…

uniapp获取当前位置(定位-经纬度及城市信息)

uniapp集成方法&#xff0c;跟小程序wx.getLocation不同&#xff0c;可直接获取经纬度及城市信息&#xff08;当然你也可以先获取经纬度再解析成具体城市&#xff09; uni.getLocation({type: wgs84,geocode:true,//设置该参数为true可直接获取经纬度及城市信息success: func…

Android 百度地图定位显示当前位置

配置百度地图 配置百度地图 获取 SHA1 在 Android Studio 中通过命令行获取&#xff0c;步骤如下&#xff1a; 点击左下角的 Terminal进入D:\Android\jre\bin输入指令keytool -list -v -keystore debug.keystore 获取百度地图密钥&#xff08;AK&#xff09; 进入百度地图官网&…