此项目为selenium基础用法
第一步:获取 url
携带地址和 "python"关键词搜索岗位信息
爬取 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,写完,收工