【问题标题】:Pyppeteer RequestSetIntercept function : coroutine was never awaitedPyppeteer RequestSetIntercept 函数:从未等待协程
【发布时间】:2021-07-25 22:00:58
【问题描述】:

我正在尝试使用 RequestSetIntercept 函数 使用 Pyppeteer 加快网页加载速度。

但是我收到了警告:

RuntimeWarning:从未等待协程“block_image”

我不知道我在哪里错过了等待。 我已经按照我在网上找到的模板添加了带有拦截功能本身的等待。我正在测试 使用 Pyppeeteer 的 setIntercept 函数。

谢谢。

#utils.py

class MakeRequest():

    ua = User_Agent()

    async def _proxy_browser(self, url,
                             headless = False,
                             intercept_func = None,
                             proxy = True,
                             **kwargs):

        if proxy:
            args = [*proxy*
                '--ignore-certificate-errors']

        else:
            args = ['--ignore-certificate-errors']

        for i in range(3):
            try:
                browser = await launch(headless = headless,
                                       args = args,
                                       defaultViewport = None)
                
                page = await browser.newPage()
                await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0')
                
                if intercept_func is not None:
                    await page.setRequestInterception(True)
                    page.on('request', intercept_func)

                await page.goto(url, {'waitUntil' : 'load', 'timeout': 0 })
                content = await page.content()

                return content

            except (pyppeteer.errors.PageError,
                    pyppeteer.errors.TimeoutError,
                    pyppeteer.errors.BrowserError,
                    pyppeteer.errors.NetworkError) as e:
              print('error', e)
              time.sleep(2)
              continue

            finally:
                await browser.close()
        return 

scraper.py:

REQUESTER = MakeRequest()

async def block_image(request):

        if request.url.endswith('.png') or request.url.endswith('.jpg'):
            print(request.url)
            await request.abort()
        else:
            await request.continue_()


def get_request(url):

     for i in range(3):    
        response =  REQUESTER.proxy_browser_request(url = url,
                                                    headless = False,
                                                    intercept_func = block_image)

        if response:
            return response
        else:
            print(f'Attempt {i +1} : {url}links not found')
            print('retrying...')
            time.sleep(3)

【问题讨论】:

  • asyncio.run(REQUESTER.proxy_browser_request(url = url,...)?
  • @bdbdb 试过了,但似乎没有删除警告。

标签: python-3.x web-scraping pyppeteer


【解决方案1】:

您的函数block_image 是一个协程,但传递给page.on 的回调应该是一个普通函数。尝试编写一个同步的lambda 函数,将协程包装在Task 中(从而在当前事件循环中调度它):

if intercept_func is not None:
    await page.setRequestInterception(True)
    page.on('request', lambda request: asyncio.create_task(intercept_func(request)))

在 Pyppteer 文档here 中有一个此类代码的示例。如果您使用的是旧版本的 Python (asyncio.ensure_future 而不是 asyncio.create_task(如文档中的示例中所做的那样)。

【讨论】:

  • 谢谢你。我已经给你加分了,但是一旦我能够测试出来,我会接受你的回答。只需要几天左右,因为我遇到了 git 危机。
猜你喜欢
  • 2022-07-19
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2019-12-15
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多