Python 第三方库 selenium

初识 selenium

selenium 原本设计出来的目的是用作自动化测试,但是对于我而言,它是爬虫大杀器。绝大多数的网站,目前就我看到的,基本上没有对 selenium 做对应反扒策略的。注意:是基本上,我的确遇到过 selenium 失效的情况。

为什么 selenium 是爬虫大杀器?

selenium 的原理就是模拟浏览器,与其他的爬虫不同的是,selenium 是真的使用浏览器来进行操作的,模拟人的行为,所以不需要设置请求头,因为它是真实的操作浏览器。

selenium 的优缺点?

selenium 的优点就是 js 大杀器,爬虫做的多一定遇到过 js 加密的,这种反扒措施当让可以通过看 js 来反解,不过成本要高很多,如果爬取的成本大于数据本身,那么爬取便毫无意义。selenium 易于理解,因为是模拟人的操作,可以设置有头模式,看整个执行流程,如果出了问题,可以直接看出来。

selenium 的缺点就是性能,对于正常的 requests 爬虫,selenium 性能和效率实在是太低了。学习成本较高,我之所以说学习成本高,是因为如果只是入门很简单,但是当你需要做一些繁琐的事情的时候,你必须得深入了解,否则就必须再降低一个数量级的性能。 对我而言,通常不使用 selenium,对于 selenium 总感觉到很多不确定性,大概知道一些优化的方式,但是代码量会增加很多。

selenium 使用须知

自己做 selenium 的时候没有人教,最遗憾的是当初没有人告诉我 driver 这个概念,所以在贴代码前,需要着重强调这个概念。

如果你和我一样用的是 windows 系统,使用的是基于 Chromium 的 Edge,那么你就应该和我一样去下载 对应的 driver

微软贴心的给出了 [webdriver 下载地址]https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

下载后的文件中包含一个:msedgedriver.exe,把它放到你想放的位置,然后记下地址

webdriver 你可以把它理解为 浏览器核心,通过它操作你的 Edge 浏览器

这里必须注意的是,不同浏览器需要对应的驱动,如果你的是 Chrome Safari Firefox,你应该去下载对应的驱动

selenium code 部分

先看下面的导入部分:如果只是简单的使用,下面这些应该足够了

By 是用来查找定位元素的,Options 是用来配置浏览器的,Service 嗯,老实说我最近写代码时候发现以前的 api 被弃用(提示警告,旧的写法已经不推荐使用了),搜了下才用上的 Service

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.options import Options
from selenium.webdriver.edge.service import Service
options = Options()
    options.add_argument("--headless") # 无头模式(建议新手先注释掉这一行)
    options.add_experimental_option("detach", True)  # 禁止自动关闭浏览器(建议新手开启)
    options.add_argument('--disable-gpu')
    options.add_argument("--start-maximized") # 最大化窗口
    service = Service(r'D:\download\msedgedriver.exe') # 你存放 driver 的路径
    driver = webdriver.Edge(service=service, options=options) # 创建 driver
driver.get("https://www.baidu.com")
element = driver.find_element(By.XPATH, '//*[@id="kw"]')
element.send_keys("hello selenium")
driver.find_element(By.XPATH, '//*[@id="su"]').click()

进阶篇

selenium 中很重要的一个配置,或者说是一个概念:driver.implicitly_wait(5)

想要深入一点的,必须要了解显示等待和隐式等待概念和区别,这里就不细谈。

如果要使用回车,空格这类的键,可以使用 from selenium.webdriver import Keys

点击异常的问题,有的时候我们发现 click 失效,审查一下网页,如果发现 click 元素是 js,那么大概率就是 js 的问题,换一种 click 方式入下,即可

click_element = driver.find_element(By.XPATH, '//*[@id="su"]')
driver.execute_script("arguments[0].click();", click_element)

近期感悟 与 文章无关

最近在看优雅地写代码,看了很多规范一类的,以及推荐地代码写法。其中有些认可,有些个人还是有些争议,不过其中最让我感悟深刻地就是 “魔法数字”

我一看是看的时候还以为是什么好东西,结果一看,原来是指代码中除了 0,1 之外的其他数字,例如:range(10) 这种。我们在写代码的时候应该避免这种数字的出现,我深表认同。

文中提出代码中的 魔法数字 应该尽可能大写定义 如:COLOR_NUM = 7, range(COLOR_NUM) 这样子很容易理解,实际上也确实如此。有段时间回头看自己写的 魔法数字 确实有些迷糊,这点今后将尽量改。毕竟有时候为了省时间就懒得写了。