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

article/2025/7/11 9:09:48

1. 明确需求

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

2. 对拉勾网进行简单分析后,发现至少有两种抓取数据的方法:

  1) 通过拉勾首页获取所有职业分类及其对应url,然后对每个职业分类构造url进行翻页,直接从返回html代码中抓取内容

  

 

  2) 通过关键字搜索获取岗位信息,从对应接口抓取信息

  

  这个方法的难点在于cookies处理,可以参考如下博文实现:

  【Python3爬虫】拉勾网爬虫

  Python数据可视化:浅谈拉勾网Python爬虫职位

3. 网络上较多的博文都是介绍方法二,通过接口进行数据抓取。由于拉勾每次访问的cookies都不一致,爬取时需要先访问页面获取cookies再使用获取的cookies访问接口才可以获得数据,相比起方法一更为繁琐(方法一不通过接口,访问页面后即可获得数据),这次就使用方法一来抓取数据。

 

2. 分析页面

1. 首先通过拉勾首页获取每个职位对应的名称及url,可以直接从首页html代码中提取

2. 从首页获取的url点击进入相应职位的列表页,以Java为例。

未发现接口,直接通过列表页返回的html代码进行提取

3. 每个职位只展示最多30页的数据

对应url为:

  第一页:https://www.lagou.com/zhaopin/Java/?filterOption=3

  第二页:https://www.lagou.com/zhaopin/Java/2/?filterOption=3

  第三页:https://www.lagou.com/zhaopin/Java/3/?filterOption=3

测试发现filterOption参数未影响查询结果,因此只需要对url结尾修改数字即可翻页:https://www.lagou.com/zhaopin/Java/页数/

 

3. 编写代码

1. 访问首页获取每个职位对应url

def get_index(index_url):'''通过拉勾首页获取各职位对应名称及url因为对首页只是一次访问即可获取,不做headers/cookies设置'''r = requests.get(index_url)soup_index = BeautifulSoup(r.text, 'lxml')position_list = [] # 保存各职位名称+urlfor each_first in soup_index.select('#sidebar > div > .menu_box'):first_name = each_first.select_one('h2').get_text().strip(' \n') # 第一分类名称for each_second in each_first.select('div.menu_sub.dn > dl'):second_name = each_second.select_one('dt > span').get_text() # 第二分类名称for each_third in each_second.select('dd > a'):third_name = each_third.get_text() # 职位名称third_url = each_third['href'] # 职位urlposition_list.append([first_name, second_name, third_name, third_url])return position_list

2. 使用Session维持会话,访问某个职业分类时使用同一个会话

headers = {'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','Cache-Control': 'max-age=0','Connection': 'keep-alive','DNT': '1','Host': 'www.lagou.com','Upgrade-Insecure-Requests': '1','User-Agent': choose_ua() # 每个职位,随机选择一个User-Agent
}s = requests.Session() # 创建会话
s.headers.update(headers) # 需要设置headers信息,否则返回登陆页面
s.proxies = {                 # 设置ip代理池'HTTP': 'http://110.52.235.241:9999','HTTP': 'http://121.61.1.2:9999'}
s.get('http://www.lagou.com') # session首先访问首页,获得cookies

3. 翻页抓取职位数据

position_info = [] # 保存职位数据
for pn in range(1, 31, 1):r = s.get(positions_url + str(pn) + '/') # 构建url,进行翻页访问time.sleep(random.uniform(1.2, 3.4))if len(r.text)<2000: break # 如果翻页完毕(返回页面长度<2000),退出当前职位的爬取soup_positon = BeautifulSoup(r.text, 'lxml')for each_position in soup_positon.select('#s_position_list > ul > li'):position_id = each_position['data-positionid'] # 职位idposition_salary = each_position['data-salary'] # 薪资position_name = each_position['data-positionname'] # 职位名称position_url = each_position.select_one('.position_link')['href'] # 职位urlposition_area = each_position.select_one('.add > em').get_text() # 工作地点position_publishtime = each_position.select_one('.format-time').get_text() # 发布时间position_requ = each_position.select_one('div.position > div.p_bot > div.li_b_l').get_text().split('\n')[-2] # 职位要求position_desc = each_position.select_one('div.li_b_r').get_text() # 职位描述position_tags = each_position.select_one('div.list_item_bot > div.li_b_l').get_text('/') # 职位tagshr_id = each_position['data-hrid'] # HRidcompany_name = each_position['data-company'] # 供职公司company_id = each_position['data-companyid'] # 公司idcompany_url = each_position.select_one('.company_name > a')['href'] # 公司urlcompany_desc = each_position.select_one('div.industry').get_text().strip() # 公司行业描述position_info.append([position_id, position_salary, position_name, position_url, position_area, position_publishtime, position_requ, position_desc, position_tags, hr_id, company_name, company_id, company_url, company_desc])print(pn, position_name, 'done')

4. 完整代码查看

 https://github.com/snistty/python_spider/blob/master/lagou_spider.py

 

4. 结果查验

因为只是一个小练习,只抓取了四千条数据。将抓取结果保存至excel表,如图

 

 

5. 总结

1. 初期尝试爬取拉勾导致账号被封的主要原因在于:使用个人账号的cookies进行高频访问,被拦截后仍然进行多次尝试

2. 这次爬取成功的原因:

  1) 爬取过程中有设置time.sleep进行延时,避免对对方服务器造成较大压力

  2) 通过session会话维持解决了cookies和referer问题

  3) 访问时有更换User-Agent和代理ip

转载于:https://www.cnblogs.com/xingyucn/p/10391418.html


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

相关文章

用接口登录拉勾网

前段时间一直忙于公司项目的测试工作导致一周多没有撸代码&#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; 进入百度地图官网&…

微信小程序 腾讯地图大头针定位,获取当前地址,地图移动选点,定位当前位置

主要实现功能&#xff1a; a.进入地图界面&#xff0c;会自动获取当前位置&#xff08;用户需授权地理位置权限&#xff09;&#xff0c;并显示省市区在左上角&#xff0c;根据个人需求&#xff0c;我只显示了区 b.大头针实现&#xff0c;拖动地图&#xff0c;大头针都能获取到…

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索"&#xff0c;主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索。该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题。 一. 定位当前位置的原…

Android进阶之路 - 定位当前位置、获取经纬度

最近又遇到定位场景&#xff0c;需要上传经纬度&#xff0c;正好同事写了&#xff0c;我就记录一下方便你我他 ~ ~ 今年开始用的kt比较多&#xff0c;所以篇内用的kt&#xff0c;见谅见谅 前情悉知 获取当前位置时&#xff0c;需要判断用户是否授权&#xff0c;这里用到的是 …