赞
踩
细化操作请看:https://blog.csdn.net/Qwertyuiop2016/article/details/122698409
本篇博客完全是翻译官方文档,所以如何看得懂英文文档的可以直接看官方文档。
文档地址:https://miyakogi.github.io/pyppeteer/
前段时间因为有任务,需要四个电商(京东、淘宝、天猫、拼多多)的数据。而其中京东的没什么反爬,基本是随便抓。拼多多的加密参数有点复杂,而且变化也挺频繁的,用的是selenium,也没什么可提的。抓淘宝和天猫因为用selenium滑块过不了,于是就改成了pyppeteer。现在我说一下使用的心得。有些细节因为当时没有记录,现在也记不起来了。
首先 pip install pyppeteer
, 这时候我们先看一下websockets这个库的版本,因为必须保证这个库是7.0的版本。8.0和6.0虽然可以使用,但是在访问多个网页会出现一些无法解决的异常。现在安装pyppeteer,websockets的版本默认是8.0,我们需要先 (我发现pyppeteer应该是更新了,已经不支持8.1以下的版本了)。然后我们按照 https://github.com/miyakogi/pyppeteer/pull/160/files 这个网页修改pyppeteer的源码(如果是anaconda,则路径是 anaconda安装路径\Lib\site-packages\pyppeteer\connection.py这个文件)。这样准备工作就完成了,这样操作之后就可以避免很多异常。其中最常见的一个就是:pyppeteer.errors.NetworkError: Protocol Error (Page.navigate): Session closed. Most likely the page has been closed。pip uninstall websockets
卸载8.0,然后pip install websockets==7.0
需要这么费劲的折腾,是因为pyppeteer这个库已经很久没有做大的更新了,虽然有点小的改动,但是基本的bug还是没有解决。所以如果有js基础,最好还是使用JavaScript的puppeteer这个工具,这个是谷歌出品的,一直在更新维护,基本没有bug。
补充:有时候会出现明明网页加载完成了,但是还是会出现超时的情况。不知道是什么bug,解决方法也很简单,只要捕获这个异常,然后该做啥做啥。
以下有的方法前面带coroutine这个关键字,有点没有,这是因为带这个参数的方法都是异步方法,这种方法必须被async关键字修饰,调用的时候也必须await关键字修饰。不过我们既然使用浏览器爬虫了,肯定已经不在乎效率了,异步等于在等网站封,所以只需要遵守某些规则即可(不懂的请百度asyncio的使用),实际上还是同步运行。另外,虽然page.on()这个方法是存在的,但是官方文档中并未给出详细的说明,甚至我查看pyppeteer的源码也未找到这个函数,不知道是怎么回事。但是参考puppeteer的文档也是可以用的,不过报错居多,我也就没有深究了。
参数:
ignoreHTTPSErrors
(bool):是否忽略HTTPS错误。默认为 False
headless
(bool):是否在无头模式下运行浏览器。默认为 True
除非appMode
或devtools
选项True
executablePath
(str):运行Chromium或Chrome可执行文件的路径,而不是默认捆绑的ChromiumslowMo
(int | float):按指定的毫秒数减慢pyppeteer操作。args
(List [str]):传递给浏览器进程的附加参数(标志)。dumpio
(bool):是否管道浏览器进程stdout和stderr进入process.stdout
和process.stderr
。默认为False
。userDataDir
(str):用户数据目录的路径。env
(dict):指定浏览器可见的环境变量。默认与python进程相同。devtools
(bool):是否为每个选项卡自动打开DevTools面板。如果是此选项True
,headless
则将设置该选项 False
。logLevel
(int | str):用于打印日志的日志级别。默认值与根记录器相同。autoClose
(bool):脚本完成时自动关闭浏览器进程。默认为True
。loop
(asyncio.AbstractEventLoop):事件循环(实验)。参数:
browserWSEndpoint
(str):要连接的浏览器websocket端点。(必填)ignoreHTTPSErrors
(bool):是否忽略HTTPS错误。默认为 False
。slowMo
(int | float):按指定的毫秒数减慢pyppeteer的速度。logLevel
(int | str):用于打印日志的日志级别。默认值与根记录器相同。loop
(asyncio.AbstractEventLoop):事件循环(实验)。browserWSEndpoint:格式是ws://${host}:${port}/devtools/browser/<id>
。以前浏览器的wsEndpoint这个值,可以通过brower = pyppeteer.launcher.launch()
dev = brower. wsEndpoint
保存这个值就可以下次启动了
pyppeteer.browser.Browser()
这个类是由launch()返回的实例
pyppeteer.page.Page()
由brower.newPage()或者brower.pages()得到
coroutine J():别名querySelector(),看名字就知道通过css选择器来选出元素
coroutine JJ(): 别名querySelectorAll()
coroutine Jeval(): 功能比page.J()功能多一点,可以选出网页文本或者属性指
coroutine JJeval(): querySelectorAllEval()
coroutine Jx(): 别名xpath()
coroutine addScriptTag(): 将脚本标记添加到此页面, 返回ElementHandle
其中一个url,path或content选择是必要的。
url
(字符串):要添加的脚本的URL。path
(字符串):要添加的本地JavaScript文件的路径。content
(字符串):要添加的JavaScript字符串。type
(字符串):脚本类型。使用module
以加载一个JavaScript ES6模块。coroutine addStyleTag(): 将样式或链接标记添加到此页面, 返回ElementHandle
其中一个url
,path
或content
选择是必要的。
url
(字符串):要添加的链接标记的URL。path
(字符串):要添加的本地CSS文件的路径。content
(字符串):要添加的CSS字符串。coroutine authenticate(): 提供http身份验证的凭据
coroutine bringToFront(): 将页面置于前面
browser: 获取该页面所属的浏览器
coroutine click(): 相当于鼠标左键单击匹配的元素,参数是css选择器的字符串。如果没有匹配到元素,则会引发PageError
可选参数:
button
(str): ,left,right或middle,默认为 left。clickCount
(int):默认为1。delay
(int | float):等待时间mousedown和 mouseup以毫秒为单位的时间。默认为0。注意
如果此方法触发导航事件并且存在单独的事件,则waitForNavigation()最终可能会出现产生意外结果的竞争条件。单击并等待导航的正确模式如下:
```
await asyncio.gather(
page.waitForNavigation(waitOptions),
page.click(selector, clickOptions),
)
```
大概意思是click()触发如果会跳转网页,则需要page.waitForNavigation()这个函数来等待。但点击事件和触发事件是同时的,所以需要将这两个事件绑定,代码如上。
coroutine close(): 关闭此页面
coroutine content(): 获取页面的完整HTML内容
coroutine cookies(): 获取cookie。参数为URL,如果未指定URL,则此方法返回当前页面URL的cookie。如果指定了URL,则仅返回这些URL的cookie
coverage: 返回coverage
coroutine deleteCookie(): 删除cookie,参数为cookie字段参数,比如name、url、domain、path等
coroutine emulate(): 模拟给定的设备指标和用户代理。相当于同时设置了setUserAgent()、setViewport()
coroutine emulateMedia(): 模拟页面的css媒体类型。参数为:screen、print、None。
coroutine evaluate(): 在浏览器上执行js并获取结果
coroutine evaluateHandle(): 同上,只是会返回一个值。至于是什么,没用过
coroutine evaluateOnNewDocument(): 也是执行js,至于区别。好像是在页面跳转时执行
coroutine exposeFunction(): 将python函数添加到浏览器的window对象中name。不知道有什么用
coroutine focus(): 聚焦匹配的元素。如果不存在,抛出PageError
frames:获取此页面的所有frame
coroutine goBack():返回上一个网页。如果不存在,则返回None
coroutine goForward(): 跳转到下一页。如果不存在,则返回None
coroutine goto(): 访问某个URL。
参数:
coroutine hover(): 鼠标悬停匹配的元素
isClosed(): 判断页面是否关闭
keyboard: 获取keyboard对象
mainFrame: 获取frame页面的主要内容
coroutine metrics(): 好像是获取页面中的信息
mouse: 获取mouse对象
coroutine reload(): 刷新网页
coroutine screenshot(): 截图
参数:
path
(str):保存图像的文件路径。屏幕截图类型将从文件扩展名中推断出来。type
(str):指定屏幕截图类型,可以是jpeg
或 png
。默认为png
。quality
(int):图像的质量,在0-100之间。不适用于png
图像。fullPage
(bool):如果为true,请截取完整的可滚动页面。默认为False
。clip
(字典):指定页面剪切区域的对象。此选项应包含以下字段:
x
(int):剪辑区域左上角的x坐标。y
(int):剪辑区域左上角的y坐标。width
(int):剪切区域的宽度。height
(int):剪切区域的高度。omitBackground
(bool):隐藏默认的白色背景并允许捕获具有透明度的屏幕截图。encoding
(str):图像的编码可以是 'base64'
或'binary'
。默认为'binary'
。coroutine select(): 选择选项并返回所选值。如果未找到元素,抛出ElementHandleError。
coroutine setCacheEnabled(): 为每个请求启用/禁用缓存。默认启用
coroutine setContent(): 将html加到网页
coroutine setCookie(): 设置cookie
setDefaultNavigationTimeout(): 更改默认的最大导航超时。默认30秒
coroutine setJavaScriptEnabled(): 设置JavaScript启用/禁用
coroutine setExtraHTTPHeaders(): 设置默认headers头,值为一个字典
coroutine setRequestInterception(): 启用/禁用请求拦截。配合page.on()
coroutine setUserAgent(): 设置要在此页面中使用的UA
coroutine setViewport(): 设置窗口大小。
参数:
width
(int):以像素为单位的页面宽度。height
(int):以像素为单位的页面高度。deviceScaleFactor
(float):默认为1.0。isMobile
(bool):默认为False
。hasTouch
(bool):默认为False
。isLandscape
(bool):默认为False
。coroutine tap(): 点击与之匹配的元素
coroutine title(): 获取页面标签
tracing:获取tracing对象
coroutine type(): 往输入框中输入内容,第一个参数为css选择器,第二个为文本内容
url:获取此页面的url
waitFor(): 等待页面上匹配的函数,超时或元素。参数可以是int或者float,单位毫秒。也可以是css选择器
waitForFunction():
coroutine waitForNavigation(): 等到网页跳转
coroutine waitForRequest(): 等待请求
coroutine waitForResponse(): 等待回应
waitForSelector(): 等到页面上出现匹配的元素。其实waitFor()也有同样功能。
waitForFunction(): 等到函数完成并返回一个值
coroutine waitForXPath(): 等到xpath页面上出现匹配的元素
workers: 获取页面的所有worker。至于是什么,我不知道
coroutine xpath(): …
page.on(‘workercreated’, 函数) 这个函数传入的参数就是worker类
coroutine click(): 按下(x, y)处的按钮
参数:
button
(STR): ,left(左键)、right(右键)或middle(中键),默认为 left
。clickCount
(int):默认为1。delay
(int | float):等待时间mousedown
和 mouseup
以毫秒为单位的时间。默认为0。coroutine down(): 同上
coroutine move(): 移动鼠标光标。
coroutine up(): 同上
创建可在Chrome DevTools或时间线查看器打开的跟踪文件 ,使用如下
await page.tracing.start({'path': 'trace.json'})
await page.goto('https://www.google.com')
await page.tracing.stop()
不好用,可能是我不知道用
page.on( 'dialog', 函数)
,函数的参数就是这个类
alert
,beforeunload
,confirm
,或prompt
page.on(‘request’, 函数) 这个函数传入的参数就是request类
url
(str):如果设置,请求URL将被更改。method
(str):如果设置,则更改请求方法(例如GET
)。postData
(str):如果设置,则更改发布数据或请求。headers
(dict):如果设置,则更改请求HTTP标头status
(int):响应状态代码,默认为200。headers
(dict):可选的响应头。contentType
(str):如果设置,则等于设置Content-Type
响应头。body
(str | bytes):可选的响应主体。我到现在还没明白这是干什么的
对于调试,您可以设置for 和 功能logLevel
选项。但是,此选项会打印太多日志,包括pyppeteer的SEND / RECV消息。为了只显示被抑制的错误消息,您应该设置logging.DEBUG为True
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())
pyppeteer已经从https://github.com/miyakogi/pyppeteer
迁移到https://github.com/pyppeteer/pyppeteer
并且持续在更新,截止目前最后一次更新是在2021的6月份。所以这篇文件很多可能已经不适用了,当然,接口内容还是和原来的一样。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。