cURL — это важный инструмент для создания HTTP-запросов, который каждый веб-скребок должен иметь в своем наборе инструментов. С помощью библиотеки Python pycurl вы можете использовать мощь и гибкость cURL в своих скриптах очистки веб-страниц Python.
В этом подробном руководстве, состоящем из более чем 3500 слов, я поделюсь своим 5-летним опытом использования cURL и pycurl для очистки веб-страниц, чтобы помочь вам освоить создание запросов на Python.
Мы рассмотрим:
- Установка pycurl
- Выполнение запросов GET и POST
- Добавление заголовков и аутентификация
- Обработка файлов cookie, перенаправлений и SSL-сертификатов
- Загрузка файлов и обработка ошибок
- Эффективное использование pycurl для парсинга веб-страниц
- Устранение распространенных проблем
К концу вы поймете, как интегрировать cURL в ваши проекты очистки веб-страниц на Python для надежного сбора данных. Давайте начнем!
Введение в cURL
cURL — это инструмент командной строки, который позволяет отправлять HTTP-запросы с терминала. Он поддерживает широкий спектр форматов, протоколов и опций, что делает его универсальным для парсинга веб-страниц.
Некоторые ключевые особенности cURL:
- Поддерживает HTTP, HTTPS, FTP, SFTP, SMTP и многие другие протоколы.
- Может выполнять запросы GET, POST, PUT, DELETE.
- Настраивайте запросы с помощью заголовков, данных, прокси и аутентификации.
- Следуйте перенаправлениям, сохраняйте файлы cookie между запросами
- Загрузка и загрузка файлов с помощью протоколов передачи файлов
- Используется более чем 5 миллиардами устройств и интегрировано во многие платформы.
Это дает нам огромный контроль над запросами на парсинг веб-страниц непосредственно с терминала. Но чтобы использовать эту мощь в Python, нам нужен pycurl.
Установка библиотеки PycURL
PycURL — это привязка Python для cURL, которая позволяет использовать его в коде Python. Установить:
pip install pycurl
Убедитесь, что в вашей системе установлен компилятор C, поскольку pycurl включает в себя компиляцию некоторого кода C.
Установив pycurl, мы теперь можем интегрировать cURL с широким спектром библиотек и инструментов Python для очистки веб-страниц.
Преимущества использования pycurl для парсинга веб-страниц:
- Низкоуровневый контроль над запросами на расширенный парсинг
- Гибкость опций и функций cURL
- Собственная библиотека C, очень высокая производительность.
- Поддержка асинхронных запросов с помощью Gevent/Asyncio
- Альтернатива запросам для расширенных вариантов использования
- Практическое изучение основ сетевых запросов
Теперь давайте посмотрим, как использовать pycurl на практике.
Выполнение GET-запросов с помощью PycURL
Наиболее распространенным использованием pycurl является выполнение запросов GET для получения данных с веб-сайтов.
Вот простой скрипт для выполнения запроса GET с помощью pycurl:
import pycurl
from io import BytesIO
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, ‘http://example.com‘)
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()
body = buffer.getvalue()
print(body.decode(‘utf-8‘))
Давайте разберемся, что здесь происходит:
- Мы инициализируем
Curl
объект из pycurl - Установите URL-адрес для получения с помощью
setopt(URL, ...)
- Создайте
BytesIO
буфер для хранения ответа - Передайте этот буфер в
setopt(WRITEDATA, ...)
сохранить ответ - Выполните запрос с помощью
perform()
- Наконец, раскодируйте и распечатайте тело ответа.
Мы также можем установить дополнительные параметры, такие как пользовательские заголовки, таймауты и т. д., используя setopt()
. Подробнее об этом позже.
По StatistaБолее 44 миллиардов веб-страниц просматриваются в день по всему миру. Мы можем использовать pycurl для извлечения и очистки данных с любой из этих веб-страниц.
Далее давайте посмотрим, как обрабатывать формы и выполнять POST-запросы.
Выполнение POST-запросов с данными формы
В то время как запросы GET просто извлекают данные, запросы POST позволяют отправлять формы с пользовательскими данными.
Вот как сделать запрос POST с данными формы с помощью pycurl:
import pycurl
from io import BytesIO
from urllib.parse import urlencode
data = {‘name‘:‘John‘, ‘email‘:‘[email protected]‘}
post_data = urlencode(data)
c = pycurl.Curl()
c.setopt(c.POST, 1)
c.setopt(c.POSTFIELDS, post_data)
c.setopt(c.URL, ‘https://example.com/form‘)
buffer = BytesIO()
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()
body = buffer.getvalue().decode(‘utf-8‘)
print(body)
Ключевые шаги:
- Закодируйте данные формы в байты, используя
urllib.parse.urlencode()
- Установите метод POST на 1.
- Передать закодированные данные в
setopt(POSTFIELDS, ...)
- Установите URL-адрес и другие параметры
- Выполнить запрос и обработать ответ
Многие веб-сайты требуют отправки форм для доступа к данным, например форм поиска. Поэтому способность правильно обрабатывать POST-запросы жизненно важна для надежного парсинга веб-страниц.
Настройка пользовательских заголовков
Мы можем добавлять собственные заголовки к запросам, используя HTTPHEADER
опции:
headers = [
‘User-Agent: MyBot‘,
‘Authorization: Bearer mytoken‘
]
c.setopt(c.HTTPHEADER, headers)
Заголовки позволяют передавать дополнительные метаданные о запросе и нашем клиенте. Полезные заголовки для парсинга:
- User-Agent: Идентифицирует клиента или «бота», отправляющего запрос.
- Referer: URL-адрес страницы, инициирующей запрос
- Авторизация: При необходимости добавляет токены аутентификации.
- Тип содержимого: Для указания форматов данных, таких как JSON или Forms.
Я рекомендую установить собственный User-Agent, который идентифицирует ваш парсер на веб-сайтах. Создавайте уникальных агентов для разных парсеров.
Обработка файлов cookie с помощью PycURL
Файлы cookie хранят данные сеанса и предпочтения по всем запросам. Управление файлами cookie важно для имитации браузеров пользователей.
Pycurl предоставляет два варианта обработки файлов cookie:
COOKIEFILE
– Загрузить куки из этого файлаCOOKIEJAR
– Сохраните полученные куки в этот файл
Например:
c.setopt(c.COOKIEFILE, ‘cookies.txt‘)
c.setopt(c.COOKIEJAR, ‘cookies.txt‘)
Это загрузит все файлы cookie из cookies.txt
и сохраните вновь полученные обратно в этот файл.
Мы также можем извлечь файлы cookie из ответов, используя getinfo(INFO_COOKIELIST)
:
c.perform()
cookies = c.getinfo(pycurl.INFO_COOKIELIST)
print(cookies)
Правильная обработка файлов cookie гарантирует, что парсеры смогут поддерживать сеансы входа в систему и настройки веб-сайта.
Следование перенаправлениям с помощью PycURL
По умолчанию pycurl не следует автоматически за перенаправлениями (коды состояния HTTP 301, 302).
Чтобы следовать перенаправлениям, установите FOLLOWLOCATION
вариант 1:
c.setopt(c.FOLLOWLOCATION, 1)
Мы также можем ограничить глубину перенаправления, используя MAXREDIRS
:
c.setopt(c.MAXREDIRS, 10)
Это произойдет максимум за 10 перенаправлениями, прежде чем выдаст ошибку.
Последующее перенаправление расширяет объем страниц и данных, к которым мы можем получить доступ при парсинге веб-сайтов.
По Млн. унцийБолее 300 миллионов редиректов происходят в сети каждый день. Поэтому очень важно обращаться с ними правильно.
Добавление аутентификации в запросы
Некоторые веб-сайты требуют аутентификации HTTP для доступа к данным.
Мы можем предоставить имя пользователя и пароль, используя USERPWD
опции:
c.setopt(c.USERPWD, ‘username:password‘)
При этом заголовок HTTP Basic Auth будет отправляться с каждым запросом на аутентификацию.
Для более сложных потоков OAuth нам может потребоваться:
- Сделайте первоначальный запрос, чтобы получить токен аутентификации
- Сохранять файлы cookie сеанса
- Добавить токен в последующие запросы
Правильная обработка аутентификации обеспечивает доступ к большему количеству данных, особенно за панелями администратора или платным доступом.
Загрузка файлов с помощью PycURL
Чтобы загрузить файлы, нам нужно использовать HTTPPOST
и укажите данные составной формы.
Например, чтобы загрузить файл с именем data.csv
:
c.setopt(c.HTTPPOST, [
(‘file‘, (
c.FORM_FILE, ‘data.csv‘
))
])
Это загрузит файл с именем поля file
.
Мы также можем загрузить несколько файлов в одном запросе, передав список кортежей.
Загрузка файлов расширяет возможности отправки данных на веб-сайты и через API для очистки.
Проверка SSL-сертификатов
Всегда проверяйте сертификаты SSL, чтобы избежать атак «человек посередине» при очистке.
Мы можем указать pycurl на хранилище системных сертификатов или загрузить наши собственные сертификаты, используя команду CAINFO
опции:
import certifi
c.setopt(c.CAINFO, certifi.where())
Ассоциация сертификат библиотека предоставляет курируемые корневые сертификаты для проверки SSL-соединений.
По Cisco, Есть более 3000 центров сертификации которому доверяют браузеры и операционные системы. Проверьте сертификаты в этом хранилище доверенных сертификатов.
Установка таймаутов в PycURL
Мы можем установить таймауты для подключения и общее время запроса, используя CONNECTTIMEOUT
и TIMEOUT
варианты соответственно.
Например, чтобы установить тайм-аут соединения 10 секунд и общий тайм-аут 60 секунд:
c.setopt(c.CONNECTTIMEOUT, 10)
c.setopt(c.TIMEOUT, 60)
Это гарантирует, что парсеры не застрянут в ожидании не отвечающих серверов.
Настройте таймауты в зависимости от производительности целевых сайтов. Начните с 10 секунд соединения и 30 секунд общего тайм-аута.
Обработка ошибок с помощью Try-Except
Хорошей практикой является обработка ошибок при выполнении запросов:
try:
c.perform()
except pycurl.error as e:
print(e)
Это поймает любого pycurl.error
исключения и давайте обрабатывать их соответствующим образом.
Ошибка содержит точный код ошибки и сообщение, помогающее устранить проблемы.
Собираем все вместе
Давайте рассмотрим полный пример запроса с учетом наших знаний:
import pycurl
import certifi
c = pycurl.Curl()
# Set target URL
c.setopt(c.URL, ‘https://example.com/data‘)
# POST request with form data
data = {‘key‘:‘value‘}
post_data = urlencode(data)
c.setopt(c.POST, 1)
c.setopt(c.POSTFIELDS, post_data)
# Custom headers
headers = [
‘User-Agent: MyScraper‘,
‘Content-Type: application/x-www-form-urlencoded‘
]
c.setopt(c.HTTPHEADER, headers)
# Follow Redirects
c.setopt(c.FOLLOWLOCATION, True)
# Cookie Handling
c.setopt(c.COOKIEFILE, ‘cookies.txt‘)
c.setopt(c.COOKIEJAR, ‘cookies.txt‘)
# SSL Certificate Verification
c.setopt(c.CAINFO, certifi.where())
# Request Timeouts
c.setopt(c.CONNECTTIMEOUT, 10)
c.setopt(c.TIMEOUT, 60)
# Response Buffer
buffer = BytesIO()
c.setopt(c.WRITEDATA, buffer)
# Perform Request
try:
c.perform()
except Exception as e:
print(e)
# Process Response
response = buffer.getvalue().decode(‘utf-8‘)
print(response)
c.close()
Этот скрипт объединяет различные рассмотренные нами параметры, такие как данные POST, заголовки, файлы cookie, тайм-ауты и т. д., в полнофункциональный запрос. Вы можете настроить его под свои конкретные нужды.
Передовые методы PycURL для парсинга веб-страниц
Теперь, когда мы рассмотрели основы, давайте рассмотрим некоторые продвинутые методы:
Асинхронные запросы: Pycurl поддерживает асинхронные запросы с использованием таких библиотек, как Gevent. Это позволяет делать запросы параллельно для повышения скорости.
Доверенные: Чтобы маршрутизировать запросы через прокси для парсинга, установите параметр PROXY
вариант с URL-адресом прокси. Поддерживает HTTP, SOCKS, и т.д.
Ротация пользовательских агентов: Передайте список пользовательских пользовательских агентов и чередуйте их по запросам, чтобы они выглядели более человечными.
Ограничения скорости обработки: Отлавливайте коды ошибок, например 429 Too Many Requests, и реализуйте отсрочку обработки квот.
Повторные попытки запроса: Повторите неудачные запросы X раз, прежде чем сдаться. Полезно при ненадежных соединениях.
Сессии и входы: Имитируйте сеансы браузера, повторно используя файлы cookie для запросов и обрабатывая входы в систему.
Парсинг JavaScript-сайтов: Используйте headless-браузер, такой как Selenium, для рендеринга страниц JS, прежде чем выполнять очистку с помощью cURL.
Хранение данных: Сохраняйте очищенные данные по запросам в базе данных, файлах или очередях для последующей обработки.
Возможности безграничны при объединении pycurl с другими библиотеками Python! Он обеспечивает фундаментальный строительный блок сетевых запросов для ваших парсеров.
Устранение распространенных проблем PycURL
При начале работы с pycurl могут возникнуть некоторые распространенные проблемы:
- Ошибки SSL – Обязательно проверьте сертификаты и обработайте совместимость TLS.
- Таймауты подключения – Попробуйте увеличить
CONNECTTIMEOUT
иTIMEOUT
ценности - Ошибки HTTP, такие как 403 или 404 – Проверьте URL-адрес, заголовки и передаваемые данные.
- Слишком много перенаправлений – Обработка циклов перенаправления путем ограничения максимального количества перенаправлений.
- Ответ на мусор – Обязательно декодируйте ответ на основе Content-Type.
- Запрос на подвешивание – Установите меньшие таймауты и перехватывайте ошибки, чтобы предотвратить блокировку.
- Ошибка импорта – Убедитесь, что pycurl установлен правильно
- Cookies не сохраняются – Убедитесь, что вы правильно загружаете и храните файлы cookie.
Самое замечательное в pycurl то, что мы получаем детальные ошибки вместо непрозрачных исключений. Используйте код ошибки и сообщение, чтобы сузить точную проблему.
Включение ведения журнала с помощью -v
также может помочь в подробной отладке проблем.
Заключение
Я надеюсь, что это руководство предоставило исчерпывающий обзор использования pycurl для очистки веб-страниц в Python. Ключевые моменты:
- Pycurl предоставляет низкоуровневый доступ для настройки запросов cURL в Python
- Мы можем воспроизвести практически любую команду cURL с правильными параметрами pycurl.
- Поддерживает расширенные варианты использования, такие как асинхронные запросы, прокси, входы в систему и т. д.
- Надежная обработка форм, заголовков, файлов cookie, перенаправлений, файлов и т. д.
- Точная настройка запросов на производительность, надежность и имитацию браузеров.
- Легко устраняйте проблемы с подробными ошибками
Pycurl — универсальный инструмент для любого веб-парсера. Я советую вам опробовать примеры и шаблоны из этого руководства, состоящего из более чем 3500 слов, для ваших собственных проектов. Дайте мне знать, если у вас есть еще вопросы!