
需求背景
在很多时候, 写爬虫的过程中, 不得不使用一些自动化工具来完成抓取, pyppeteer就是一个很好的选择, 一般情况下, 会选择页面加载完成后, 点击按钮等等, 但是有时候, 我们只需要其中的一些数据, 比如a标签的href, 其它的都不重要, 等待其它文件加载, 反而会影响爬虫的效率, 这时候, 就可以选择过滤一些无用文件的加载, 在缩短页面加载时间
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| # -*- 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
设置浏览器最大化
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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.
解决
1
| pip3 install websockets==6.0 --force-reinstall
|
3
移除自动化提示框
移除 Chrom正受到自动测试软件的控制提示
1 2 3 4 5 6 7 8 9 10 11 12
| 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
|