ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pyppeteer 安装报错 ssl.SSLCertVerificationError 解决方法

2021-06-09 19:53:52  阅读:231  来源: 互联网

标签:__ pyppeteer get chrome SSLCertVerificationError Pyppeteer 报错 win64 chromium


1. 引言

曾经使用模拟浏览器操作(selenium + webdriver)来写爬虫,但是稍微有点反爬的网站都会对 selenium 和 webdriver 进行识别,网站只需要在前端 js 添加一下判断脚本,很容易就可以判断出是真人访问还是 webdriver 。虽然也可以通过中间代理的方式进行 js 注入屏蔽 webdriver 检测,但是 webdriver 对浏览器的模拟操作(输入、点击等等)都会留下 webdriver 的标记,同样会被识别出来,要绕过这种检测,只有重新编译 webdriver,麻烦自不必说,难度不是一般大。

作为 selenium+webdriver 的优秀替代,pyppeteer 就是一个很好的选择。

2. 手动安装

通过 pip 使用豆瓣源加速安装 pyppeteer:

pip install pyppeteer

按照官方手册,先来感受一下:

import asyncio
from pyppeteer import launch

async def main():
	browser = await launch(headless=False)
	page = await browser.newPage()
	await page.goto('http://www.baidu.com/')
	await asyncio.sleep(100)
	await browser.close()

asyncio.get_event_loop().run_until_complete(main())

pyppeteer 第一次运行时,会自动下载chromium浏览器,时间可能会有些长。不过,我第一次运行时,直接报错:

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)

尝试多种方法无果,无奈只能手动下载,但手动下载的方法网上资料也几乎没有,让我来做这个先行者吧。

上面代码运行虽然报错,但是控制台前两行却提供了很有用的信息:

[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.

可以看到,下载功能是由 pyppeteer.chromium_downloader 模块完成的,那么我们进入这个模块查看源码。

在这个模块源码中,我们可以看到 downloadURLschromiumExecutable 等变量,很明显指的就是下载链接和chromium 的可执行文件路径。我们重点关注一下可执行文件路径

chromiumExecutable:
chromiumExecutable = {
'linux': DOWNLOADS_FOLDER / REVISION / 'chrome-linux' / 'chrome',
'mac': (DOWNLOADS_FOLDER / REVISION / 'chrome-mac' / 'Chromium.app' /
'Contents' / 'MacOS' / 'Chromium'),
'win32': DOWNLOADS_FOLDER / REVISION / 'chrome-win32' / 'chrome.exe',
'win64': DOWNLOADS_FOLDER / REVISION / 'chrome-win32' / 'chrome.exe',
}

可见,无论在哪个平台下,chromiumExecutable 都是由是4个部分组成,其中 DOWNLOADS_FOLDERREVISION 是定义好的变量:

DOWNLOADS_FOLDER = Path(__pyppeteer_home__) / 'local-chromium'

进一步查看可以发现:

__pyppeteer_home__ = os.environ.get('PYPPETEER_HOME', AppDirs('pyppeteer').user_data_dir)
REVISION = os.environ.get('PYPPETEER_CHROMIUM_REVISION', __chromium_revision__)

所以,DOWNLOADS_FOLDER 和 REVISION都是读取对应环境变量设置好的值,如果没有设置,就使用默认值。我们来输出一下,看看默认值:

import pyppeteer.chromium_downloader
print('默认版本是:{}'.format(pyppeteer.__chromium_revision__))
print('可执行文件默认路径:{}'.format(pyppeteer.chromium_downloader.chromiumExecutable.get('win64')))
print('win64平台下载链接为:{}'.format(pyppeteer.chromium_downloader.downloadURLs.get('win64')))

输出结果如下:

默认版本是:575458
可执行文件默认路径:C:\Users\Administrator\AppData\Local\pyppeteer\pyppeteer\local-chromium\575458\chrome-win32\chrome.exe
win64平台下载链接为:https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip

在使用上面代码的时候,你可以将win64换成你的平台就好了,有了上面的下载链接,这个时候就可以先开始下载着chromium浏览器(有些慢),然后继续往下看。

对于版本,没什么好说的,是用默认的就好了。但是,对于chromium的可执行文件路径,默认是在C盘,对于有C盘洁癖的我,咋看咋不舒服,那就改了吧。从上面的分析中我们可以知道,C:\Users\Administrator\AppData\Local\pyppeteer\pyppeteer这一部分读取的是环境变量或者默认值,所以,我们可以通过配置环境变量改这一部分(或者也可以直接改源码,读取环境变量那一行,直接设为固定值),通过os.environ添加PYPPETEER_HOME这一变量值,例如我想把我的chromium放在D盘的Program Files文件夹下:

import os
os.environ['PYPPETEER_HOME'] = 'D:\Program Files'
import pyppeteer.chromium_downloader
print('默认版本是:{}'.format(pyppeteer.__chromium_revision__))
print('可执行文件默认路径:{}'.format(pyppeteer.chromium_downloader.chromiumExecutable.get('win64')))
print('win64平台下载链接为:{}'.format(pyppeteer.chromium_downloader.downloadURLs.get('win64')))

输出如下:

默认版本是:575458
可执行文件默认路径:D:\Program Files\local-chromium\575458\chrome-win32\chrome.exe
win64平台下载链接为:https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip

特别提醒:上面设置环境变量的那一行,必须在导入pyppeteer这一行上面,否则设置无效。

上面这种方法你需要在每次使用pypeeteer之前通过这行代码设置一下,实在麻烦,所以,我还是更愿意直接在windows系统里面添加这个变量:

在这里插入图片描述

虽然我们把环境变量设置为D:\Program Files,但是层层文件夹之后,才到真正的可执行文件chrome.exe,下载好的压缩包解压后,所有文件都在名为chrome-win的文件夹中,所以,我们需要在D:\Program Files创建local-chromium\575458这两个文件夹(575458是上面的版本号,记得修改为你的版本号),然后将解压得到的chrome-win文件夹,重命名为chrome-win32,然后直接拷贝进去就好,整个安装过程就完成了。

再来试试最初(最上面)的代码,你会看到,已经可以成功运行。

我相信,大多数阅读这篇博文的读者都是用pyppeteer来开发爬虫(别说维护世界和平,我不信),那么接下来,重点来说说爬虫中要用到的一些主要操作。

标签:__,pyppeteer,get,chrome,SSLCertVerificationError,Pyppeteer,报错,win64,chromium
来源: https://blog.51cto.com/u_13962552/2886822

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有