python使用selenium+geckodriver完美爬取使用Ajax技术异步加载的拉勾网(附带selenium爬取BOSS直聘代码)

本文介绍了如何使用selenium和geckodriver来应对拉勾网和BOSS直聘的反爬策略,特别是针对这些网站采用Ajax技术进行异步加载的情况。通过页面分析、下载浏览器驱动,以及展示详细的Python代码,解释了如何模拟浏览器行为获取职位列表和详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

拉勾网的反爬虫做的很好,导致我们使用requests库进行爬取的时候,经常会被发爬虫,包括或返回空数据。同时,这个网站采用Ajax技术进行异步加载,我们在请求列表网页时,并不会获取到职位列表的相关信息,因此,使用selenium+geckodriver的方式,模拟Firefox浏览器完美爬取拉勾网和BOSS直聘的岗位列表及岗位详情。

一、页面分析

进入拉勾网搜索职位网址:https://www.lagou.com/jobs/list_?labelWords=&fromSearch=true&suginput=,然后进入审查元素模式
在这里插入图片描述
在右下方response中,我们并不能找到职位相关信息。

然后,我们查看一个名为positionAjax.json?px=new&needAddtionalResult=false的文件,可以找到相关信息。
在这里插入图片描述
这说明此网站是通过Ajax技术进行异步加载。

二、下载浏览器驱动

因为我用的是Firefox浏览器,因此需要下载Firefox浏览器驱动 geckodriver 。若是使用其他浏览器,需要下载其他浏览器相应的驱动。下载后,将该驱动程序最好放在一个不需要权限的全英文路径的文件夹中,以防后面出错。
在这里插入图片描述

三、详细代码

通过定义类及类方法的方式完成爬虫。以下为具体代码:

# 导入相关库
from selenium import webdriver
from lxml import etree
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import csv

# 创建类
class lagouspider(object):
	# 指定驱动程序位置
    driver_path = r"D:\geckodriver\geckodriver.exe"
    def __init__(self):
    	# 创建驱动器
        self.driver = webdriver.Firefox(executable_path = lagouspider.driver_path)
        # 指定初始URL
        self.url = "https://www.lagou.com/jobs/list_/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput="
        # 创建一个空列表,用于保存爬取下来的信息
        self.positions = []
        # i和j是为了在爬虫时打印信息,无实际意义
        self.i = 0
        self.j = 1

	# 定义run方法
    def run(self):
        print("开始解析第1页")
        self.driver.get(self.url)
        while True:
        	# 获取职位列表网页
            source = self.driver.page_source
            # 传入到parse_list_page函数解析职位列表页
            self.parse_list_page(source)
            # 找到“下一页”按钮
            next_botn = self.driver.find_element_by_xpath("//div[@class='pager_container']/span[last()]")
            # 当下一页不能点击时,停止爬取
            if "pager_next pager_next_disabled" in next_botn.get_attribute("class"):
                break
            else:
            	# 当下一页还能点击时,点击下一页,继续爬取下一页
                next_botn.click()
                self.j += 1
                print("开始解析第{}页".format(self.j))
            time.sleep(1)

	# 定义解析职位列表页函数
    def parse_list_page(self,source):
        html = etree.HTML(source)
        # 获取职位详情页的URL
        links = html.xpath("//a[@class='position_link']/@href")
        for link in links:
            self<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值