Я делаю скрипт, который получает HTML-код почти 20 000 страниц и анализирует его, чтобы получить только его часть.
Мне удалось получить содержимое в 20 000 страниц в кадре данных с асинхронными запросами, используя asyncio и aiohttp, но этот сценарий все еще ждет, пока все страницы будут выбраны для их анализа.
async def get_request(session, url, params=None):
async with session.get(url, headers=HEADERS, params=params) as response:
return await response.text()
async def get_html_from_url(urls):
tasks = []
async with aiohttp.ClientSession() as session:
for url in urls:
tasks.append(get_request(session, url))
html_page_response = await asyncio.gather(*tasks)
return html_page_response
html_pages_list = asyncio_loop.run_until_complete(get_html_from_url(urls))
Получив содержимое каждой страницы, мне удалось использовать пул многопроцессорной обработки для распараллеливания синтаксического анализа.
get_whatiwant_from_html(html_content):
parsed_html = BeautifulSoup(html_content, "html.parser")
clean = parsed_html.find("div", class_="class").get_text()
# Some re.subs
clean = re.sub("", "", clean)
clean = re.sub("", "", clean)
clean = re.sub("", "", clean)
return clean
pool = Pool(4)
what_i_want = pool.map(get_whatiwant_from_html, html_content_list)
Этот код асинхронно смешивает выборку и синтаксический анализ, но мне бы хотелосьинтегрировать в него многопроцессорность:
async def process(url, session):
html = await getRequest(session, url)
return await get_whatiwant_from_html(html)
async def dispatch(urls):
async with aiohttp.ClientSession() as session:
coros = (process(url, session) for url in urls)
return await asyncio.gather(*coros)
result = asyncio.get_event_loop().run_until_complete(dispatch(urls))
Есть ли очевидный способ сделать это?Я думал о создании 4 процессов, каждый из которых выполняет асинхронные вызовы, но реализация выглядит немного сложной, и мне интересно, есть ли другой способ.
Я очень новичок в asyncio и aiohttp, так что если у вас есть что-то, чтобыпосоветуйте мне почитать, чтобы лучше понять, я буду очень счастлив.