在很多时候, 写爬虫的过程中, 不得不使用一些自动化工具来完成抓取, pyppeteer就是一个很好的选择, 一般情况下, 会选择页面加载完成后, 点击按钮等等, 但是有时候, 我们只需要其中的一些数据, 比如a标签的href, 其它的都不重要, 等待其它文件加载, 反而会影响爬虫的效率, 这时候, 就可以选择过滤一些无用文件的加载, 在缩短页面加载时间
# -*- coding: utf-8 -*-# @Author: Mehaei# @Date: 2022-06-13 18:45:33# @Last Modified by: Mehaei# @Last Modified time: 2022-06-13 18:45:33import asynciofrom pyppeteer import launchclass PageMiddleware(object):async def add_intercept(page):await page.setRequestInterception(True)page.on('request', PageMiddleware.intercept_request)page.on('response', PageMiddleware.intercept_response)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_()async def intercept_response(res):resourceType = res.request.resourceTypeprint("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 设置浏览器最大化
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.
解决
pip3 install websockets==6.0 --force-reinstall
3 移除自动化提示框
移除 Chrom正受到自动测试软件的控制提示
from pyppeteer import launchertry:launcher.AUTOMATION_ARGS.remove("--enable-automation")except:passtry:launcher.DEFAULT_ARGS.remove("--enable-automation")except:passfrom pyppeteer import launch
文章来源于公众号: pyppeteer实现不加载image,css等大文件, 缩短页面加载时间