Selenium 快速上手

写在前面

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

环境准备

  • Python3
  • Selenium
  • 浏览器驱动

Selenium 安装

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

pip install selenium

浏览器驱动

首先请确保当前浏览器更新到最新版本
Chrome:
image-20220216080948580
EDGE:
image-20220216080934081
相应浏览器驱动的下载地址:

Chrome:ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)
image-20220216081310947image-20220216081328290EDGE:Microsoft Edge Driver - Microsoft Edge Developerimage-20220216081149351
下载时请注意浏览器内核版本,与操作系统位数。
下载完成后的浏览器驱动可以放置在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)

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

点击与输入

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

# 点击按钮、链接
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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Johnzqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值