Python 和 Selenium 的浏览器爬虫

Selenium 是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 发起,它提供了一套简单易用的 API,模拟浏览器的各种操作,方便各种 Web 应用的自动化测试。

它的取名很有意思,因为当时最流行的一款自动化测试工具叫做 QTP,是由 Mercury 公司开发的商业应用。Mercury 是化学元素汞,而 Selenium 是化学元素硒,汞有剧毒,而硒可以解汞毒,它对汞有拮抗作用。

Selenium 的核心组件叫做 Selenium-RC(Remote Control),简单来说它是一个代理服务器,浏览器启动时通过将它设置为代理,它可以修改请求响应报文并向其中注入 Javascript,通过注入的 JS 可以模拟浏览器操作,从而实现自动化测试。

但是注入 JS 的方法存在很多限制,譬如无法模拟键盘和鼠标事件,处理不了对话框,不能绕过 JavaScript 沙箱等等。

就在这个时候,于 2006 年左右,Google 的工程师 Simon Stewart 发起了 WebDriver 项目,WebDriver 通过调用浏览器提供的原生自动化 API 来驱动浏览器,解决了 Selenium 的很多疑难杂症。不过 WebDriver 也有它不足的地方,它不能支持所有的浏览器,需要针对不同的浏览器来开发不同的 WebDriver,因为不同的浏览器提供的 API 也不尽相同,好在经过不断的发展,各种主流浏览器都已经有相应的 WebDriver 了。最终 Selenium 和 WebDriver 合并在一起,这就是 Selenium 2.0,有的地方也直接把它称作 WebDriver。

Selenium 目前最新的版本已经是 3.9 了,WebDriver 仍然是 Selenium 的核心。

为什么 Selenium 成了爬虫工具

Selenium 的初衷是打造一款优秀的自动化测试工具,但是慢慢的人们就发现,Selenium 的自动化用来做爬虫正合适。我们知道,传统的爬虫通过直接模拟 HTTP 请求来爬取站点信息,由于这种方式和浏览器访问差异比较明显,很多站点都采取了一些反爬的手段,而 Selenium 是通过模拟浏览器来爬取信息,其行为和用户几乎一样,反爬策略也很难区分出请求到底是来自 Selenium 还是真实用户。而且通过 Selenium 来做爬虫,不用去分析每个请求的具体参数,比起传统的爬虫开发起来更容易。

Selenium 爬虫唯一的不足是慢,如果你对爬虫的速度没有要求,那使用 Selenium 是个非常不错的选择。Selenium 提供了多种语言的支持(Java、.NET、Python、Ruby 等),不论你是用哪种语言开发爬虫,Selenium 都适合你。

这是因为 Selenium 启动都需要调用浏览器的核心来启动一个浏览器。

同时,当浏览器访问网站的时候,如果数据没有载入完全,Selenium 是不会对数据进行分析的,有些网站的载入很慢,这样就导致 Selenium 的处理很慢。

这个不是因为 Selenium 程序慢,而是等待数据载入的时间太长。

启动浏览器

使用下面 3 句话就可以模拟启动一个浏览器,并且通过浏览器访问一个网站后,对网站来进行分析。

复制代码
from selenium.webdriver import Chrome

chrome = Chrome(service=Service(r"C:\Users\yhu\Downloads\chromedriver-win64\chromedriver-win64\chromedriver.exe"))
chrome.get('https://www.isharkfly.com/')

// Get Element
rowContent = chrome.find_elements(By.XPATH, '/html/body/div[3]/div/div/div/div[4]/div/table/tbody/tr')

如实例没有启动的话,获得元素的代码就没有办法执行。

其实慢就是慢在这里。

Python 和 Selenium 的浏览器爬虫 - Python - iSharkFly

相关推荐
菜鸡儿齐16 分钟前
Unsafe方法学习
java·python·学习
老师好,我是刘同学4 小时前
Python执行命令并保存输出到文件
python
啵啵鱼爱吃小猫咪6 小时前
机械臂阻抗控制github项目-mujoco仿真
开发语言·人工智能·python·机器人
MaximusCoder6 小时前
等保测评命令——Centos Linux
linux·运维·经验分享·python·安全·centos
yunyun321236 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
m0_662577976 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
songyuc6 小时前
【PyTorch】感觉`CrossEntropyLoss`和`BCELoss`很类似,为什么它们接收labels的shape常常不一样呢?
人工智能·pytorch·python
ℳ๓₯㎕.空城旧梦6 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
浩子智控7 小时前
python程序打包的文件地址处理
开发语言·python·pyqt
Jackey_Song_Odd7 小时前
Part 1:Python语言核心 - 序列与容器
开发语言·windows·python