隋唐演义

隋唐演义

别只用 Selenium,新神器 Pyppeteer 绕过淘宝更简单!

双十一 0

手机淘宝搜:天降红包55 5月20日开始,每天领红包。
京示搜:天降红包369,5月28日开始


阅读本文大概需要?10?分钟。

如果大家对?Python?爬虫有所了解的话,想必你应该听说过?Selenium?这个库,这实际上是一个自动化测试工具,现在已经被广泛用于网络爬虫中来应对?JavaScript?渲染的页面的抓取。

但?Selenium?用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如?Chrome、Firefox?等等,然后还要到官方网站去下载对应的驱动,最重要的还需要安装对应的?Python?Selenium?库,确实是不是很方便,另外如果要做大规模部署的话,环境配置的一些问题也是个头疼的事情。

那么本节就介绍另一个类似的替代品,叫做?Pyppeteer。注意,是叫做?Pyppeteer,不是?Puppeteer。Puppeteer?是?Google?基于?Node.js?开发的一个工具,有了它我们可以通过?JavaScript?来控制?Chrome?浏览器的一些操作,当然也可以用作网络爬虫上,其?API?极其完善,功能非常强大。?而?Pyppeteer?又是什么呢?它实际上是?Puppeteer?的?Python?版本的实现,但他不是?Google?开发的,是一位来自于日本的工程师依据?Puppeteer?的一些功能开发出来的非官方版本。

在?Pyppetter?中,实际上它背后也是有一个类似?Chrome?浏览器的?Chromium?浏览器在执行一些动作进行网页渲染,首先说下?Chrome?浏览器和?Chromium?浏览器的渊源。

Chromium?是谷歌为了研发?Chrome?而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome?所有的新功能都会先在?Chromium?上实现,待验证稳定后才会移植,因此?Chromium?的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium?的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的?Logo,但配色不同,Chrome?由蓝红绿黄四种颜色组成,而?Chromium?由不同深度的蓝色构成。

Chromium 【【微信】】

总的来说,两款浏览器的内核是一样的,实现方式也是一样的,可以认为是开发版和正式版的区别,功能上基本是没有太大区别的。

Pyppeteer?就是依赖于?Chromium?这个浏览器来运行的。那么有了?Pyppeteer?之后,我们就可以免去那些繁琐的环境配置等问题。如果第一次运行的时候,Chromium?浏览器没有安全,那么程序会帮我们自动安装和配置,就免去了繁琐的环境配置等工作。另外?Pyppeteer?是基于?Python?的新特性?async?实现的,所以它的一些执行也支持异步操作,效率相对于?Selenium?来说也提高了。

那么下面就让我们来一起了解下?Pyppeteer?的相关用法吧。

首先就是安装问题了,由于?Pyppeteer?采用了?Python?的?async?机制,所以其运行要求的?Python?版本为?3.5?及以上。

安装方式非常简单:

好了,安装完成之后我们命令行下测试下:

如果没有报错,那么就证明安装成功了。

接下来我们测试下基本的页面渲染操作,这里我们选用的网址为:http://【【微信】】.toscrape/js/,这个页面是?JavaScript?渲染而成的,用基本的?requests?库请求得到的?HTML?结果里面是不包含页面中所见的条目内容的。

为了证明?requests?无法完成正常的抓取,我们可以先用如下代码来测试一下:

这里首先使用?requests?来请求网页内容,然后使用?pyquery?来解析页面中的每一个条目。观察源码之后我们发现每个条目的?class?名为?quote,所以这里选用了?.quote?这个?CSS?选择器来选择,最后输出条目数量。

运行结果:

结果是?0,这就证明使用?requests?是无法正常抓取到相关数据的。因为什么?因为这个页面是?JavaScript?渲染而成的,我们所看到的内容都是网页加载后又执行了?JavaScript?之后才呈现出来的,因此这些条目数据并不存在于原始?HTML?代码中,而?requests?仅仅抓取的是原始?HTML?代码。

好的,所以遇到这种类型的网站我们应该怎么办呢?

其实答案有很多:

  • 分析网页源代码数据,如果数据是隐藏在?HTML?中的其他地方,以?JavaScript?变量的形式存在,直接提取就好了。

  • 分析?Ajax,很多数据可能是经过?Ajax?请求时候获取的,所以可以分析其接口。

  • 模拟?JavaScript?渲染过程,直接抓取渲染后的结果。

而?Pyppeteer?和?Selenium?就是用的第三种方法,下面我们再用?Pyppeteer?来试试,如果用?Pyppeteer?实现如上页面的抓取的话,代码就可以写为如下形式:

运行结果:

看运行结果,这说明我们就成功匹配出来了?class?为?quote?的条目,总数为?10?条,具体的内容可以进一步使用?pyquery?解析查看。

那么这里面的过程发生了什么?

实际上,Pyppeteer?整个流程就完成了浏览器的开启、新建页面、页面加载等操作。另外?Pyppeteer?里面进行了异步操作,所以需要配合?async/await?关键词来实现。

首先,?launch?方法会新建一个?Browser?对象,然后赋值给?browser,然后调用?newPage方法相当于浏览器中新建了一个选项卡,同时新建了一个?Page?对象。然后?Page?对象调用了?goto?方法就相当于在浏览器中输入了这个?URL,浏览器跳转到了对应的页面进行加载,加载完成之后再调用?content?方法,返回当前浏览器页面的源代码。然后进一步地,我们用?pyquery?进行同样地解析,就可以得到?JavaScript?渲染的结果了。

另外其他的一些方法如调用?asyncio?的?get_e【【微信】】?等方法的相关操作则属于?Python?异步?async?相关的内容了,大家如果不熟悉可以了解下?Python?的?async/await?的相关知识。

好,通过上面的代码,我们就可以完成?JavaScript?渲染页面的爬取了。

在这个过程中,我们没有配置?Chrome?浏览器,没有配置浏览器驱动,免去了一些繁琐的步骤,同样达到了?Selenium?的效果,还实现了异步抓取,爽歪歪!

接下来我们再看看另外一个例子,这个例子可以模拟网页截图,保存?PDF,另外还可以执行自定义的?JavaScript?获得特定的内容,代码如下:

这里我们又用到了几个新的?API,完成了网页截图保存、网页导出?PDF?保存、执行?JavaScript?并返回对应数据。

首先?screenshot?方法可以传入保存的图片路径,另外还可以指定保存格式?type、清晰度?【【微信】】、是否全屏?fullPage、裁切?clip?等各个参数实现截图。

截图的样例如下:

效果页面

可以看到它返回的就是?JavaScript?渲染后的页面。

pdf?方法也是类似的,只不过页面保存格式不一样,最后得到一个多页的?pdf?文件,样例如下:

保存的PDF

可见其内容也是?JavaScript?渲染后的内容,另外这个方法还可以指定放缩大小?scale、页码范围?pageRanges、宽高?width?和?height、方向?landscape?等等参数,导出定制化的?pdf?用这个方法就十分方便。

最后我们又调用了?e【【微信】】?方法执行了一些?JavaScript,JavaScript?传入的是一个函数,使用?return?方法返回了网页的宽高、像素大小比率三个值,最后得到的是一个?JSON?格式的对象,内容如下:

OK,实例就先感受到这里,还有太多太多的功能还没提及。

总之利用?Pyppeteer?我们可以控制浏览器执行几乎所有动作,想要的操作和功能基本都可以实现,用它来自由地控制爬虫当然就不在话下了。

了解了基本的实例之后,我们再来梳理一下?Pyppeteer?的一些基本和常用操作。Pyppeteer?的几乎所有功能都能在其官方文档的?API?Reference?里面找到,链接为:https://【【淘密令】】thub.io/pyppeteer/reference.html,用到哪个方法就来这里查询就好了,参数不必死记硬背,即用即查就好。

使用?Pyppeteer?的第一步便是启动浏览器,首先我们看下怎样启动一个浏览器,其实就相当于我们点击桌面上的浏览器图标一样,把它开起来。用?Pyppeteer?完成同样的操作,只需要调用?launch?方法即可。

我们先看下?launch?方法的?API,链接为:https://【【淘密令】】thub.io/pyppeteer/reference.html#pyppeteer.launcher.launch,其方法定义如下:

可以看到它处于?launcher?模块中,参数没有在声明中特别指定,返回类型是?browser?模块中的?Browser?对象,另外观察源码发现这是一个?async?修饰的方法,所以调用它的时候需要使用?await。

接下来看看它的参数:

  • ignoreHTTPSErrors?(bool):?是否要忽略?HTTPS?的错误,默认是?False。

  • headless?(bool):?是否启用?Headless?模式,即*面模式,如果?devtools?这个参数是?True?的话,那么该参数就会被设置为?False,否则为?True,即默认是开启*面模式的。

  • executablePath?(str):?可执行文件的路径,如果指定之后就不需要使用默认的?Chromium?了,可以指定为已有的?Chrome?或?Chromium。

  • slowMo?(int|float):?通过传入指定的时间,可以减缓?Pyppeteer?的一些模拟操作。

  • args?(List[str]):?在执行过程中可以传入的额外参数。

  • ignoreDefaultArgs?(bool):?不使用?Pyppeteer?的默认参数,如果使用了这个参数,那么最好通过?args?参数来设定一些参数,否则可能会出现一些意想不到的问题。这个参数相对比较危险,慎用。

  • handleSIGINT?(bool):?是否响应?SIGINT?信号,也就是可以使用?Ctrl?+?C?来终止浏览器程序,默认是?True。

  • handleSIGTERM?(bool):?是否响应?SIGTERM?信号,一般是?kill?命令,默认是?True。

  • handleSIGHUP?(bool):?是否响应?SIGHUP?信号,即挂起信号,比如终端退出操作,默认是?True。

  • 版权声明:除非特别标注原创,其它均来自互联网,转载时请以链接形式注明文章出处。

上一篇抖音小店的购物入口 抖音小店商品词条

下一篇今年618淘宝京东拼多多谁最便宜 618京东淘宝拼多多排名各多少