pyppeteer配置及常见问题|option选项,设置页面大小,被检测到驱动浏览器的问题,Most likely the page has been closed

发表时间:2020-02-22

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

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

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

官方文档

读取 option

    # options是dict类型, 初始化时使用
    await launch(self.options)

options 选项

# 是否忽略https错误, 默认为False ignoreHTTPSErrors # 将pyppeteer操作减慢指定的毫秒数 slowMo(int | float) # 是否以无头模式运行浏览器。除非appMode或devtools选项为True, 默认为 True headless # 运行而不是默认捆绑的Chromium的Chromium或Chrome可执行文件的路径 executablePath # 将pyppeteer操作减慢指定的毫秒数 slowMo (int | float) # 是否将浏览器进程stdout和stderr传递到process.stdout和中process.stderr,默认为False dumpio # 脚本完成后自动关闭浏览器进程, 默认为True autoClose # 传递给浏览器进程的其他参数(标志) args 'args': [ '--no-sandbox', f'--window-size={width},{height}' #设置浏览器窗口大小,保持和页面大小一致 --proxy-server=127.0.0.1:1080 # 使用代理 ] # 是否为每个选项卡自动打开DevTools面板。如果是此选项True,headless则将设置该选项 False devtools(布尔) # Path to a user data directory, 如果需要多个浏览器并行,则使用不同的data地址 userDataDir

option 实例

self.options = { "headless": False, # 设置模式, 默认无头 'dumpio': True, 'autoClose': False, 'args': [arg2, arg4, arg5, arg6], "devtools": True, 'userDataDir': os.getcwd() + os.sep + 'userData' + os.sep + username, }

页面大小

import tkinter tk = tkinter.Tk() width = tk.winfo_screenwidth() height = tk.winfo_screenheight() tk.quit() width,height # 是页面得宽和高 await self.page.setViewport(viewport={'width': width, 'height': height}) #设置浏览器页面得高度和宽度 #设置后可能会出现页面没有铺满得情况,需要调整浏览器大小

问题

  1. Most likely the page has been closed

    1. 在 pyppeteer 中得 connection.py 文件中得 44 行得参数中添加参数,可解决页面自动关闭,断开连接问题
    self._ws = websockets.client.connect ping_interval = None, ping_timeout = None
  2. 被检测到驱动浏览器的问题

    1. 在 Chrome 的 console 中输入:window.navigator.webdriver, 隐藏的浏览器该值为 undefined,没有隐藏的浏览器该值为 true
    window.navigator.webdriver = true # 被识别 window.navigator.webdriver = undefined# # 未被识别
    1. 隐藏浏览器标识,0.0.25 版本 pyppeteer 中,修改 launch 中的源码,注释 AUTOMATION_ARGS 中的 --enable-automation
    AUTOMATION_ARGS = [ # '--enable-automation', '--password-store=basic', '--use-mock-keychain', ]
    1. 设置函数参数,避免被检测
    async def PageEvaluate(self, page): await page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => undefined } }) }''') await page.evaluate('''() =>{ window.navigator.chrome = { runtime: {}, }; }''') await page.evaluate('''() =>{ Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] }); }''') await page.evaluate('''() =>{ Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], }); }''') await self.PageEvaluate(self.page) await self.PageEvaluate(self.page)

文章来源互联网,尊重作者原创,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890


Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free