Selenium 快速上手

本文最后更新于:2 年前

写在前面

最近在写毕业论文,为了更加方便的批量从知网中下载论文作为参考,便萌生出使用Python + Selenium 快速下载论文的想法。于是抽空学习了下Selenium,有了这篇文章。

环境准备

  • Python3
  • Selenium
  • 浏览器驱动

Selenium 安装

在已用的python环境中输入以下命令,安装Selenium

1
pip install selenium

浏览器驱动

首先请确保当前浏览器更新到最新版本

Chrome:

image-20220216080948580
image-20220216080948580

EDGE:

image-20220216080934081
image-20220216080934081

相应浏览器驱动的下载地址:

Chrome:ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)

image-20220216081310947
image-20220216081310947
image-20220216081328290
image-20220216081328290

EDGE:Microsoft Edge Driver - Microsoft Edge Developer

image-20220216081149351
image-20220216081149351

下载时请注意浏览器内核版本,与操作系统位数。

下载完成后的浏览器驱动可以放置在python安装目录下,也可以放置在项目的目录下。

注意:如果是Linux请放置在 /usr/bin 目录下。

开始使用

浏览器初始化

1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver

# 浏览器初始化
options = webdriver.EdgeOptions()
options.add_argument("--headless")
options.add_argument('--disable-gpu') # 无头+禁用GPU渲染提升爬虫速度
browser = webdriver.Edge(options=options)
browser.implicitly_wait(3) # 隐式等待元素加载

# 打开连接
url = "https://www.baidu.com"
browser.get(url)

找到元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from selenium.webdriver.common.by import By
# NAME
elem = browser.find_element(By.NAME, "tj_login")
# ID
elem = browser.find_element(By.ID, "s-top-loginbtn")
# Class模糊匹配,以列表的形式返回
elems = browser.find_elements(By.CLASS_NAME, "s-top-login-btn")
elem = elems[0]
# CSS选择器 多种属性组合
css = '[class="s-top-login-btn"][name="tj_login"]'
browser.find_element(By.CSS_SELECTOR, css)
# XPATH
login_btn = '//*[@id="s-top-loginbtn"]'
elem = browser.find_element(By.XPATH, login_btn)
image-20220216091049052
image-20220216091049052

使用F12调试模式获取XPATH,注意在动态加载的网站中,获取的XPATH可能会出现变化。

image-20220216091623418
image-20220216091623418

点击与输入

网页的操作无外乎,点击,输入与选择下拉菜单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 点击按钮、链接
elem.click()

# 输入文本框、表格
text ="abcd"
elem.send_keys(text)

# 选择下拉菜单
elem.select_by_index(6) # 通过下标进行定位
elem.select_by_visible_text('数学') # 通过文本内容进行定位
elem.select_by_value('25') # 通过value属性进行定位

# 清空选择
elem.clear()

标签栏操作

1
2
3
4
5
6
7
8
9
10
browser.current_window_handle	# 当前标签栏句柄
browser.window_handles # 标签栏句柄列表
# 切换
browser.switch_to.window(browser.window_handles[0]) # 切换到第一个标签栏
browser.switch_to.frame(iframe) # 切换到frame
browser.switch_to.alert() # 切换到提醒框
# 关闭标签栏
browser.close()
# 获取当前url
browser.current_url

Cookie保存与读取

1
2
3
4
import json
# 将cookies保存为json格式,存入文本
with open('cookies.txt','w') as f:
f.write(json.dumps(browser.get_cookies()))
1
2
3
4
5
6
7
8
import json
# 首先清除已有的cookies
browser.delete_all_cookies()
# 使用json读取cookies
with open('cookies.txt','r') as f:
cookies_list = json.load(f)
for cookie in cookies_list:
driver.add_cookie(cookie)

保存验证码

使用截图获取网页图片,确定元素位置,裁切并保存校验码。如果使用的是笔记本或高分辨率屏幕,注意系统缩放设置,本文设置的是125%缩放。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 获取截图
browser.get_screenshot_as_file('screenshot.png')

# 获取指定元素位置
element = browser.find_element(By.CLASS_NAME, 'captchaimg')
left = int(element.location['x'])
top = int(element.location['y'])
right = int(element.location['x'] + element.size['width'])
bottom = int(element.location['y'] + element.size['height'])

# 通过Image处理图像
im = Image.open('screenshot.png')
zoom = 1.25 # 系统缩放
im = im.crop((left * zoom, top * zoom, right * zoom, bottom * zoom))
im.save('code.png')
im.show()

# 识别处理校验码
vcc = input("请输入验证码:")
elem = browser.find_element(By.NAME, "VerifyCode")
elem.clear()
elem.send_keys(vcc)

其他操作

1
2
browser.forward()	# 前进
browser.back() # 后退

更多资料

Python+Selenium基础入门及实践 - 简书 (jianshu.com)

Selenium之find_element_by_css_selector()的使用方法 - 简书 (jianshu.com)