python用selenium爬取boss直聘岗位信息(附完整源码)

此项目为selenium基础用法

第一步:获取 url
携带地址和 "python"关键词搜索岗位信息

点击跳转boss官网

在这里插入图片描述
爬取 boss直聘是需要携带登录信息的,可以自己登录后,上图url区域往下滑,就可找到 cookies 复制全部装进headers即可,而我使用selenium自带的 get_cookies() 现场获取

第二步:获取cookies
我选择另外建一个文件获取 cookies(getcookies.py) ,因为在获取信息的文件中会不断运行看结果(get_boss_data.py),不可能一直获取cookies吧,而且要手动登录;

获取登录信息代码如下

getcookies.py (完整代码)

from selenium import webdriver
import time
import json

# 填写webdriver的保存目录
driver = webdriver.Edge()

driver.get('https://www.zhipin.com/web/geek/job?query=python&city=101300100')

# 程序打开网页后60秒内 “你自己手动登陆账户”
time.sleep(60)

with open('cookies.txt','w') as f:
    # 将 cookies 保存为 json 格式
    f.write(json.dumps(driver.get_cookies()))

driver.close()

首先是调用 edge 驱动操作(有的用谷歌,反正看自己喜欢就好),然后用 get 方法请求 url ,然后然后会打开 boss 官网,60秒内自己手动登录,因为这里等待60秒,我将获取到的 cookies 写入一个文件,这样就不用一直获取来用

爬取的代码如下:

get_boss_data.py (完整代码)

from selenium.webdriver.common.by import By

from selenium import webdriver
import json
import pandas as pd
import time

driver = webdriver.Edge()

# url
driver.get('https://www.zhipin.com/web/geek/job?query=python&city=101300100')

# 清除cookies
driver.delete_all_cookies()

with open('cookies.txt','r') as f:
    cookies_list = json.load(f)

    for cookie in cookies_list:
        if isinstance(cookie.get('expiry'), float):
            cookie['expiry'] = int(cookie['expiry'])
        driver.add_cookie(cookie)

time.sleep(10)

tags_li = driver.find_elements(by=By.XPATH, value="//li[@class='job-card-wrapper']")

time.sleep(15)

job_data = []

for li in tags_li:
    title_tag = li.find_elements(By.CSS_SELECTOR, ".job-name")  # 标题
    area_tag = li.find_elements(By.CSS_SELECTOR, ".job-area-wrapper")  # 地区
    salary_tag = li.find_elements(By.CSS_SELECTOR, ".salary")  # 工资
    name_tag = li.find_elements(By.CSS_SELECTOR, ".company-name")  # 公司名称
    desc_tag = li.find_elements(By.CSS_SELECTOR, ".info-desc")  # 详情

    job_title = [i.text for i in title_tag]
    job_area = [x.text for x in area_tag]
    job_salary = [x.text for x in salary_tag]
    job_name = [x.text for x in name_tag]
    job_desc = [x.text for x in desc_tag]

    print(job_title,job_area,job_salary,job_name,job_desc)
    dict = {
        '岗位': job_title,
        '地址': job_area,
        '工资': job_salary,
        '公司名称': job_name,
        '详情': job_desc,
    }
    job_data.append(dict)
df = pd.DataFrame(job_data)
df.to_excel('boss直聘爬虫.xlsx', index=False)

 #  休眠10秒
time.sleep(10)

# 关闭浏览器
driver.close()
driver.quit()


详细讲解:

导入用到的库

from selenium.webdriver.common.by import By

from selenium import webdriver
import json
import pandas as pd
import time

用 get 请求url,并且清除已有的 cookies

driver = webdriver.Edge()

# url
driver.get('https://www.zhipin.com/web/geek/job?query=python&city=101300100')

# 清除 cookies
driver.delete_all_cookies()

加载完网站后将 cookies 返回去给网站

with open('cookies.txt','r') as f:
    cookies_list = json.load(f)

    for cookie in cookies_list:
        if isinstance(cookie.get('expiry'), float):
            cookie['expiry'] = int(cookie['expiry'])
        driver.add_cookie(cookie)

然后需要等待 10秒,怕网速不好未完成网页加载,后续代码定位不到元素后报错

# 定位元素
tags_li = driver.find_elements(by=By.XPATH, value="//li[@class='job-card-wrapper']")

time.sleep(15)

如何定位,怎么选元素,请看下图
在这里插入图片描述
其中,代码 by=By.XPATH 的意思就是用 xpath 方法,也有其他方法,比如 css 的等等,感兴趣可以自己去学,然后我们看看定位这个元素我们能得到什么信息,value=“//li[@class=‘job-card-wrapper’]” 就是定位所有 li 中, class 为 job-card-wrapper的,结果看下图

在这里插入图片描述

跟据上图我们可以看到,我们拿到好多 li 的数据,接下来就需要把他们遍历出来

for li in tags_li:
    title_tag = li.find_elements(By.CSS_SELECTOR, ".job-name")  # 标题
    area_tag = li.find_elements(By.CSS_SELECTOR, ".job-area-wrapper")  # 地区
    salary_tag = li.find_elements(By.CSS_SELECTOR, ".salary")  # 工资
    name_tag = li.find_elements(By.CSS_SELECTOR, ".company-name")  # 公司名称
    desc_tag = li.find_elements(By.CSS_SELECTOR, ".info-desc")  # 详情

    job_title = [i.text for i in title_tag]
    job_area = [x.text for x in area_tag]
    job_salary = [x.text for x in salary_tag]
    job_name = [x.text for x in name_tag]
    job_desc = [x.text for x in desc_tag]

    print(job_title,job_area,job_salary,job_name,job_desc)
    dict = {
        '岗位': job_title,
        '地址': job_area,
        '工资': job_salary,
        '公司名称': job_name,
        '详情': job_desc,
    }
    job_data.append(dict)

这里的 By.CSS_SELECTOR 就是通过 css 定位获取,如下图
在这里插入图片描述
至于 以下代码是什么意思

    job_title = [i.text for i in title_tag]
    job_area = [x.text for x in area_tag]
    job_salary = [x.text for x in salary_tag]
    job_name = [x.text for x in name_tag]
    job_desc = [x.text for x in desc_tag]

Selenium WebDriver 找到的两个 WebElement 对象的字符串表示,每个 WebElement 对象都包含了一个 session ID 和一个element ID ,这些是 WebDriver 用来在内部标识和定位页面上特定元素的,想要获取文本信息,需要再次进行遍历,而这里我们用推导式来遍历,这样不会显得代码很多,难懂

接下来就是保存文件,先定义一个空列表,然后将数据放进去,接着将这个列表转换为 DataFrame类型,再导出

job_data = []
dict = {
    '岗位': job_title,
    '地址': job_area,
    '工资': job_salary,
    '公司名称': job_name,
    '详情': job_desc,
}
job_data.append(dict)
df = pd.DataFrame(job_data)
df.to_excel('boss直聘爬虫.xlsx', index=False)

然后,输出结果如下:
在这里插入图片描述
这个照片得 dict 集合我没改,还是两个字段,没关系,上面完整代码是全的,这里我懒得再截图了就这样了
这个也是初学爬虫的小项目,练练手还是可以的

ok,写完,收工

  • 18
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值