Pyppeteer踩坑记录

Pyppeteer踩坑记录

[toc]

简介

  pyperteer是puppeteer的Python实现,相比于selenium具有异步加载、速度快、具备有界面/无界面模式、伪装性更强不易被识别为机器人同时可以伪装手机平板等终端。官方文档链接
  本来chrome就问题多多,puppeteer也是各种坑,加上pyppeteer是前两者的python版本,也就是产生了只要前两个有一个有bug,那么pyppeteer就会原封不动的继承下来,本来这没什么,但是现在遇到的问题就是pyppeteer这个项目从18年9月份之后就没更新过了,前两者都在不断的更新迭代,而pyppeteer一直不更新,导致很多bug根本没人修复。

launch常用配置

语法 描述
ignoreHTTPSErrors bool 是否忽略 HTTPS 错误
headless bool 是否在无头模式下运行浏览器
executablePath str 运行 Chromium 或 Chrome 可执行文件的路径,而不是默认捆绑的 Chromium
slowMo float 按指定的毫秒数减慢 pyppeteer 操作
args list 传递给浏览器进程的附加参数
dumpio bool 是否管道浏览器进程 stdout 和 stderr 进入 process.stdout 和 process.stderr。默认为 False
userDataDir str 用户数据目录的路径
env dict 指定浏览器可见的环境变量。默认与 python 进程相同
devtools bool 是否为每个选项卡自动打开 DevTools 面板。如果是此选项 True,headless 则将设置该选项 False
logLevel str 用于打印日志的日志级别。默认值与根记录器相同
loop asyncio.AbstractEventLoop 事件循环(实验)

各种坑

1、浏览器窗口很大,内容显示很小

配置启动参数:
    args=['--window-size=1280,720'],
    defaultViewport={"width": 1280,"height": 720}

2、chromium浏览器多开页面卡死问题

配置启动参数:
    dumpio=True

3、当使用pyppeteer一段时间之后,在.dev_profile文件夹里会产生大量的文件

设置autoClose=True,让它自动关闭的同时清理缓存文件或者手动执行await browser.close()
以上方法在某些时候会删除文件失败,我的解决方法是在每次启动前清空这个文件夹,代码如下
    p = os.path.join(pyppeteer.__pyppeteer_home__, ".dev_profile")
    shutil.rmtree(p, ignore_errors=True)

4、pyppeteer打印大量日志的问题

配置启动参数:
    logLevel='ERROR'

5、程序运行自动下载chromium报错或者下载很慢

可以设置环境变量使用淘宝加速镜像
os.environ["PYPPETEER_DOWNLOAD_HOST"]="https://npm.taobao.org/mirrors"
或者设置参数executablePath指定已安装的chrome或者chromium路径

6、无法关闭(Chrome 正受到自动测试软件的控制)这个控制条

这个问题在旧版本的chrome中可以设置'--disable-infobars'启动参数解决,但是较新版的chrome已经去掉了这个功能,但可以设置参数ignoreDefaultArgs=['--enable-automation']来去掉,不过这有副作用。

7、page.click模拟点击网页跳转导致报错

可以通过以下方式调用click
await asyncio.gather(
    page.waitForNavigation(),
    page.click(selector),
)

8、page.goto超时之后偶尔失去响应

这是一个bug,Puppeteer最新版本中同样存在,解决方法是在捕获超时错误后执行以下代码
await page._client.send("Page.stopLoading")

9、网站超时不报错,进程假死

这类网站很奇怪,连用curl命令也不触发超时错误,查阅大量资料之后,想到一个解决方案,代码如下:
res = await asyncio.wait_for(page.goto(url, {
    'waitUntil': ['load','networkidle0'],
    "timeout": timeout
}), timeout / 1000 + 1)

10、屏蔽dialog弹窗,否则有弹窗的网站会导致进程会卡住

async def close_dialog(dialog):
    await dialog.dismiss()
page.on("dialog", lambda x: asyncio.ensure_future(close_dialog(x)))

11、在docker容器中直接启动chrome报错

配置启动参数:
    args=['--no-sandbox']

12、使用新版本chrome时经常卡住

配置启动参数:
    args=['--disable-features=TranslateUI']

13、存在反调试的网站会导致浏览器直接卡死

一般情况过反调试
await page.evaluateOnNewDocument("()=>{Object.defineProperties(navigator,{webdriver:{get:()=>false}});")
过sojsonv6反调试
await page.evaluateOnNewDocument('()=>{Object.defineProperties(navigator,{webdriver:{get:()=>false}});var func=function(){};window["console"]["log"]=func;window["console"]["warn"]=func;window["console"]["debug"]=func;window["console"]["info"]=func;window["console"]["error"]=func;window["console"]["exception"]=func;window["console"]["trace"]=func;}')

14、部分网站会自动打开一个新的页面,数量多了之后会导致浏览器崩溃

每次访问网页之后都用await browser.pages()获取所有page,检测一下数量是否正常,如果异常可以遍历关闭page,也可以关闭浏览器,然后重启一个chrome实例。

15、长时间运行可能遇到有些网站在获取标题时超时,导致假死

捕获超时错误时第一件事就先发送停止命令await page._client.send("Page.stopLoading"),这个时候有些网站可能还是没停止加载,不过不会导致假死,然后不设延迟获取标题即可

参考链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 如果大家对 Python 爬虫有所了解的话,想必你应该听说过 Selenium 这个库,这实际上是一个自动化测试工...
    g_ices阅读 636评论 0 1
  • 前言 前段时间因为有任务,需要四个电商(京东、淘宝、天猫、拼多多)的数据。而其中京东的没什么反爬,基本是随便抓。拼...
    生信师姐阅读 881评论 0 2
  • 如果大家对 Python 爬虫有所了解的话,想必你应该听说过 Selenium 这个库,这实际上是一个自动化测试工...
    HelloJames阅读 1,034评论 0 13
  • 一、前言 以前使用selenium的无头浏览器,自从phantomjs2016后慢慢不更新了之后,selenium...
    HHHHUA阅读 2,256评论 0 1
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 5,980评论 0 4