写在前面
最近在写毕业论文,为了更加方便的批量从知网中下载论文作为参考,便萌生出使用Python + Selenium 快速下载论文的想法。于是抽空学习了下Selenium,有了这篇文章。
环境准备
- Python3
- Selenium
- 浏览器驱动
Selenium 安装
在已用的python环境中输入以下命令,安装Selenium
pip install selenium
浏览器驱动
首先请确保当前浏览器更新到最新版本
Chrome:
EDGE:
相应浏览器驱动的下载地址:
Chrome:ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)
EDGE:Microsoft Edge Driver - Microsoft Edge Developer
下载时请注意浏览器内核版本,与操作系统位数。
下载完成后的浏览器驱动可以放置在python安装目录下,也可以放置在项目的目录下。
注意:如果是Linux请放置在 /usr/bin 目录下。
开始使用
浏览器初始化
from selenium import webdriver
# 浏览器初始化
options = webdriver.EdgeOptions()
options.add_argument("--headless")
options.add_argument('--no-sandbox')
options.add_argument('--disable-gpu') # 无头+禁用GPU渲染提升爬虫速度
options.add_argument('--disable-dev-shm-usage')
prefs = {
'profile.default_content_settings.popups': 0,
'profile.managed_default_content_settings.images': 2, # 禁止加载图片
'permissions.default.stylesheet': 2, # 禁止加载css
}
options.add_experimental_option("prefs", prefs)
browser = webdriver.Edge(options=options)
browser.implicitly_wait(3) # 隐式等待元素加载
# 打开连接
url = "https://www.baidu.com"
browser.get(url)
找到元素
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)
使用F12调试模式获取XPATH,注意在动态加载的网站中,获取的XPATH可能会出现变化。
点击与输入
网页的操作无外乎,点击,输入与选择下拉菜单。
# 点击按钮、链接
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()
获取内容
elem.get_attribute("属性名") # 获取属性值
elem.text # 获取文本
elem.tag_name # 获取元素标签
# 通过JS获取元素属性值
js = 'return document.getElementById("passwd").getAttribute("value")
passwd = driver.execute_script(js)
标签栏操作
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保存与读取
import json
# 将cookies保存为json格式,存入文本
with open('cookies.txt','w') as f:
f.write(json.dumps(browser.get_cookies()))
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:
browser.add_cookie(cookie)
保存验证码
使用截图获取网页图片,确定元素位置,裁切并保存校验码。如果使用的是笔记本或高分辨率屏幕,注意系统缩放设置,本文设置的是125%缩放。
# 获取截图
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)
其他操作
browser.page_source # 当前标签页浏览器渲染之后的网页源代码
browser.current_url # 当前标签页的url
browser.close() # 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
browser.quit() # 关闭浏览器
browser.forward() # 前进
browser.back() # 后退
browser.screen_shot(img_name) # 截图
更多资料
Selenium Python 教程 - 知乎 (zhihu.com)
Selenium之find_element_by_css_selector()的使用方法 - 简书 (jianshu.com)
介绍 | Selenium 中文文档 (gitbooks.io)