1
0
Fork 0
digitalstudium.com/content/ru/python-lifehacks/how-to-load-multiple-web-pa...

2.6 KiB
Raw Permalink Blame History

title date
Python: Как параллельно загрузить несколько веб-страниц 2022-05-15

В этой статье описывается, как загружать содержимое нескольких веб-страниц с нескольких URL-адресов параллельно с помощью Python.

Шаг 1. Установка aiohttp

Сначала нужно установить пакет aiohttp. Для установки aiohttp выполните команду:

pip install aiohttp[speedups]

Суффикс [speedups] нужен для установки ускоряющих aiohttp пакетов - aiodns, cchardet.

Шаг 1. Создание скрипта

Затем создайте файл main.py с таким кодом:

import aiohttp
import asyncio
import socket


async def fetch_urls(urls):
	resolver = aiohttp.AsyncResolver()
	connector = aiohttp.TCPConnector(resolver=resolver, family=socket.AF_INET, use_dns_cache=False)
	session = aiohttp.ClientSession(connector=connector)

	async def fetch_url(url, session):
		async with session.get(url) as resp:
			print(resp.status)
			print(await resp.text())

	tasks = [fetch_url(url, session) for url in urls]
	await asyncio.gather(*tasks)
	await session.close()


loop = asyncio.get_event_loop()

urls = ['http://httpbin.org/get?key=value1', 'http://httpbin.org/get?key=value2', 'http://httpbin.org/get?key=value3']

loop.run_until_complete(fetch_urls(urls))								

Теперь можно запустить созданный файл с помощью команды:

python3 main.py

Вы увидите примерно такой вывод:

200
{
    "args": {
    "key": "value2"
    }, 
    "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
...	

Все три запроса при этом выполнятся параллельно. Вы можете добавить любые url-ы в список urls, например:

urls = ['https://yandex.com', 'https://google.com', 'https://yahoo.com']

Чтобы выполнить HEAD, POST, PUT, DELETE запросы, просто замените в коде session.get(url) на соответствующий метод:

session.post('http://httpbin.org/post', data=b'data')
session.put('http://httpbin.org/put', data=b'data')
session.delete('http://httpbin.org/delete')
session.head('http://httpbin.org/get')
session.options('http://httpbin.org/get')
session.patch('http://httpbin.org/patch', data=b'data')