К этому этапу курса вы уже умеете работать с заголовками запроса, умеете использовать fake_useragent, также умеете работать с прокси и модулем повторных запросов. Давайте теперь напишем эталонный асинхронный парсер, который собирает данные с сайта-тренажера, с применением полученных знаний.
Стек знаний, которые будут использованы в коде, представлен ниже.
Библиотека asyncio;
Библиотека aiohttp;
Подключим прокси через ProxyConnector;
Использует библиотеку fake_useragent для подмены нашего user_agent;
Ну и конечно же применим aiohttp-retry;
Для запуска кода ниже потребуется хотя-бы один рабочий прокси.
import aiohttp
import asyncio
import requests
from bs4 import BeautifulSoup
from aiohttp_socks import ChainProxyConnector
from aiohttp_retry import RetryClient, ExponentialRetry
from fake_useragent import UserAgent
category_lst = []
pagen_lst = []
domain = 'https://mob25.com/'
def get_soup(url):
resp = requests.get(url=url)
return BeautifulSoup(resp.text, 'lxml')
def get_urls_categories(soup):
all_link = soup.find('div', class_='nav_menu').find_all('a')
for cat in all_link:
category_lst.append(domain + cat['href'])
def get_urls_pages(category_lst):
# Заносит ссылки на все страницы в категориях в общий список pagen_lst
for cat in category_lst:
soup = get_soup(cat)
for pagen in soup.find('div', class_='pagen').find_all('a'):
pagen_lst.append(domain + pagen['href'])
async def get_data(session, link):
retry_options = ExponentialRetry(attempts=5)
retry_client = RetryClient(raise_for_status=False, retry_options=retry_options, client_session=session,
start_timeout=0.5)
async with retry_client.get(link) as response:
if response.ok:
resp = await response.text()
soup = BeautifulSoup(resp, 'lxml')
item_card = [x['href'] for x in soup.find_all('a', class_='name_item')]
for x in item_card:
url2 = domain + x
async with session.get(url=url2) as response2:
resp2 = await response2.text()
soup2 = BeautifulSoup(resp2, 'lxml')
article = soup2.find('p', class_='article').text
name = soup2.find('p', id='p_header').text
price = soup2.find('span', id='price').text
print(url2, price, article, name)
async def main():
ua = UserAgent()
fake_ua = {'user-agent': ua.random}
connector = ChainProxyConnector.from_urls(
[
'socks5://D2Frs6:75JjrW@194.28.210.39:9867',
'socks5://D2Frs6:75JjrW@194.28.209.68:9925',
]
)
async with aiohttp.ClientSession(connector=connector, headers=fake_ua) as session:
tasks = []
for link in pagen_lst:
task = asyncio.create_task(get_data(session, link))
tasks.append(task)
await asyncio.gather(*tasks)
url = 'https://mob25.com/'
soup = get_soup(url)
get_urls_categories(soup)
get_urls_pages(category_lst)
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
asyncio.run(main())