使用selenium爬取拉勾网全国python职位信息

selenium做的爬虫一般很稳定,很难被发现,爬取一些做有反爬措施的网站是个不错的选择,但是对于反爬措施很厉害的网站还是会被发现的,可能要添加随机代理,还有随机延迟。

拉钩网的反爬做的很厉害,做这个之前我试过快速的点击下一页下一页,十次后就需要你登录才能查看了,这反爬做的。

不多说,下面是完整的爬虫代码
from selenium import webdriver   # 浏览器
from lxml import etree  # 提取数据
import time  # 请求延迟
import re  # 美化数据
import json  # 保存数据
import random  # 请求随机延迟的时间

'''
爬取拉钩网python职位信息
'''

def main():
    # 使用代理,防止自己电脑IP被封(使用的是免费的代理,所以很不稳定)
    agency = webdriver.ChromeOptions()
    agency.add_argument("--proxy-server=http://123.169.124.166:9999")

    # 实例化一个浏览器驱动,这里使用谷歌的驱动(注意:chromedriver要跟你电脑上安装的谷歌浏览器版本一致,否则报错)
    g_driver = webdriver.Chrome(options=agency)

    # 最先打开的网址
    start_url = "https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput="
    # 打开网址
    g_driver.get(url=start_url)
    g_driver.find_element_by_xpath('//div[@class="body-btn"]').click()  # 关闭广告弹窗

    while True:
        # 提取所有职位的链接,得到一个url列表
        url_list = g_driver.find_elements_by_xpath('//a[@class="position_link"]//h3')
        for detail_url in url_list:
            time.sleep(random.randint(2, 5))  # 随机等待几秒

            # 点击链接进入职位详情页(点击后会打开一个新的窗口)
            detail_url.click()
            # 切换到新的窗口
            handle = g_driver.window_handles
            g_driver.switch_to.window(handle[1])

            # 提取详情页的数据
            html = etree.HTML(g_driver.page_source)
            # 信息用字典存储
            item = {}
            # 职位
            item["职位"] = html.xpath('//h1[@class="name"]/text()')[0]
            item["公司"] = [i.strip() for i in html.xpath('//em[@class="fl-cn"]/text()')][0]
            item["发布时间"] = re.sub(r'\xa0', '', html.xpath('//p[@class="publish_time"]/text()')[0])  # 随便用正则替换一下字符

            job_detail = html.xpath('//dd[@class="job_request"]/h3//span/text()')
            job_detail = [i.strip("/") for i in job_detail]  #去掉两边斜杠
            item["工作要求"] = [i.strip() for i in job_detail]  #去掉两边空格

            job_detail = html.xpath('//div[@class="job-detail"]//text()')
            job_detail = [i.strip() for i in job_detail]   #去掉两边空格
            item["岗位详情"] = [i for i in job_detail if len(i) > 0]  # 去掉空字符串
            print(item)

            # 存储到文件
            with open("lagou.json", "a", encoding="utf-8") as f:
                json.dump(item, f, ensure_ascii=False)
                f.write("\n")

            # 关闭当前窗口并且定位到第一个窗口,不然会报错
            g_driver.close()
            g_driver.switch_to.window(handle[0])

        # 点击下一页
        # 先判断是否还有下一页
        if g_driver.find_element_by_xpath('//span[@action="next"]').get_attribute("class") != "pager_next pager_next_disabled":
            g_driver.find_element_by_class_name("pager_next ").click()
            time.sleep(2)  # 等待页面加载完成(我电脑网络慢)
        else:
            break

    # g_driver.close()

if __name__ == '__main__':
    main()

运行截图
在这里插入图片描述
如果请求的太快还是会被发现,最开始弄了每次请求延迟1秒,请求十几次就被发现了,然后弄了随机请求延迟2~5秒,能得到多点数据,要能得到更多数据还有设置随机代理,而我做了没有弄,免费的代理不好,收费的代理我又不想花钱(狗头),只能弄请求延迟长点了。

下面是保存好的数据.json
在这里插入图片描述

最后说一下,selenium做的爬虫比较稳定,提取的数据就是浏览器里Elements的数,不用去Network里看看是不是这个请求地址,不用去分析js生成的数据,如何你网络慢的话就要设置一下等待时间,不然还没页面还没加载完就提取数据会报错。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值