Python 和 Selenium 的浏览器爬虫

2023-09-20 02:29:38

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

1b856a11ed791a6a4776ef338a028e780549b838_2_690x388

它的取名很有意思,因为当时最流行的一款自动化测试工具叫做 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

更多推荐

HTML

HTML1.HTML结构1.1认识HTMLHTML是超文本标记语言,电脑上看到的所有网站都是html实现的HTML代码是“标签”构成的,简单来说,html就是一堆标签的组合形如<body>hello</body>标签名(body)放到<>中大部分标签成对出现.为开始标签,为结束标签.少数标签只有开始标签,称为“单标签”

Linux内嵌汇编

文章目录前言一、内嵌汇编二、内嵌汇编示例三、不使用printf实现打印四、INT80H总结前言本篇文章我们来讲讲内嵌汇编的概念和教大家如何来编写内嵌汇编的代码。一、内嵌汇编内嵌汇编(InlineAssembly)是将汇编代码嵌入到高级语言中的一种编码技术。内嵌汇编能够将底层的机器代码和高层的高级语言代码无缝地结合起来,

java_web的框架分析

文章目录本阶段技术体系用项目理解原理controllersClassPathXmlApplicationContextDispatcherServletFruitServiceImplFilter本阶段技术体系用项目理解原理项目的目录首先设置一个参数,这里里面用反射机制,获取方法的时候如果不设置会获取到arg[0],a

Linux之Shell基础入门

文章目录什么是shellshell入门案例什么是shell什么是shell?Shell(外壳)是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。什么是脚本?脚本简单地说

WebGL透视投影

目录透视投影透视投影可视空间可视空间构造效果图Matrix4.setPerspective()三角形与可视化空间的相对位置示例代码代码详解示例效果投影矩阵的作用透视投影矩阵对物体进行了两次变换透视投影变换示意图透视投影在透视投影下,产生的三维场景看上去更是有深度感,更加自然,因为我们平时观察真实世界用的也是透视投影。在

Java高级-反射

反射1.介绍2.获取Class对象的三种方法3.获取类的构造器4.获取类的成员变量5.获取类的成员方法6.反射的作用和应用场景1.介绍反射加载类,并允许以编程的方式解剖类的各种成分(成员变量、方法、构造器等)反射步骤1.加载类,获取类的字节码:Class对象2.获取类的构造器:Constructor对象3.获取类的成员

JS 继承

JS继承的方式一、继承是什么?二、继承实现的方式2.1原型链继承2.2原型式继承2.3构造函数继承2.4组合继承2.5寄生式继承2.6寄生组合式继承2.7extends方法一、继承是什么?继承(inheritance)是面向对象软件技术当中的一个概念。如果一个类别B“继承自”另一个类别A,就把这个B称为“A的子类”,而

软件工程 第一次随堂练习

以下答案是经过人工智能生成,个人理解得出的答案,若有不同见解,请在评论区留言或私信说明下列需求分别属于下面的哪种类型,为什么?A.业务需求B.用户需求C.系统级(功能)需求D.性能需求E.质量需求F.约束G.对外接口H.数据需求I.过程需求J.项目需求K.其他需求(硬件需求、人力需求等)1.经过10天培训的收银员能熟练

页面静态化、Freemarker入门

页面静态化介绍页面的访问量比较大时,就会对数据库造成了很大的访问压力,并且数据库中的数据变化频率并不高。那需要通过什么方法为数据库减压并提高系统运行性能呢?答案就是页面静态化。页面静态化其实就是将原来的动态网页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为通过静态化技术生成的静态网页,这样用户在访问网页

《IP编址与路由:网络层的关键技术》

前言:在TCP/IP协议栈中,网络层位于第三层,起到了承上启下的关键作用。它不仅负责处理来自数据链路层和传输层的请求,还需确保数据包的正确转发。本文将深入探讨IP编址与路由的相关知识,帮助您更好地理解网络层的重要性和应用。目录IP地址分类:ARP/RARP协议原理:路由器工作原理:IP地址分类:IPv4和IPv6是两种

Vue基础语法【下】

目录一、事件处理器1.事件修饰符.stop.prevent.capture.self.once2.按键修饰符.enter.tab.delete.esc.space.up.down.left.right.ctrl、.alt、.shift、.meta二、表单赋值与取值三、自定义组件1.组件介绍2.局部组件3.全局组件4.组

热文推荐