К этому этапу курса вы уже умеете работать с заголовками запроса, умеете использовать 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())