selenium也可用于爬虫,有时它比request库要强,这里我们就爬取boos招聘网站,爬过的同学就知道boos的反爬很难,如果不是大佬级别的人,很难攻克它的反爬机制,boos的cookie好像是每隔几分钟就失效,它一直在变,非常的烦,使用selenium能很好的绕过他的这个反爬机制。
这里可能有一些地方表达不是太清楚或者有误,还请多多包涵
首先安装selenium库
pip install selenium
查看自己电脑上的浏览器版本
谷歌浏览器:设置 -> 关于Chrome就可以看到谷歌浏览器的版本
接下来就需要下载自己电脑上所对应的浏览器版本,下面是下载链接
如果在下载过程中有什么疑问的可在留言区问我
把下载好的浏览器驱动放在py文件同级目录下
1、导入所需要的模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import csv
2、打开浏览器
# 打开谷歌驱动
driver = webdriver.Chrome()
# 打开火狐驱动, 下载的是哪个驱动就用所对应的驱动名打开,这里我使用的是谷歌
# driver = webdriver.Firefox()
# 输入需要搜索的网址,这里直接输入boos的首页网址,也可以根据自己的需要来输入对应的网址,修改括号中的网址即可
driver.get("https://www.zhipin.com/")
3、在输入框中输入想要搜索的内容
F12检查,用小箭头定位到输入框,查看input的class属性值
定位一个元素 | 定位多个元素 | 含义 |
---|---|---|
find_element_by_id | find_elements_by_id | 通过元素id定位 |
find_element_by_name | find_elements_by_name | 通过元素name定位 |
find_element_by_xpath | find_elements_by_xpath | 通过xpath表达式定位 |
find_element_by_link_text | find_elements_by_link_tex | 通过完整超链接定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通过部分链接定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通过标签定位 |
find_element_by_class_name | find_elements_by_class_name | 通过类名进行定位 |
find_elements_by_css_selector | find_elements_by_css_selector | 通过css选择器进行定位 |
send_keys()是模拟键盘输入
find_element_by_css_selector()就是类似于把鼠标放到某处,这里是把鼠标放到输入框中。
# 输入搜索内容
driver.find_element_by_css_selector(".ipt-search").send_keys("python")
全自动,不需要自己输入
4、查看搜索内容
# # 模拟回车键
driver.find_element_by_css_selector(".ipt-search").send_keys(Keys.ENTER)
这里需要设置 driver.implicitly_wait(10) 等待10秒, 否则会报错。
# implicitly_wait(): 隐式等待
# 当使用了隐士等待执行测试的时候,如果
# WebDriver没有在
# DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常
# 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找
# DOM,默认的时间是0
# 一旦设置了隐式等待,则它存在整个
# WebDriver
# 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,
# 它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
driver.implicitly_wait(10)
拿到属性名为job-list下面的每一个li,这里需要注意elements是加s的,因为是获取多个所以需要加s,如果是单个就直接使用element即可。
lis = driver.find_elements_by_css_selector(".job-list li")
print(lis)
这里我们爬取下图中圈起来的信息
for li in lis:
# print(li)
title = li.find_element_by_css_selector(".job-name").text #岗位名称
位置 = li.find_element_by_css_selector(".job-area").text
薪资 = li.find_element_by_css_selector(".red").text
经验 = li.find_element_by_css_selector(".job-limit p").text
company = li.find_element_by_css_selector(".company-text .name a").text #公司名称
commpany_type = li.find_element_by_css_selector(".company-text p a").text #公司分类
print(title, 位置, 薪资, 经验, company, commpany_type)
接下来就是保存信息,我使用的是csv保存,在导入库的代码后输入如下代码
f = open("boos直聘.csv", "w", encoding="utf-8", newline="")
csv.writer(f).writerow(["职位", "位置", "薪资", "经验", "公司名", "类型"])
写入csv
csv.writer(f).writerow([title, 位置, 薪资, 经验, company, commpany_type])
参考文章:Python Selenium库的使用
代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import csv
f = open("php_boos直聘.csv", "w", encoding="utf-8", newline="")
csv.writer(f).writerow(["职位", "位置", "薪资", "经验", "公司名", "类型"])
# 打开谷歌驱动
driver = webdriver.Chrome()
# 打开火狐驱动, 下载的是哪个驱动就用所对应的驱动名打开,这里我使用的是谷歌
# driver = webdriver.Firefox()
# 输入需要搜索的网址,这里直接输入boos的首页网址,也可以根据自己的需要来输入对应的网址,修改括号中的网址即可
driver.get("https://www.zhipin.com/")
# 输入搜索内容
driver.find_element_by_css_selector(".ipt-search").send_keys("php")
#
# # 模拟回车键
driver.find_element_by_css_selector(".ipt-search").send_keys(Keys.ENTER)
# 搜索全国
driver.find_element_by_link_text("全国").click()
# 回车搜索
driver.find_element_by_css_selector(".ipt-search").send_keys(Keys.ENTER)
# driver.find_element_by_css_selector("#btn btn-search")
# implicitly_wait(): 隐式等待
# 当使用了隐士等待执行测试的时候,如果
# WebDriver没有在
# DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常
# 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找
# DOM,默认的时间是0
# 一旦设置了隐式等待,则它存在整个
# WebDriver
# 对象实例的声明周期中,隐式的等到会让一个正常响应的应用的测试变慢,
# 它将会在寻找每个元素的时候都进行等待,这样会增加整个测试执行的时间。
driver.implicitly_wait(10)
def index():
# # 获取所有的li标签
lis = driver.find_elements_by_css_selector(".job-list li")
# print(lis)
for li in lis:
# print(li)
title = li.find_element_by_css_selector(".job-name").text
位置 = li.find_element_by_css_selector(".job-area").text
薪资 = li.find_element_by_css_selector(".red").text
经验 = li.find_element_by_css_selector(".job-limit p").text
company = li.find_element_by_css_selector(".company-text .name a").text
commpany_type = li.find_element_by_css_selector(".company-text p a").text
print(title, 位置, 薪资, 经验, company, commpany_type)
csv.writer(f).writerow([title, 位置, 薪资, 经验, company, commpany_type])
for j in range(10):
index()
driver.find_element_by_css_selector(".next").click()
driver.quit()