Я использую pyppeteer
для сканирования некоторых URL, однако кажется, что page.goto()
здесь не блокирует экземпляр страницы должным образом.
У меня есть этот скрипт, который запускает 2 браузера и сканирует 10 http://httpbin.org/uuid URL-адреса с использованием случайного браузера для каждого URL-адреса:
import asyncio
import random
import re
from asyncio import gather
from typing import List
from pyppeteer import launch
from pyppeteer.page import Page
async def get_browser() -> Page:
browser = await launch(
headless=False,
)
page = await browser.newPage()
return page
async def crawl_url(url, page: Page) -> str:
resp = await page.goto(url, waitUntil='domcontentloaded')
await page.waitFor(1000)
body = await page.content()
return re.findall('"uuid": "(.+?)"', body)[0]
async def crawl(urls: List[str], browser_count: int):
# get 2 browsers
browsers = [await get_browser() for _ in range(browser_count)]
futures = gather(
# use random browser for every url
*(crawl_url(url, random.choice(browsers)) for url in urls)
)
return await futures
if __name__ == '__main__':
loop = asyncio.get_event_loop()
urls = ['http://httpbin.org/uuid'] * 10
results = loop.run_until_complete(crawl(urls, 2))
print(len(results))
print('------')
print(len(list(set(results))))
Здесь ожидается следующее:
10
------
10
Но я получаю следующее:
10
------
2
Затем при отладке кажется, что происходит только 2 goto
вызовов и 10 content()
вызовов. Таким образом, я получаю 10 результатов, но только 2 уникальных.
Я бы хотел как-то убедиться, что crawl_url
сопрограмма заблокирует использование использованного page
от чего-либо еще.
Я предположил, что это оригинальное поведение, но мне, кажется, что-то не хватает