python爬虫之爬取拉勾网

article/2025/7/11 10:30:08

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

招聘求职信息-招聘网站-人才网-拉勾招聘 (lagou.com)https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=先把前面代码写好  

思路嘛大概就是  获取主页的源代码——从中获取详情页的url——在去解析 先围绕这三步来写

这里我们已经获取到了主页的源代码 

from selenium import webdriver
import requests
from selenium.webdriver import ChromeOptions   #这个包用来规避被检测的风险
from lxml import etree
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import reclass lagouSpitder(object):option = webdriver.ChromeOptions()option.add_experimental_option('useAutomationExtension', False)option.add_experimental_option('excludeSwitches', ['enable-automation'])driver_path = r'驱动路径'  # 定义好路径def __init__(self):self.driver=webdriver.Chrome(executable_path=lagouSpitder.driver_path,options=lagouSpitder.option)#初始化路径+规避检测selenium框架self. driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})self.url='https://www.lagou.com/jobs/list_python/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput='self.positions=[]def run(self):  #主页面self.driver.get(self.url)source = self.driver.page_source  # source页面来源  先获取一页if __name__ == '__main__':spider=lagouSpitder()   spider.run()

接下来获取详情页的url,定义一个函数parse_list_page 显得美观可维护也强,可以看到 是在//a[@class="position_link"]里面的href属性里面,获取到了我们在去请求这个url一样是定义一个函数request_detall_page 

    def parse_list_page(self,source):  #获取职位详情页urlhtml=etree.HTML(source)links=html.xpath('//a[@class="position_link"]/@href')for link in links:self.request_detall_page(link)time.sleep(2)def request_detall_page(self,url):  #去请求细节页面 self.driver.get(url)source=self.driver.page_source  #source页面来源

接下来我们去解析详情页即可 定义函数 pares_detail_page 这里就不细说了怎么解析获取了大家肯定都会,后面我要说一下具体的优化

    def pares_detail_page(self,source): #获取职位细节信息html=etree.HTML(source)Position_name=html.xpath('//span[@class="position-head-wrap-position-name"]/text()')[0] #职位名字salary=html.xpath('//span[@class="salary"]/text()')[0] #薪水Position_the_temptation=html.xpath('//dd[@class="job-advantage"]/p/text()')[0]   #职位诱惑Job_description=html.xpath('//div[@class="job-detail"]/text()')  #职位详情Job_description=''.join(html.xpath('//div[@class="job-detail"]/text()')).strip()   #拼接work_address=html.xpath('//div[@class="work_addr"]/text()')[3] #工作地址CompanyName = html.xpath('//h3[@class="fl"]/em/text()')[0]  # 公司名字Company_Basic_Information=html.xpath('//li/h4/text()')  #公司基本信息position={'职位名字':Position_name,'薪水':salary,'职位诱惑':Position_the_temptation,'职位详情':Job_description,'工作地址':work_address,'公司名字': CompanyName,'公司基本信息':Compnya_Basic_Information,}self.positions.append(position)time.sleep(5)

 这样其实我们就已经写完了这个程序,不过这只能获取第一页对吧,我们肯定不只爬取第一页的所以就要进行优化

网站是通过点击下一页翻页,那么我们先获取到下一页的元素 

 获取到元素我们可以写个循环嘛,让他解析完一页之后去点击下一页,那什么时候停止呢?可以看到我们点击第三十页的时候 它的class是不是就变了呀我们写个判断语句当它class=pager_next pager_next_disabled 这个的时候我们就停止否则就继续点击,这里也要一起写一个显示等待我爬取的时候就有几次因为这个没有加载出来导致报错

    def run(self):  #主页面self.driver.get(self.url) #去请求主页面while True:source = self.driver.page_source  # source页面来源  先获取一页WebDriverWait(driver=self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//span[@action="next"]')))  #等待按钮加载出来,避免没加载出来就点击导致的报错self.parse_list_page(source)  # 获取这一页职位urlnext_btn = self.driver.find_element_by_xpath('//span[@action="next"]')#下一页的元素位置if "pager_next pager_next_disabled" in next_btn.get_attribute('class'):  # 如果class等于最后一页则停止,否则继续点击breakelse:next_btn.click() #点击下一页time.sleep(1)

 接下来我们还得新开窗口,为什么呢详情页哪里来的下一页按钮这不得报错呀

 def request_detall_page(self,url):  #去请求细节页面# self.driver.get(url)self.driver.execute_script("window.open('%s')"%url)  #新打开一个职位页面self.driver.switch_to_window(self.driver.window_handles[1]) #切换到当前页面来解析,不切换的话selenium会停留在上一页source=self.driver.page_source  #source页面来源self.pares_detail_page(source)   #解析页面self.driver.close()   #解析完关闭页面time.sleep(0.5)self.driver.switch_to_window(self.driver.window_handles[0]) #切换回主页面

我们来看下效果,也是没有问题呀

 

 全部源代码如下

from  selenium import webdriver
import requests
from lxml import etree
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import re
import random  #随机模块class lagouSpitder(object):option = webdriver.ChromeOptions()option.add_experimental_option('useAutomationExtension', False)option.add_experimental_option('excludeSwitches', ['enable-automation'])driver_path = r'驱动路径'  # 定义好路径def __init__(self):self.driver=webdriver.Chrome(executable_path=lagouSpitder.driver_path,options=lagouSpitder.option)#初始化路径+规避检测selenium框架self. driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})self.url='https://www.lagou.com/jobs/list_python/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput='self.positions=[]def run(self):  #主页面self.driver.get(self.url) #去请求主页面while True:source = self.driver.page_source  # source页面来源  先获取一页WebDriverWait(driver=self.driver,timeout=10).until(EC.presence_of_element_located((By.XPATH,'//span[@action="next"]')))  #等待按钮加载出来,避免没加载出来就点击导致的报错self.parse_list_page(source)  # 解析完获取的这一页职位之后,去点击下一页next_btn = self.driver.find_element_by_xpath('//span[@action="next"]')#下一页的元素位置if "pager_next pager_next_disabled" in next_btn.get_attribute('class'):  # 如果class等于最后一页则停止,否则继续点击breakelse:next_btn.click() #点击下一页time.sleep(1)def parse_list_page(self,source):  #获取职位详情页urlhtml=etree.HTML(source)links=html.xpath('//a[@class="position_link"]/@href')for link in links:    #循环去解析详情页self.request_detall_page(link)time.sleep(random.uniform(1, 3))#随机暂停def request_detall_page(self,url):  #去请求细节页面# self.driver.get(url)self.driver.execute_script("window.open('%s')"%url)  #新打开一个职位页面self.driver.switch_to_window(self.driver.window_handles[1]) #切换到当前页面来解析,不切换的话selenium会停留在上一页source=self.driver.page_source  #source页面来源self.pares_detail_page(source)   #解析页面self.driver.close()   #解析完关闭页面time.sleep(0.5)self.driver.switch_to_window(self.driver.window_handles[0]) #切换回主页面def pares_detail_page(self,source): #获取职位细节信息html=etree.HTML(source)Position_name=html.xpath('//span[@class="position-head-wrap-position-name"]/text()')[0] #职位名字salary=html.xpath('//span[@class="salary"]/text()')[0] #薪水Position_the_temptation=html.xpath('//dd[@class="job-advantage"]/p/text()')[0]   #职位诱惑Job_description=html.xpath('//div[@class="job-detail"]//text()')  #职位详情# Job_description=re.sub(r'[\s/]','',Job_description)desc=''.join(html.xpath('//div[@class="job-detail"]//text()')).strip()   #拼接work_address=html.xpath('//div[@class="work_addr"]//text()')[3] #工作地址CompanyName = html.xpath('//h3[@class="fl"]/em/text()')[0]  # 公司名字Company_Basic_Information=html.xpath('//li/h4/text()')  #公司基本信息position={'职位名字':Position_name,'薪水':salary,'职位诱惑':Position_the_temptation,'职位详情':Job_description,'工作地址':work_address,'公司名字': CompanyName,'公司基本信息':Company_Basic_Information,}self.positions.append(position)print(position)print('='*40)if __name__ == '__main__':spider=lagouSpitder()spider.run()

对了还有一件事~看完觉得可以的话点个赞吧,切莫白嫖 

至此程序就全部写完啦 

声明

本文仅限于做技术交流学习,请勿用作任何非法用途!


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

相关文章

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

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

用接口登录拉勾网

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

拉勾网登录问题

拉钩登录问题,在参考别人的博客后,解决啦 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 -- 拉勾网爬虫模拟登录

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

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

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

selenium模拟登陆拉勾网

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

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

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

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

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

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

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

我是如何学习编程的

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

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

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

新手如何学习编程?

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

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

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

微信小程序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总时为空值的问题。 一. 定位当前位置的原…