添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

注意,讲解的模块叫做 Pyppeteer,不是 Puppeteer。

Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 API 极其完善,功能非常强大。

而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。

pip install

pip install pyppeteer -i https://pypi.douban.com/simple

chromium下载

国内无法访问 可以使用国内镜像

chromium下载地址:https://npm.taobao.org/mirrors/chromium-browser-snapshots/
下载之后解压之后,通过executablePath属性指定运行浏览器了

我这里上传了到了csdn你也可以从这下
https://download.csdn.net/download/qq_27648991/12513423

可以参考puppeteer官方文档,因为pyppeteer的语法跟他一样

#!/usr/bin/python
# -*- coding: UTF-8 -*-
@time:2020/04/04
import asyncio
from pyppeteer import launch
async def main():
    # 浏览器 启动参数
    start_parm = {
        # 启动chrome的路径
        "executablePath": r"C:\Users\yq\AppData\Local\pyppeteer\pyppeteer\local-chromium\722234\chrome-win\chrome.exe",
        # 关闭无头浏览器 默认是无头启动的
        "headless": False,
    # 创建浏览器对象,可以传入 字典形式参数
    browser = await launch(**start_parm)
    # 创建一个页面对象, 页面操作在该对象上执行
    page = await browser.newPage()
    await page.goto('https://www.httpbin.org/headers')  # 页面跳转
    page_text = await page.content()  # 页面内容
    print(page_text)
    input('==========')
    await browser.close()  # 关闭浏览器对象
asyncio.get_event_loop().run_until_complete(main())   # 创建异步池并执行main函数。

启动参数优化

常用的参数

总结常用的启动参数

属性参数描述
executablePathstrchrome.exe运行的路径
ignorehttpserrrorsbool忽略https错误,默认false
headlessboolTrue 开始无头浏览器 False关闭无头
dumpiobool设置True 解决浏览器多开卡死 (没有测试过)
下面是args的参数设置下面是args的参数设置下面是args的参数设置
–disable-infobars-关闭自动化提示框
–window-size=1920,1080str设置浏览器大小吗,1920是宽,1080是宽
–log-level=30str日志保存等级, 建议设置越好越好,要不然生成的日志占用的空间会很大 30为warning级别
–start-maximized-窗口最大化模式
–proxy-server=http://localhost:1080str设置代理
userDataDir=D:\userData\str用户文件保存地址

来源于网络copy的

  • ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的错误,默认是 False。
  • headless (bool): 是否启用 Headless 模式,即无界面模式,如果 devtools 这个参数是 True 的话,那么该参数就会被设置为 False,否则为 True,即默认是开启无界面模式的。
  • executablePath (str): 可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium。
  • slowMo (int|float): 通过传入指定的时间,可以减缓 Pyppeteer 的一些模拟操作。
  • args (List[str]): 在执行过程中可以传入的额外参数。
  • ignoreDefaultArgs (bool): 不使用 Pyppeteer 的默认参数,如果使用了这个参数,那么最好通过 args 参数来设定一些参数,否则可能会出现一些意想不到的问题。这个参数相对比较危险,慎用。
  • handleSIGINT (bool): 是否响应 SIGINT 信号,也就是可以使用 Ctrl + C 来终止浏览器程序,默认是 True。
  • handleSIGTERM (bool): 是否响应 SIGTERM 信号,一般是 kill 命令,默认是 True。
  • handleSIGHUP (bool): 是否响应 SIGHUP 信号,即挂起信号,比如终端退出操作,默认是 True。
  • dumpio (bool): 是否将 Pyppeteer 的输出内容传给 process.stdout 和 process.stderr 对象,默认是 False。
  • userDataDir (str): 即用户数据文件夹,即可以保留一些个性化配置和操作记录。
  • env (dict): 环境变量,可以通过字典形式传入。
  • devtools (bool): 是否为每一个页面自动开启调试工具,默认是 False。如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False。
  • logLevel (int|str): 日志级别,默认和 root logger 对象的级别相同。
  • autoClose (bool): 当一些命令执行完之后,是否自动关闭浏览器,默认是 True。
  • loop (asyncio.AbstractEventLoop): 时间循环对象。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
@time:2020/04/04
import asyncio
import logging
import tkinter
from pyppeteer import launch, launcher
from lxml import etree
async def main():
    # 浏览器 启动参数
    start_parm = {
        # 启动chrome的路径
        "executablePath": r"C:\Users\yq\AppData\Local\pyppeteer\pyppeteer\local-chromium\722234\chrome-win\chrome.exe",
        # 关闭无头浏览器
        "headless": False,
        "args": [
            '--disable-infobars',  # 关闭自动化提示框
            # '--window-size=1920,1080',  # 窗口大小
            '--log-level=30',  # 日志保存等级, 建议设置越好越好,要不然生成的日志占用的空间会很大 30为warning级别
            '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',  # UA
            '--no-sandbox',  # 关闭沙盒模式
            '--start-maximized',  # 窗口最大化模式
            # '--proxy-server=http://localhost:1080'  # 代理
            r'userDataDir=D:\project_demo\python_demo\spider_demo\JavaScript 逆向系列课\userdata'  # 用户文件地址
    await page.goto('https://www.httpbin.org/headers')
    page_text = await page.content()
    input('----------------')
    await browser.close()
asyncio.get_event_loop().run_until_complete(main())

窗口/可视区最大化

但窗口设置最大化(–start-maximized)或窗口大小(–window-size=1920,1080)时,发现自己页面可视区域没有变化。成下面图片显示效果

设置可视化参数,代码如下

# !/usr/bin/python
# -*- coding: UTF-8 -*-
@time:2020/04/04
import asyncio
import tkinter
from pyppeteer import launcher
# 注意 在导入launch之前先把默认参数改了
# 去除自动化 启动参数
launcher.AUTOMATION_ARGS.remove("--enable-automation")
from pyppeteer import launch
async def main():
    # 浏览器 启动参数
    start_parm = {
        # 启动chrome的路径
        "executablePath": r"C:\Users\yq\AppData\Local\pyppeteer\pyppeteer\local-chromium\722234\chrome-win\chrome.exe",
        # 关闭无头浏览器
        "headless": False,
        "args": [
            '--disable-infobars',  # 关闭自动化提示框
            '--no-sandbox',  # 关闭沙盒模式
            '--start-maximized',  # 窗口最大化模式
    browser = await launch(**start_parm)
    page = await browser.newPage()
    # 查看当前 桌面视图大小
    tk = tkinter.Tk()
    width = tk.winfo_screenwidth()
    height = tk.winfo_screenheight()
    tk.quit()
    print(f'设置窗口为:width:{width} height:{height}')
    # 设置网页 视图大小
    await page.setViewport(viewport={'width': width, 'height': height})
    await page.goto('https://www.baidu.com')
    input('----------------')
    await browser.close()
asyncio.get_event_loop().run_until_complete(main())

隐藏浏览器特征

pyppeteer跟selenium一样会有浏览器特征,所以需要修改,隐藏特征防止被识别。
主要有下面两点:

  1. 去除浏览器自动化参数 --enable-automation
  2. 去除window.navigator.webdriver等检测
#!/usr/bin/python
# -*- coding: UTF-8 -*-
@time:2020/04/04
import asyncio
import logging
import tkinter
from pyppeteer import launcher
# 第一步 去除浏览器自动化参数
# 必须在 from pyppeteer import launch 前去除参数
# 去除自动化 启动参数
launcher.AUTOMATION_ARGS.remove("--enable-automation")
from pyppeteer import launch
from lxml import etree
async def main():
    # 浏览器 启动参数
    start_parm = {
        # 启动chrome的路径
        "executablePath": r"C:\Users\yq\AppData\Local\pyppeteer\pyppeteer\local-chromium\722234\chrome-win\chrome.exe",
        # 关闭无头浏览器
        "headless": False,
        "args": [
            '--disable-infobars',  # 关闭自动化提示框
            # '--window-size=1920,1080',  # 窗口大小
            '--log-level=30',  # 日志保存等级, 建议设置越好越好,要不然生成的日志占用的空间会很大 30为warning级别
            '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',  # UA
            '--no-sandbox',  # 关闭沙盒模式
            '--start-maximized',  # 窗口最大化模式
            # '--proxy-server=http://localhost:1080'  # 代理
            r'userDataDir=D:\project_demo\python_demo\spider_demo\JavaScript 逆向系列课\userdata'  # 用户文件地址
    browser = await launch(**start_parm)
    page = await browser.newPage()
    tk = tkinter.Tk()
    width = tk.winfo_screenwidth()
    height = tk.winfo_screenheight()
    tk.quit()
    await page.setViewport(viewport={'width': width, 'height': height})
	# 第二步,修改 navigator.webdriver检测
	# 其实各种网站的检测js是不一样的,这是比较通用的。有的网站会检测运行的电脑运行系统,cpu核心数量,鼠标运行轨迹等等。
    # 反爬js
    js_text = """
() =>{ 
    Object.defineProperties(navigator,{ webdriver:{ get: () => false } });
    window.navigator.chrome = { runtime: {},  };
    Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
    Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], });
    await page.evaluateOnNewDocument(js_text)  # 本页刷新后值不变,自动执行js
    await page.goto('https://www.httpbin.org/headers')
    page_text = await page.content()
    print(page_text)
    input('==========')
    await browser.close()
asyncio.get_event_loop().run_until_complete(main())

可以对出现的请求,进行拦截 类似mitmproxy。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
@time:2020/04/04
import asyncio
import json
from jsonpath import jsonpath
from pyppeteer import launcher
launcher.AUTOMATION_ARGS.remove("--enable-automation")
from pyppeteer import launch
from pyppeteer.network_manager import Request, Response
async def intercept_request(req:Request):
    await req.continue_()  # 请求,看源码可以重新编写请求
async def intercept_response(res:Response):
    if 'ext2020/apub/json/prevent.new' in res.url:
        print('拦截到请求')
        json_text = await res.text()
        title_li = jsonpath(json.loads(json_text), '$..title')
        for title in title_li:
            print(title)
async def main():
    # 浏览器 启动参数
    start_parm = {
        # 启动chrome的路径
        "executablePath": r"C:\Users\yq\AppData\Local\pyppeteer\pyppeteer\local-chromium\722234\chrome-win\chrome.exe",
        # 关闭无头浏览器 默认是无头启动的
        "headless": False,
        "args": [
            '--disable-infobars',  # 关闭自动化提示框
            # '--no-sandbox',  # 关闭沙盒模式
            '--start-maximized',  # 窗口最大化模式
            '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
    # 创建浏览器对象,可以传入 字典形式参数
    browser = await launch(**start_parm)
    # 创建一个页面对象, 页面操作在该对象上执行
    page = await browser.newPage()
    await page.setJavaScriptEnabled(enabled=True)
    # 启用拦截器
    await page.setRequestInterception(True)
    page.on('request', intercept_request) 
    page.on('response', intercept_response)
    js_text = """
    () =>{ 
        Object.defineProperties(navigator,{ webdriver:{ get: () => false } });
        window.navigator.chrome = { runtime: {},  };
        Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
        Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4, 5,6], });
    await page.evaluateOnNewDocument(js_text)  # 本页刷新后值不变,自动执行js
    await page.goto('https://news.qq.com/')  # 页面跳转
    await browser.close()
asyncio.get_event_loop().run_until_complete(main())   # 创建异步池并执行main函数。
                    文章目录介绍环境部署pip installchromium下载快速使用应用技巧启动参数优化常用的参数其他参数示例窗口/可视区最大化隐藏浏览器特征拦截请求介绍注意,讲解的模块叫做 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用...
在讲 pythonpyppeteer 前,先来说下 Node 的 puppeteer 库:
puppeteer的中文意思是:操纵木偶的人,木偶师。
那么 Node 的 puppeteer 是什么呢?
Puppeteer 是一个 Node 库,它提供了高级的 API 来控制 Chrome/Chromium,通过 DevTools 协议。Puppeteer默认使用无头浏览器,但是通过配置可以控制完整的 Chrome/Chromium 浏览器。
英文原文地址:https://github.com/p
				
使用pyppeteer淘宝登录,获取Cookies 现在淘宝的商品搜索页必须要登录才能见,所以必须要cookies才能进行下一步操作。本期介绍如何使用pyppeteer登录淘宝,获取Cookies。 pyppeteer介绍 地址:https://github.com/miyakogi/pyppeteer 介绍:Unofficial Python port ofpuppeteerJa...
如果大家对 Python 爬虫有所了解的话,想必你应该听说过 Selenium 这个库,这实际上是一个自动化测试工具,现在已经被广泛用于网络爬虫中来应对 JavaScript 渲染的页面的抓取。 很多人学习python,不知道从何学起。 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。 很多已经做案例的人,却不知道如何去学习更加高深的知识。 那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码! QQ群:101677771 但 Seleniu
NumPy是一个Python包。它代表“NumericPython”。它是一个由多维数组对象和用于处理数组的例程集合组成的库。Numeric,即NumPy的前身,是由JimHugunin开发的。也开发了另一个包Numarray,它拥有一些额外的功能。2005年,TravisOliphant通过将Numarray的功能集成到Numeric包中来创建NumPy包。这个开源项目有很多贡献者。使用NumPy,开发人员可以执行以下操作:数组的算数和逻辑运算。傅立叶变换和用于图形操作的例程。与线性代数有关的操作。NumPy拥有线性代数和随机数生成的内置函数。NumPy通常与SciPy(Scientific
python学习教程(超级详细) 必须超过50个字给你---------------------------- ------------------------------------------------------- 0000000000000000000000000000000000000
python安装教程和Pycharm安装详细教程,分享给大家。 首先我们来安装python 1、首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载。 2、下载完成后如下图所示 3、双击exe文件进行安装,如下图,并按照圈中区域进行设置,切记要勾选打钩的框,然后再点击Customize installation进入到下一步: 4、对于上图中,可以通过Browse进行自定义安装路径,也可以直接点击Install进行安装,点击install后便可以完成安装了。 5、为了检查我们的p
分析的是一个航空网站,其实是我再找python执行js代码的资料的时候,发现了一个博主分析了这个网站的加密过程,然后我去跟着操作的时候,发现网站的加密部分代码发生了变化,不过在我不小心把网页关了之后,我实在找不到那篇文章了。。。。。所以我再说一下整个的分析过程,不然我就可以只说一下后面不同的部分了 需要安装pyppeteer、asyncio pyppeteer中文教程:https://zhaoqi...
如果说在Python中还有一款自动化工具能和selenium媲美,那么无疑是pyppeteerpyppeteer是puppeteer的Python版本,puppeteer是Google开源的一个js库,通过一系列高级接口和Chrome或Chromium在DevTools协议下交互,其实现功能如下: 生成页面的截图和PDF。 抓取SPA(单页应用程序)并渲染页面 自动提交表单,UI测试,键盘...
Eclipse是一款强大的集成开发环境,可以用于编写多种编程语言,包括Python。以下是使用Eclipse编写Python教程: 1. 安装Eclipse和Python插件 首先需要安装Eclipse和Python插件。可以从Eclipse官网下载Eclipse,然后在Eclipse Marketplace中搜索并安装Python插件。 2. 创建Python项目 在Eclipse中创建一个新的Python项目。选择File -> New -> PyDev Project,输入项目名称和路径,然后点击Finish。 3. 创建Python文件 在项目中创建一个新的Python文件。选择File -> New -> PyDev Module,输入文件名称和路径,然后点击Finish。 4. 编写Python代码 在新创建的Python文件中编写Python代码。可以使用Eclipse提供的代码补全、语法检查等功能来提高编码效率。 5. 运行Python程序 在Eclipse中运行Python程序。选择Run -> Run As -> Python Run,然后选择要运行的Python文件,点击OK即可运行程序。 以上就是使用Eclipse编写Python的基本教程。希望对你有所帮助!