У Python існують бібліотеки для надсилання HTTPS-запитів і виконання скрапінгу, однак використання cURL через PycURL дає змогу робити це ефективніше. У цьому посібнику ми покажемо, як застосовувати Python cURL для скрапінгу веб-сторінок на прикладах і проведемо порівняльний аналіз з іншими популярними бібліотеками, такими як Requests, HTTPX і AIOHTTP.
Команди cURL можна використовувати безпосередньо в терміналі для виконання різних завдань, включно з надсиланням GET і POST запитів.
Приклади команд cURL:
# GET запит
curl -X GET "https://httpbin.org/get"
# POST запит
curl -X POST "https://httpbin.org/post"
Для використання cURL у Python нам потрібна бібліотека "pycurl", яка надає інтерфейс Python до бібліотеки cURL.
Встановлення PycURL:
pip install pycurl
PycURL дає змогу керувати HTTP-запитами в Python. Нижче наведено приклад, що демонструє, як зробити GET-запит з використанням PycURL:
import pycurl
import certifi
from io import BytesIO
# Створюємо об'єкт BytesIO для зберігання даних відповіді
buffer = BytesIO()
# Ініціалізуємо об'єкт cURL
c = pycurl.Curl()
# Встановлюємо URL для HTTP GET-запиту
c.setopt(c.URL, 'https://httpbin.org/get')
# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)
# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Виконуємо HTTP-запит
c.perform()
# Закриваємо об'єкт cURL для звільнення ресурсів
c.close()
# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()
# Декодуємо і виводимо відповідь
print(body.decode('iso-8859-1'))
У PycURL використовуйте опцію POSTFIELDS. Приклад виконання POST-запиту з використанням PycURL:
import pycurl
import certifi
from io import BytesIO
# Створюємо об'єкт BytesIO для зберігання даних відповіді
buffer = BytesIO()
# Ініціалізуємо об'єкт cURL
c = pycurl.Curl()
# Встановлюємо URL для HTTP POST-запиту
c.setopt(c.URL, 'https://httpbin.org/post')
# Встановлюємо дані для відправлення
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)
# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)
# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Виконуємо HTTP-запит
c.perform()
# Закриваємо об'єкт cURL для звільнення ресурсів
c.close()
# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()
# Декодуємо і виводимо відповідь
print(body.decode('iso-8859-1'))
Часто потрібне встановлення користувацьких заголовків або аутентифікація для HTTP-запитів. Нижче наведено приклад встановлення користувацьких заголовків за допомогою PycURL:
import pycurl
import certifi
from io import BytesIO
# Створюємо об'єкт BytesIO для зберігання даних відповіді
buffer = BytesIO()
# Ініціалізуємо об'єкт cURL
c = pycurl.Curl()
# Встановлюємо URL для HTTP GET-запиту
c.setopt(c.URL, 'https://httpbin.org/get')
# Встановлюємо кастомні HTTP-заголовки
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])
# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)
# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Виконуємо HTTP-запит
c.perform()
# Закриваємо об'єкт cURL для звільнення ресурсів
c.close()
# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()
# Декодуємо і виводимо відповідь
print(body.decode('iso-8859-1'))
Аналіз і обробка XML-відповідей вкрай важливі під час роботи з API. Нижче наведено приклад обробки XML-відповідей з використанням PycURL:
# Імпортуємо необхідні бібліотеки
import pycurl # Бібліотека для виконання HTTP-запитів
import certifi # Бібліотека для перевірки SSL-сертифікатів
from io import BytesIO # Бібліотека для роботи з потоками байтів
import xml.etree.ElementTree as ET # Бібліотека для парсингу XML
# Створюємо буфер для зберігання даних відповіді
buffer = BytesIO()
# Ініціалізуємо об'єкт cURL
c = pycurl.Curl()
# Встановлюємо URL для HTTP GET-запиту
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')
# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)
# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Виконуємо HTTP-запит
c.perform()
# Закриваємо об'єкт cURL для звільнення ресурсів
c.close()
# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()
# Парсимо XML-вміст в об'єкт ElementTree
root = ET.fromstring(body.decode('utf-8'))
# Виводимо тег і атрибути кореневого елемента XML-дерева
print(root.tag, root.attrib)
Якісна обробка та усунення помилок необхідні для виконання HTTP-запитів. Нижче наведено приклад оброблення помилок із використанням PycURL:
import pycurl # Імпортуємо бібліотеку pycurl
import certifi # Імпортуємо бібліотеку certifi
from io import BytesIO # Імпортуємо BytesIO для обробки потоків байтів
# Ініціалізуємо об'єкт Curl
c = pycurl.Curl()
buffer = BytesIO()
# Встановлюємо URL для HTTP-запиту
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
try:
# Виконуємо HTTP-запит
c.perform()
except pycurl.error as e:
# У разі помилки під час запиту перехоплюємо виняток pycurl.error
errno, errstr = e.args # Отримуємо номер помилки та повідомлення про помилку
print(f'Error: {errstr} (errno {errno})') # Виводимо повідомлення про помилку та номер помилки
finally:
# Закриваємо об'єкт Curl для звільнення ресурсів
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1')) # Декодуємо і виводимо відповідь
Виправлений код коригує URL до "https://example.com", усуваючи проблеми з протоколом. Процес налаштування запиту, його виконання та обробки помилок залишається таким самим, як у вихідному коді. При успішному отриманні відповіді, "body" знову декодується і виводиться.
import pycurl # Імпортуємо бібліотеку pycurl
import certifi # Імпортуємо бібліотеку certifi
from io import BytesIO # Імпортуємо BytesIO для обробки потоків байтів
# Повторно ініціалізуємо об'єкт Curl
c = pycurl.Curl()
buffer = BytesIO()
# Коригуємо URL для використання HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
try:
# Виконуємо виправлений HTTP-запит
c.perform()
except pycurl.error as e:
# У разі помилки під час запиту перехоплюємо виняток pycurl.error
errno, errstr = e.args # Отримуємо номер помилки та повідомлення про помилку
print(f'Error: {errstr} (errno {errno})') # Виводимо повідомлення про помилку та номер помилки
finally:
# Закриваємо об'єкт Curl для звільнення ресурсів
c.close()
body = buffer.getvalue()
print(body.decode('iso-8859-1')) # Декодуємо і виводимо відповідь
cURL надає безліч розширених опцій для контролю HTTP-запитів, як-от керування кукі й таймаутами. Нижче наведено приклад, що демонструє розширені опції з використанням PycURL.
import pycurl # Імпортуємо бібліотеку pycurl
import certifi # Імпортуємо бібліотеку certifi для перевірки SSL-сертифікатів
from io import BytesIO # Імпортуємо BytesIO для обробки потоків байтів
# Створюємо буфер для зберігання даних відповіді
buffer = BytesIO()
# Ініціалізуємо об'єкт Curl
c = pycurl.Curl()
# Встановлюємо URL для HTTP-запиту
c.setopt(c.URL, 'http://httpbin.org/cookies')
# Вмикаємо кукі, встановивши певну пару ключ-значення
c.setopt(c.COOKIE, 'cookies_key=cookie_value')
# Встановлюємо таймаут запиту в 30 секунд
c.setopt(c.TIMEOUT, 30)
# Встановлюємо буфер для збереження вихідних даних
c.setopt(c.WRITEDATA, buffer)
# Встановлюємо шлях до файлу пакета CA для перевірки SSL/TLS
c.setopt(c.CAINFO, certifi.where())
# Виконуємо HTTP-запит
c.perform()
# Закриваємо об'єкт Curl для звільнення ресурсів
c.close()
# Отримуємо вміст відповіді з буфера
body = buffer.getvalue()
# Декодуємо відповідь з використанням кодування UTF-8 і виводимо її
print(body.decode('utf-8'))
Під час роботи з HTTP-запитами в Python виокремлюються чотири популярні бібліотеки: PycURL, Requests, HTTPX і AIOHTTP. У кожної з них є свої переваги та недоліки. Ось порівняльний аналіз для визначення найбільш підходящого інструменту:
Бібліотека | PycURL | Requests | HTTPX | AIOHTTP |
---|---|---|---|---|
Простота використання | Помірна | Дуже просто | Просто | Помірна |
Продуктивність | Висока | Помірна | Висока | Висока |
Підтримка асинхронності | Ні | Ні | Так | Так |
Стрімінг | Так | Обмежений | Так | Так |
Підтримка протоколів | Широка (підтримує безліч протоколів) | HTTP/HTTPS | HTTP/HTTPS, HTTP/2, WebSockets | HTTP/HTTPS, WebSockets |
Порівняльний аналіз показав, що PycURL надає високу продуктивність і гнучкість для просунутих користувачів, тоді як Requests і HTTPX підходять для більш простих та інтуїтивних сценаріїв. AIOHTTP виділяється в асинхронних завданнях, надаючи сучасні інструменти для роботи з асинхронними запитами.
Вибір відповідної бібліотеки залежить від конкретних завдань і вимог вашого проекту. PycURL стане чудовим вибором для тих, хто потребує високої швидкості та розширених можливостей керування HTTP-запитами.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Коментарі: 0