Pyppeteer goto-> content подпрограмма выполняется в parrarel, когда она должна блокироваться? - PullRequest
0 голосов
/ 24 января 2020

Я использую 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 от чего-либо еще.
Я предположил, что это оригинальное поведение, но мне, кажется, что-то не хватает

...