Pyppeteer(2)

2020-06-03  本文已影响0人  生信师姐

前言

前段时间因为有任务,需要四个电商(京东、淘宝、天猫、拼多多)的数据。而其中京东的没什么反爬,基本是随便抓。拼多多的加密参数有点复杂,而且变化也挺频繁的,用的是 selenium,也没什么可提的。抓淘宝和天猫因为用 selenium 滑块过不了,于是就改成了 pyppeteer。现在我说一下使用的心得。有些细节因为当时没有记录,现在也记不起来了。

首先 pip install pyppeteer , 这时候我们先看一下 websockets 这个库的版本,因为必须保证这个库是 7.0 的版本。8.0 和 6.0 虽然可以使用,但是在访问多个网页会出现一些无法解决的异常。现在安装 pyppeteer,websockets 的版本默认是 8.0,我们需要先pip uninstall websockets卸载 8.0,然后pip install websockets==7.0。然后我们按照 https://github.com/miyakogi/pyppeteer/pull/160/files 这个网页修改 pyppeteer 的源码(如果是 anaconda,则路径是 anaconda 安装路径\Lib\site-packages\pyppeteer\connection.py 这个文件)。这样准备工作就完成了,这样操作之后就可以避免很多异常。

需要这么费劲的折腾,是因为 pyppeteer 这个库已经很久没有做大的更新了,虽然有点小的改动,但是基本的 bug 还是没有解决。所以如果有 js 基础,最好还是使用 JavaScript 的 puppeteer 这个工具,这个是谷歌出品的,一直在更新维护,基本没有 bug。

补充:有时候会出现明明网页加载完成了,但是还是会出现超时的情况。不知道是什么 bug,解决方法也很简单,只要捕获这个异常,然后该做啥做啥。

以下有的方法前面带 coroutine 这个关键字,有点没有,这是因为带这个参数的方法都是异步方法,这种方法必须被 async 关键字修饰,调用的时候也必须 await 关键字修饰。不过我们既然使用浏览器爬虫了,肯定已经不在乎效率了,异步等于在等网站封,所以只需要遵守某些规则即可(不懂的请百度 asyncio 的使用),实际上还是同步运行。另外,虽然 page.on()这个方法是存在的,但是官方文档中并未给出详细的说明,甚至我查看 pyppeteer 的源码也未找到这个函数,不知道是怎么回事。但是参考 puppeteer 的文档也是可以用的,不过报错居多,我也就没有深究了。

API 参考

启动器

  1. pyppeteer.launcher.launch()
    启动 Chrome 进程并返回浏览器实例

参数:


  1. pyppeteer.launcher.connect()
    连接到现有的 Chrome

参数:

browserWSEndpoint:格式是ws://${host}:${port}/devtools/browser/<id>。以前浏览器的 wsEndpoint 这个值,可以通过brower = pyppeteer.launcher.launch() dev = brower. wsEndpoint保存这个值就可以下次启动了

  1. pyppeteer.launcher.executablePath()
    获取默认 Chrome 的可执行路径

浏览器类

pyppeteer.browser.Browser()
这个类是由 launch()返回的实例

页面类

pyppeteer.page.Page()
由 brower.newPage()或者 brower.pages()得到

注意
如果此方法触发导航事件并且存在单独的事件,则 waitForNavigation()最终可能会出现产生意外结果的竞争条件。单击并等待导航的正确模式如下:

<textarea style="margin: 0px; padding: 0px;"></textarea>

``` await asyncio.gather( page.waitForNavigation(waitOptions), page.click(selector, clickOptions), ) ``` 

大概意思是 click()触发如果会跳转网页,则需要 page.waitForNavigation()这个函数来等待。但点击事件和触发事件是同时的,所以需要将这两个事件绑定,代码如上。

worker 类

page.on('workercreated', 函数) 这个函数传入的参数就是 worker 类

键盘类

鼠标类

tracing 类

创建可在 Chrome DevTools 或时间线查看器打开的跟踪文件 ,使用如下

await page.tracing.start({'path': 'trace.json'}) await page.goto('https://www.google.com') 
await page.tracing.stop() 

不好用,可能是我不知道用

Dialog 类

page.on( 'dialog', 函数),函数的参数就是这个类

frame 类

ElementHandle 类

request 类

page.on('request', 函数) 这个函数传入的参数就是 request 类

response 类

target 类

我到现在还没明白这是干什么的

CDPSession 类

Debugging

对于调试,您可以设置 for 和 功能logLevel选项。但是,此选项会打印太多日志,包括 pyppeteer 的 SEND / RECV 消息。为了只显示被抑制的错误消息,您应该设置 logging.DEBUG 为 True

[ 复制代码

](javascript:void(0); "复制代码")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">import asyncio import pyppeteer from pyppeteer import launch

pyppeteer.DEBUG = True # print suppressed errors as error log
async def main():

browser = await launch()

... # do something

asyncio.get_event_loop().run_until_complete(main()) </pre>

[ 复制代码

](javascript:void(0); "复制代码")

https://www.cnblogs.com/chenhuabin/p/10989895.html

https://www.biaodianfu.com/pyspider.html

上一篇下一篇

猜你喜欢

热点阅读