Можно ли одновременно вызывать рекурсивную (парсинговую) функцию? - PullRequest
0 голосов
/ 10 марта 2020

Я уже написал некоторый параллельный код для веб-шифрования с синтаксисом asyncio, aiohttp и async / await. В этой ситуации я собрал URL-список всех веб-страниц, которые меня заинтересовали, и отправил его на событие l oop, более или менее в этом примере кода:

futures = [asyncio.ensure_future(fetch(url,session)) for url in URLlist]
data_list=[[data[i] for i in range(len(data))] for data in await asyncio.gather(*futures)]

Теперь я попробовал очистить другой веб-сайт, где я не могу (или, по крайней мере, не знаю, как) извлечь urlist перед началом анализа. Глядя на пример Scrapy на их главной странице Я эмулировал их функцию follow (используемую для извлечения URL-адреса nextpage для подачи сканера) с помощью рекурсии следующим образом:

def parse (url):
html=requests.get(url)
soup = BeautifulSoup(html.content,"html.parser")
#... code to extract post information...
nextpage = soup.select_one('a.blog-pager-older-link')
if nextpage is not None:
    nexthref = nextpage.get('href')
    parse(nexthref)

It мне кажется, что используется тот же лог c, что и в Scrapy: вам нужен запрос GET (ожидание ввода / вывода) -> html синтаксический анализ -> найти в содержимом href url -> recursion . Но Scrapy (я не знаю много об этом, поэтому могу ошибаться) рекламируется как нативная библиотека одновременно.

Но как он может быть параллельным, если это необходимо (по крайней мере, в примере в их основной страница) ждать запроса ввода-вывода перед доступом к URL следующей страницы? Для той же логики c Я не нахожу способ сделать мой код асинхронным.

Может ли кто-нибудь с большим пониманием этого вопроса дать мне какой-либо совет, если возможно сделать его асинхронным / параллельным, и если это Пример Scrapy истинный asyn c или нет?

Здесь кажется, что они делают asyn c фазу обработки (извлечения) кода, но не запрос ( ПОЛУЧИТЬ) фаза действительно замедляет код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...