前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >pyppeteer实现不加载image,css等大文件, 缩短页面加载时间

pyppeteer实现不加载image,css等大文件, 缩短页面加载时间

作者头像
不止于python
发布2022-07-20 18:25:39
发布2022-07-20 18:25:39
1.5K00
代码可运行
举报
文章被收录于专栏:不止于python不止于python
运行总次数:0
代码可运行

需求背景

在很多时候, 写爬虫的过程中, 不得不使用一些自动化工具来完成抓取, pyppeteer就是一个很好的选择, 一般情况下, 会选择页面加载完成后, 点击按钮等等, 但是有时候, 我们只需要其中的一些数据, 比如a标签的href, 其它的都不重要, 等待其它文件加载, 反而会影响爬虫的效率, 这时候, 就可以选择过滤一些无用文件的加载, 在缩短页面加载时间

代码

代码语言:javascript
代码运行次数:0
复制
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date:   2022-06-13 18:45:33
# @Last Modified by:   Mehaei
# @Last Modified time: 2022-06-13 18:45:33
import asyncio
from pyppeteer import launch


class PageMiddleware(object):
    @staticmethod
    async def add_intercept(page):
        await page.setRequestInterception(True)
        page.on('request', PageMiddleware.intercept_request)
        page.on('response', PageMiddleware.intercept_response)

    @staticmethod
    async def intercept_request(req):
        print("request url", req.url)
        print("request type", req.resourceType)
        if req.resourceType in ['stylesheet', 'script', 'image', 'media', 'eventsource', 'websocket']:
            await req.abort()
        else:
            await req.continue_()

    @staticmethod
    async def intercept_response(res):
        resourceType = res.request.resourceType
        print("response type", resourceType)


async def main():
    browser = await launch(
        headless=False
    )
    page = await browser.newPage()

    await PageMiddleware.add_intercept(page)
    await page.goto("https://www.baidu.com")


if __name__ == "__main__":
    io_loop = asyncio.get_event_loop()
    io_loop.run_until_complete(main())

这样就可以实现过滤不需要的请求, 和处理响应内容

其它问题及解决

1 设置浏览器最大化

代码语言:javascript
代码运行次数:0
复制
    browser = await launch(
        headless=False,
        # 浏览器铺满屏幕
        # args=['--start-fullscreen'],
        # 窗口在浏览器中最大化(mac测试无效)
        # args=['--start-maximized']
    )
    page = await browser.newPage()
    # 设置页面显示区域大小
    # await page.setViewport({
    #     "width": 1024,
    #     "height": 963
    # })

2 页面超时

有时候, 页面明明已经加载完成了, 但还是会报超时错误

Navigation Timeout Exceeded: 30000 ms exceeded.

解决

代码语言:javascript
代码运行次数:0
复制
pip3 install websockets==6.0 --force-reinstall

3 移除自动化提示框

移除 Chrom正受到自动测试软件的控制提示

代码语言:javascript
代码运行次数:0
复制
from pyppeteer import launcher
try:
    launcher.AUTOMATION_ARGS.remove("--enable-automation")
except:
    pass

try:
    launcher.DEFAULT_ARGS.remove("--enable-automation")
except:
    pass
from pyppeteer import launch
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 不止于python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档