python爬取boss直聘数据(selenium+xpath)

这篇具有很好参考价值的文章主要介绍了python爬取boss直聘数据(selenium+xpath)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、主要目标

以boss直聘为目标网站,主要目的是爬取下图中的所有信息,并将爬取到的数据进行持久化存储。(可以存储到数据库中或进行数据可视化分析用web网页进行展示,这里我就以csv形式存在了本地)

python爬取boss直聘数据(selenium+xpath),笔记,python,selenium,开发语言,网络爬虫

二、开发环境

python3.8
pycharm
Firefox

三、selenium安装和驱动下载

环境安装: pip install selenium

版本对照表(火狐的)
https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html

浏览器驱动下载
https://registry.npmmirror.com/binary.html?path=geckodriver/

火狐浏览器下载
https://ftp.mozilla.org/pub/firefox/releases/

四、主要思路

  1. 利用selenium打开模拟浏览器,访问boss直聘首页(绕过cookie反爬)
  2. 定位搜索按钮输入某职位,点击搜索
  3. 在搜索结果页面,解析出现的职位信息,并保存
  4. 获取多个页面,可以定位跳转至下一页的按钮(但是这个跳转我一直没成功,于是我就将请求url写成了动态的,直接发送一个新的url来代替跳转)

五、代码展示和说明

1、导入相关库

# 用来将爬取到的数据以csv保存到本地
import csv
from time import sleep
# 使用selenium绕过cookie反爬
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.by import By
# 使用xpath进行页面数据解析
from lxml import etree

2、启动浏览器

(有界面)

# 传入浏览器的驱动
ser = Service('./geckodriver.exe')
# 实例化一个浏览器对象
bro = webdriver.Firefox(service=ser)
# 设置隐式等待 超时时间设置为20s
bro.implicitly_wait(20)
# 让浏览器发起一个指定url请求
bro.get(urls[0])

(无界面)

# 1. 初始化配置无可视化界面对象
options = webdriver.FirefoxOptions()
# 2. 无界面模式
options.add_argument('-headless')
options.add_argument('--disable-gpu')

# 让selenium规避被检测到的风险
options.add_argument('excludeSwitches')

# 传入浏览器的驱动
ser = Service('./geckodriver.exe')

# 实例化一个浏览器对象
bro = webdriver.Firefox(service=ser, options=options)

# 设置隐式等待 超时时间设置为20s
bro.implicitly_wait(20)

# 让浏览器发起一个指定url请求
bro.get(urls[0])

3、搜索框定位

进入浏览器,按F12进入开发者模式
python爬取boss直聘数据(selenium+xpath),笔记,python,selenium,开发语言,网络爬虫
然后分析下图可知,搜索框和搜索按钮都有唯一的class值
python爬取boss直聘数据(selenium+xpath),笔记,python,selenium,开发语言,网络爬虫
然后输入搜索内容,并跳转,代码如下

# 定位搜索框 .ipt-search
search_tag = bro.find_element(By.CSS_SELECTOR, value='.ipt-search')
# 输入搜索内容
search_tag.send_keys("")

# 定位搜索按钮    .代表的是当前标签下的class
btn = bro.find_element(By.CSS_SELECTOR, value='.btn-search')
# 点击搜索按钮
btn.click()

创建csv文件

一开始编码为utf-8,但在本地打开内容是乱码,然后改成utf-8_sig就ok了

# f = open("boos直聘.csv", "w", encoding="utf-8", newline="")
f = open("boos直聘.csv", "w", encoding="utf-8_sig", newline="")
csv.writer(f).writerow(["职位", "位置", "薪资", "联系人", "经验", "公司名", "类型", "职位技能", "福利", "详情页"])

招聘页面数据解析(XPATH)

通过分析可知,招聘数据全在ul标签下的li标签中
python爬取boss直聘数据(selenium+xpath),笔记,python,selenium,开发语言,网络爬虫
我们要获取的信息有这些,接下来就要进入li标签中,一个一个去分析
python爬取boss直聘数据(selenium+xpath),笔记,python,selenium,开发语言,网络爬虫
其中职位名称在span标签中,而span标签的class有唯一的值job-name
其它数据分析方式和这个相同
python爬取boss直聘数据(selenium+xpath),笔记,python,selenium,开发语言,网络爬虫
数据解析代码如下

def parse():
    # 临时存放获取到的信息
    jobList = []
    # 提取信息
    page_text = bro.page_source
    # 将从互联网上获取的源码数据加载到tree对象中
    tree = etree.HTML(page_text)
    job = tree.xpath('//div[@class="search-job-result"]/ul/li')
    for i in job:
        # 职位
        job_name = i.xpath(".//span[@class='job-name']/text()")[0]
        # 位置
        jobArea = i.xpath(".//span[@class='job-area']/text()")[0]
        # 联系人
        linkman_list = i.xpath(".//div[@class='info-public']//text()")
        linkman = "·".join(linkman_list)
        # 详情页url
        detail_url = prefix + i.xpath(".//h3[@class='company-name']/a/@href")[0]
        # print(detail_url)
        # 薪资
        salary = i.xpath(".//span[@class='salary']/text()")[0]
        # 经验
        job_lable_list = i.xpath(".//ul[@class='tag-list']//text()")
        job_lables = " ".join(job_lable_list)
        # 公司名
        company = i.xpath(".//h3[@class='company-name']/a/text()")[0]
        # 公司类型和人数等
        companyScale_list = i.xpath(".//div[@class='company-info']/ul//text()")
        companyScale = " ".join(companyScale_list)
        # 职位技能
        skill_list = i.xpath("./div[2]/ul//text()")
        skills = " ".join(skill_list)
        # 福利 如有全勤奖补贴等
        try:
            job_desc = i.xpath(".//div[@class='info-desc']/text()")[0]
            # print(type(info_desc))
        except:
            job_desc = ""
            # print(type(info_desc))
        # print(job_name, jobArea, salary, linkman, salaryScale, name, componyScale, tags, info_desc)
        # 将数据写入csv
        csv.writer(f).writerow(
            [job_name, jobArea, salary, linkman, job_lables, company, companyScale, skills, job_desc, detail_url])
        # 将数据存入数组中
        jobList.append({
            "jobName": job_name,
            "jobArea": jobArea,
            "salary": salary,
            "linkman": linkman,
            "jobLables": job_lables,
            "company": company,
            "companyScale": companyScale,
            "skills": skills,
            "job_desc": job_desc,
            "detailUrl": detail_url,
        })

    return {"jobList": jobList}

总代码

import csv
from time import sleep
from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.common.by import By
from lxml import etree

# 指定url
urls = ['https://www.zhipin.com/', 'https://www.zhipin.com/web/geek/job?query={}&page={}']
prefix = 'https://www.zhipin.com'

# 1. 初始化配置无可视化界面对象
options = webdriver.FirefoxOptions()
# 2. 无界面模式
options.add_argument('-headless')
options.add_argument('--disable-gpu')

# 让selenium规避被检测到的风险
options.add_argument('excludeSwitches')

# 传入浏览器的驱动
ser = Service('./geckodriver.exe')

# 实例化一个浏览器对象
bro = webdriver.Firefox(service=ser, options=options)
# bro = webdriver.Firefox(service=ser

# 设置隐式等待 超时时间设置为20s
# bro.implicitly_wait(20)

# 让浏览器发起一个指定url请求
bro.get(urls[0])

sleep(6)

# 定位搜索框 .ipt-search
search_tag = bro.find_element(By.CSS_SELECTOR, value='.ipt-search')
# 输入搜索内容
search_tag.send_keys("")

# 定位搜索按钮    .代表的是当前标签下的class
btn = bro.find_element(By.CSS_SELECTOR, value='.btn-search')
# 点击搜索按钮
btn.click()
sleep(15)

# f = open("boos直聘.csv", "w", encoding="utf-8", newline="")
f = open("boos直聘.csv", "w", encoding="utf-8_sig", newline="")
csv.writer(f).writerow(["职位", "位置", "薪资", "联系人", "经验", "公司名", "类型", "职位技能", "福利", "详情页"])


def parse():
    # 临时存放获取到的信息
    jobList = []
    # 提取信息
    page_text = bro.page_source
    # 将从互联网上获取的源码数据加载到tree对象中
    tree = etree.HTML(page_text)
    job = tree.xpath('//div[@class="search-job-result"]/ul/li')
    for i in job:
        # 职位
        job_name = i.xpath(".//span[@class='job-name']/text()")[0]
        # 位置
        jobArea = i.xpath(".//span[@class='job-area']/text()")[0]
        # 联系人
        linkman_list = i.xpath(".//div[@class='info-public']//text()")
        linkman = "·".join(linkman_list)
        # 详情页url
        detail_url = prefix + i.xpath(".//h3[@class='company-name']/a/@href")[0]
        # print(detail_url)
        # 薪资
        salary = i.xpath(".//span[@class='salary']/text()")[0]
        # 经验
        job_lable_list = i.xpath(".//ul[@class='tag-list']//text()")
        job_lables = " ".join(job_lable_list)
        # 公司名
        company = i.xpath(".//h3[@class='company-name']/a/text()")[0]
        # 公司类型和人数等
        companyScale_list = i.xpath(".//div[@class='company-info']/ul//text()")
        companyScale = " ".join(companyScale_list)
        # 职位技能
        skill_list = i.xpath("./div[2]/ul//text()")
        skills = " ".join(skill_list)
        # 福利 如有全勤奖补贴等
        try:
            job_desc = i.xpath(".//div[@class='info-desc']/text()")[0]
            # print(type(info_desc))
        except:
            job_desc = ""
            # print(type(info_desc))
        # print(job_name, jobArea, salary, linkman, salaryScale, name, componyScale, tags, info_desc)
        # 将数据写入csv
        csv.writer(f).writerow(
            [job_name, jobArea, salary, linkman, job_lables, company, companyScale, skills, job_desc, detail_url])
        # 将数据存入数组中
        jobList.append({
            "jobName": job_name,
            "jobArea": jobArea,
            "salary": salary,
            "linkman": linkman,
            "jobLables": job_lables,
            "company": company,
            "companyScale": companyScale,
            "skills": skills,
            "job_desc": job_desc,
            "detailUrl": detail_url,
        })

    return {"jobList": jobList}


if __name__ == '__main__':
    # 访问第一页
    jobList = parse()
    query = ""
    # 访问剩下的九页
    for i in range(2, 11):
        print(f"第{i}页")
        url = urls[1].format(query, i)
        bro.get(url)
        sleep(15)

        jobList = parse()

    # 关闭浏览器
    bro.quit()

效果展示

python爬取boss直聘数据(selenium+xpath),笔记,python,selenium,开发语言,网络爬虫

六、总结

不知道是boss反爬做的太好,还是我个人太菜(哭~)
我个人倾向于第二种
这个爬虫还有很多很多的不足之处,比如在页面加载的时候,boss的页面会多次加载(这里我很是不理解,我明明只访问了一次,但是他能加载好多次),这就导致是不是ip就会被封…
再比如,那个下一页的点击按钮,一直点不了,不知有没有路过的大佬指点一二(呜呜呜~)
python爬取boss直聘数据(selenium+xpath),笔记,python,selenium,开发语言,网络爬虫

# 下一页标签定位 ui-icon-arrow-right
next_tag = bro.find_element(By.CSS_SELECTOR, value='.ui-icon-arrow-right')
# action = ActionChains(bro)
# # 点击指定的标签
# action.click(next_tag).perform()
# sleep(0.1)
# # 释放动作链
# action.release().perform()

总之boss的信息爬取,我还是无法做到完全自动化😭文章来源地址https://www.toymoban.com/news/detail-725257.html

到了这里,关于python爬取boss直聘数据(selenium+xpath)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】Selenium自动投简历(Boss直聘、猎聘、拉勾、51job)

    项目地址:https://github.com/loks666/get_jobs 第一步:配置Chrome(需和diver版本一致) driver目前已放进根目录,版本号是:122.0.6261.112,Chrome需要更新到最新版本。 若后面发生升级,请自行下载对应版本的driver driver下载链接:https://googlechromelabs.github.io/chrome-for-testing 例:你的路径是:

    2024年04月16日
    浏览(28)
  • 爬虫与数据分析项目实战2.1 Selenium爬取Boss招聘信息

    完成: 1.爬取信息 2.基于爬取结果筛选符合条件的信息    岗位名称、薪资、岗位要求、地区、公司名称、公司规模、细节链接 3.筛选base杭州的岗位保存到csv文件中 But容易出现网络不稳定造成的无法定位元素所在位置的情况,小范围爬取可以 4.基于csv分析后续

    2024年02月08日
    浏览(44)
  • 28 | Boss直聘数据分析

    针对boss直聘网的招聘信息,然后分析互联网发展排名前十的城市在互联网方面职位的薪水,学历要求,经验要求,等等信息。 准备从以下几个方面进行分析: (1)各个城市的平均工资 (2)各个学历的平均工资 (3)各个岗位的平均工资 (4)不同工作经验要求的工资 (5)

    2024年02月12日
    浏览(41)
  • 爬虫项目实战2.1 Selenium爬取Boss招聘信息

    完成: 1.爬取信息 2.基于爬取结果筛选符合条件的信息    岗位名称、薪资、岗位要求、地区、公司名称、公司规模、细节链接 3.筛选base杭州的岗位保存到csv文件中 But容易出现网络不稳定造成的无法定位元素所在位置的情况,小范围爬取可以 4.基于csv分析后续

    2024年02月05日
    浏览(46)
  • BOSS直聘招聘经验

    招聘低端兼职岗位。流量很大,来的人通常实力也不足。 招聘高端兼职岗位。流量不多。来的人通常具备一定实力。 招聘高薪职位,流量一般,会有有实力的勾搭。 招聘低薪职位,流量一般。通常没什么实力。

    2024年02月21日
    浏览(45)
  • 【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片

    个人主页 :为梦而生~ 关注我一起学习吧! 专栏 :python网络爬虫从基础到实战 欢迎订阅!后面的内容会越来越有意思~ 往期推荐 : 【Python爬虫开发基础⑦】urllib库的基本使用 【Python爬虫开发基础⑧】XPath库及其基本用法 我们在之前已经有8篇文章讲述基础知识了,下面我们

    2024年02月11日
    浏览(66)
  • selenium+xpath爬取二手房标题

    贝壳找房标题爬取需要注意的是,在页面中间有一个小广告 而他就在ul的li下面,当我们进行title所以输出时,会报错。 所以在进行页面解析之前必须把广告叉掉,不然也把广告那一部分的li给爬取下来了 所以,我们,定位到上面箭头那里,进行 x掉,也就是利用click事件进行

    2024年01月20日
    浏览(56)
  • BOSS直聘自动投简历聊天机器人的实现过程

            这两年疫情,公司业务越来越差,必须得准备后路了,每天睡前都会在直聘上打一遍招呼,一直到打哈欠有睡意为止...,这样持续了一周,发现很难坚持,身为一名资深蜘蛛侠,怎么能这样下去呢?于是便萌生了对BOSS下手的念头。         boss的web端功能已经挺完

    2023年04月22日
    浏览(30)
  • Python网页爬虫爬取豆瓣Top250电影数据——Xpath数据解析

    1.1 查看原页面信息 首先打开豆瓣Top250电影页面,其网址是:https://movie.douban.com/top250。 可以发现,该页面展示的电影信息有中英文电影名、导演、主演、上映年份、国籍、电影类型、评分等。 下滑到页面底部,发现第一页有25部电影的数据,并且可以点击页码数实现页面跳转

    2024年02月05日
    浏览(50)
  • Python爬虫实战——Lazada商品数据(selenium自动化爬虫,xpath定位)

            在此说明,这个项目是我第一次真正去爬的一个网站,里面写的代码我自己都看不下去,但是已经不想花时间去重构了,所以看个乐呵就好,要喷也可以(下手轻一点)。这篇文算是记录我的学习中出现的一些问题,不建议拿来学习和真拿我的代码去爬Lazada的数据,

    2024年02月02日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包