首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyppeteer RequestSetIntercept函数:协程从未被等待过

Pyppeteer RequestSetIntercept函数:协程从未被等待过
EN

Stack Overflow用户
提问于 2021-07-26 06:00:58
回答 1查看 213关注 0票数 0

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

然而,我得到了警告:

RuntimeWarning:从未等待过协程“block_image”

我不知道我错过了等待的地方。我已经根据我在网上找到的一个模板添加了带有intercept函数本身的等待。我正在用Pyppeeteer测试setIntercept函数。

谢谢。

代码语言:javascript
复制
#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:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-08-04 22:25:30

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

代码语言:javascript
复制
if intercept_func is not None:
    await page.setRequestInterception(True)
    page.on('request', lambda request: asyncio.create_task(intercept_func(request)))

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68522812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档