文档

Selenium Webdriver 简易教程 - wizardforcel

Selenium with Python中文翻译文档

前言

某些网站的反爬虫机制通过按钮、跳转等功能,能够防止最简单的 requests 爬虫。

Selenium WebDriver 是一个测试框架,提供了 Java、Python 等语言的 API,可以用一种更底层、更灵活的方式来操作浏览器,模拟人在浏览器上的操作。可用于 Web 应用的测试,当然也可以用于自动化批量操作(管理员批量部署、爬虫)等等。

同时,需要下载 ChromeDriver 或使用 FireFox 浏览器。

使用

我编写的一个爬虫项目代码中出现的用法已经足狗应用于很多情形了。

初始化

1
2
from selenium import webdriver
driver = webdriver.Chrome()

我将下载的 ChromeDriver 放在 main.py 同目录下(似乎也可以放在 PATH 下),执行命令后出现了一个 Chrome 测试窗口。

Chrome 测试窗口
Chrome 测试窗口

调用

这里是我在项目中使用的爬虫代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
url = "https://240334.yichafen.com/public/queryscore/sqcode/OsTcknwmMjkzfGZlYWYyOTQ1YjA5YmM1ZTQxOGQzMmY1NTdiYzNlYjI2fDI0MDMzNAO0O0OO0O0O.html"

def get_score(name: str, student_id: str) -> str:
driver.implicitly_wait(1) # 等待一秒
driver.get(url) # GET 指令
driver.refresh() # 刷新

# 根据 XPath 寻找元素,XPath 可在 Chrome 检查元素中,对元素右键 - 复制 - 复制 XPath 得到
student_id_element = driver.find_element_by_xpath("//input[@name='s_xuehao']")
student_id_element.clear() # 清空输入框
student_id_element.send_keys(student_id) # 填入学号
name_element = driver.find_element_by_xpath("//input[@name='s_xingming']")
name_element.clear()
name_element.send_keys(name) # 填入姓名

# 找到按钮
button = driver.find_element_by_xpath("//*[@id='yiDunSubmitBtn']")
button.click() # 单击按钮
driver.implicitly_wait(0.5) # 等待 0.5s

try:
assert(driver.find_element_by_xpath("//*[@id='result_content']/div[2]/table/tbody/tr[2]/td[1]").get_attribute("innerHTML") == student_id)
assert(driver.find_element_by_xpath("//*[@id='result_content']/div[2]/table/tbody/tr[2]/td[2]").get_attribute("innerHTML") == name)
except:
raise ValueError("%s %s 信息不对应" %(name, student_id))

# 找到需要的文本对应的 XPath,获取其文本
return driver.find_element_by_xpath("//*[@id='result_content']/div[2]/table/tbody/tr[2]/td[3]").get_attribute("innerHTML")


if __name__ == '__main__':
driver = webdriver.Chrome()
with open('input.csv') as input:
for line in input:
name, student_id = line.strip().split(',')
score = get_score(name, student_id)
print("%s,%s,%s" % (name, student_id, score))
with open('output.csv', 'w') as output:
output.write("%s,%s,%s\n" % (name, student_id, score))

更多文档可见 Selenium with Python中文翻译文档