• Home
  • Уроки новичков
  • Изучаем пакет httpx: Асинхронные запросы, callback функции и сравнение производительности

Изучаем пакет httpx: Асинхронные запросы, callback функции и сравнение производительности

Image

Добро пожаловать на мой новый видеоурок на YouTube, посвященный изучению пакета httpx и его возможностей для асинхронных запросов! В этом видео я не только покажу вам, как правильно выполнять асинхронные запросы с использованием httpx и callback функций, но и проведу сравнение производительности между асинхронными и синхронными запросами.

Сначала мы начнем с вводной части, где я расскажу о пакете httpx, его установке и основных возможностях. Затем мы перейдем к асинхронным запросам и я покажу вам, как эффективно использовать httpx для выполнения параллельных запросов. Вы узнаете о преимуществах асинхронности и том, как она может существенно улучшить производительность вашего кода.

Далее мы погрузимся в мир callback функций. Я подробно объясню, что такое callback функции и как их использовать с httpx для обработки ответов от сервера. Вы научитесь создавать эффективные обработчики ответов и работать с ними асинхронно, чтобы ваш код был более гибким и масштабируемым.

Но самое интересное начнется, когда мы проведем сравнение производительности между асинхронными и синхронными запросами. Я покажу вам примеры кода и выполню тесты, чтобы показать разницу во времени выполнения скрипта при использовании этих двух подходов. Вы сможете сами увидеть, насколько асинхронные запросы могут быть более эффективными и сократить время выполнения операций.

Не пропустите этот увлекательный видеоурок, где вы узнаете о пакете httpx, научитесь делать асинхронные запросы, использовать callback функции и увидите сравнение производительности между асинхронными и синхронными подходами. Подписывайтесь на мой канал, чтобы быть в курсе новых видео о разработке и программировании. Давайте начнем изучение пакета httpx и улучшение производительности ваших запросов уже сегодня!

import asyncio
import re

from bs4 import BeautifulSoup
import requests
import httpx
import time

time_start = time.time()

url = 'https://google.com'

headers = {
    'accept-language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'
}


async def process_request(request: httpx.Request):
    print(f'Отправили {request.method} запрос на хост {request.url}.')


async def process_response(response: httpx.Response):
    print(f'Статус запроса {response.status_code}')
    response_result = await response.aread()
    beautifulsoup: BeautifulSoup = BeautifulSoup(markup=response_result, features='lxml')
    cards = beautifulsoup.find_all(name='table', class_='model-short-block')

    for card in cards:
        model = card.find(name='a', id=re.compile('product')).find(name='span', class_='u').text

        try:
            memory = card.find(name='a', id=re.compile('product')).find(name='span', class_='list-conf-name ib nobr').text
        except AttributeError:
            memory = 'Не указана'

        try:
            price = card.find(name='div', class_=re.compile('model-price-range')).find('a').text
        except AttributeError:
            price = 'Не указана'

        output = f'{model};{memory};{price}'
        out_list.append(output)


async def get_page(number: int):
    async with httpx.AsyncClient(headers=headers, follow_redirects=True, event_hooks={'request': [process_request], 'response': [process_response]}) as htx:
        result: httpx.Response = await htx.get(url=f'https://ek.ua/list/122/{number}/')
        # TODO сделать смену прокси и юзерагента
        if result.status_code != 200:
            return await get_page(number=number)


async def main():
    tasks = []

    for page in range(0, 5):
        tasks.append(get_page(number=page))

    await asyncio.gather(*tasks)

    with open(file='out.csv', mode='w', encoding='cp1251') as file:
        file.write(f'Модель;Память;Цена\n')
        for element in out_list:
            file.write(element + '\n')


out_list = []
asyncio.run(main())

time_finish = time.time() - time_start
print(f'Время работы скрипта: {time_finish:.2f}')
Image