拉勾网Python爬虫:Selenium+Xpath 反反爬、免登录获取全部职位详情

需求描述

抓取「拉勾网」『北京 数据分析师』30页职位详情数据存入 MySQL 数据库

需求分析

  1. 拉勾网搜索页面一般都只展示30页、每页15个职位信息,约450条;
  2. 拉勾网反爬加强,直接请求 positionAjax.json 无法获得包含职位信息的 json 数据(提示:“msg”:“您操作太频繁,请稍后再访问”),浏览器都无法访问,延长间隔时间也无济于事,转而考虑 selenium 来实现。

实现原理

  1. selenium浏览器自动化测试框架驱动谷歌浏览器,模拟人使用浏览器查看网页的过程获取数据;
  2. 先请求搜索页面解析得到职位详情页的 url,再进入详情页获取全部所需的详情;
  3. 不过职位详细信息需要逐一解析html获取(麻烦),不如json数据那般可直接提取(容易)。

注意问题

  1. 搜索页和详情页请求过快便会跳出来登录页面,需要适当延长间隔时间(尤其是连续请求详情页),尽可能模拟人的行为;
  2. 连续请求10个详情页就会弹出登录页(实测手动在浏览器中操作也是),每请求10个需要重启一次浏览器(不重启则一直弹出登录);
  3. 因需要尽可能模拟人在操作浏览器,间隔时间较多、耗时较长,请耐心等待。
  4. 本文使用的谷歌浏览器,需要提前下载 chromedriver.exe 放入工作目录。
  5. 本例直接生成 sql 文件 以导入MySQL数据库(source xxx.sql),下一篇文章会用 pymysql 模块直接存入数据库 → 看这里

URL示例

搜索页示例:https://www.lagou.com/jobs/list_数据分析师?city=北京&cl=false&fromSearch=true&labelWords=&suginput=
详情页示例:https://www.lagou.com/jobs/5496895.html

完整代码

"""
抓取拉勾网“北京”“数据分析师”30页职位详情数据存入MySQL数据库
@Author: Newyee
@Python: 3.6.5
@selenium: 3.141.0
@Chrome: 72.0.3626.81
"""

# 导入相关模块(未安装可执行 pip install xxx 命令安装)
from selenium import webdriver
from lxml import etree
import random
import time


# 创建类
class LagouSpider():

    def __init__(self):
        # 初始化类实例时打开谷歌浏览器(可查看测试过程)
        self.driver = webdriver.Chrome()
        # 搜索页面的url
        self.url = "https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88?city=%E5%8C%97%E4%BA%AC&cl=false&fromSearch=true&labelWords=&suginput="
        # 存放所有职位详情页的url
        self.all_links = []

    def run2(self, ten_links):
        '''
        每次对10个职位详情url请求并解析,保存职位详细信息,退出浏览器
        :param ten_links: 10个职位详情页url组成的list
        :return:
        '''
        # 遍历每个detail_url
        for link in ten_links:
            # 调用request_detail_page请求并解析
            self.request_detail_page(link)
            # 随机间隔3-6s,避免反爬
            time.sleep(random.randint(3, 6))
        # 获取10个职位信息后退出浏览器
        self.driver.quit()

    def run1(self):
        '''
        打开搜索页面,并循环翻页至最后一页,解析html获得all_detail_links
        :return:
        '''
        # 在当前打开的浏览器中加载页面
        self.driver.get(self.url)
        # 用于记录当前是第几页
        count_page = 1
        # 循环翻页直到最后一页
        while True:
            # 获取当前页的网页源代码
            source = self.driver.page_source
            # 利用xpath解析source获得detail_links并保存到
            self.get_all_d
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值