我正在尝试使用RequestSetIntercept函数来加速Pyppeteer的网页加载。
然而,我得到了警告:
RuntimeWarning:从未等待过协程“block_image”
我不知道我错过了等待的地方。我已经根据我在网上找到的一个模板添加了带有intercept函数本身的等待。我正在用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)发布于 2021-08-04 22:25:30
您的函数block_image是一个协程,但是传递给page.on的回调应该是一个普通函数。尝试编写一个将协程包装在Task中的同步lambda函数(从而在当前事件循环上调度它):
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 (正如文档中的示例所做的那样)。
https://stackoverflow.com/questions/68522812
复制相似问题