перейти к содержанию

Как использовать cURL в Python: подробное руководство по парсингу веб-страниц

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 слов, для ваших собственных проектов. Дайте мне знать, если у вас есть еще вопросы!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *