Эталонный асинхронный парсер



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


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: