Получение данных с использованием cURL и Python

Создание GET и POST-запросов для получения данных от сервера при помощи cURL
cURL является самым популярным инструментом командной строки для передачи информации по сетям. Он легко настраивается и предлагает библиотеки на нескольких языках программирования, что делает его хорошим выбором для автоматического парсинга веб-страниц. Одним из языков, с которым он хорошо работает является Python.
cURL и Python могут помочь вам писать запросы API, отлаживать сложные экземпляры и извлекать любые данные с веб-страниц. В этой статье будет показано, как вы можете использовать эти два инструмента в сочетании, особенно для запросов POST и GET. Мы будем использовать пакет PycURL.

Краткая информация о cURL

cURL - это инструмент и библиотека командной строки с открытым исходным кодом, который используется для передачи данных в командных строках или сценариях с синтаксисом URL. Он поддерживает почти 26 протоколов; множества сложных задач, с которыми он может справиться: аутентификация пользователей, загрузка FTP и тестирование REST API.
В Python cURL передает запросы и данные на серверы и с серверов с помощью PycURL. PycURL функционирует как интерфейс для библиотеки libcURL в Python.
Почти каждый язык программирования может использовать REST API для доступа к эндпоинту, размещенной на веб-сервере. Вместо того, чтобы создавать веб-вызовы с использованием Java, Python, C++, JavaScript или Ruby, вы можете вызывать с помощью cURL, который предлагает независимый от языка способ отображения HTTP-запросов и их ответов. Затем можете перевести запросы в формат, соответствующий вашему языку.
Вот некоторые из преимуществ, которые предлагает cURL:
  • Он универсальный. Он работает практически со всеми операционными системами и устройствами и поддерживает широкий спектр протоколов, включая HTTP, FILE и FTP.
  • Помогает протестировать конечные точки и определить, работают ли они.
  • Низкоуровневый инструмент командной строки, предлагающий отличную производительность для передачи данных HTTP-запросов.
  • Предоставляет отчеты о том, что было отправлено или получено, что может быть полезно при устранении неполадок.

PycURL

PycURL должен убедиться, что библиотека SSL, на которой он построен, совпадает с libcURL и, следовательно, PycURL. Настройка PycURL.py использует curl-config для этого.

pip install pycurl

certifi

Certifi используется для предоставления SSL корневыми сертификатами Mozilla. Вы можете узнать больше о сертификатах на сайте описания проекта.

pip install certifi

Создание GET-запросов

GET-запросы используются для получения ресурсов с HTTP-серверов. Чтобы создать GET-запрос, создайте соединение между cURL и веб-страницей.

import pycurl
import certifi
from io import BytesIO
# Creating a buffer as the cURL is not allocating a buffer for the network response
buffer = BytesIO()
c = pycurl.Curl()
#initializing the request URL
c.setopt(c.URL, 'https://www.scrapingbee.com/')
#setting options for cURL transfer  
c.setopt(c.WRITEDATA, buffer)
#setting the file name holding the certificates
c.setopt(c.CAINFO, certifi.where())
# perform file transfer
c.perform()
#Ending the session and freeing the resources
c.close()

Нужно будет создать буфер, потому что cURL не выделяет его для сетевого ответа. Используйте buffer = BytesIO():

#retrieve the content BytesIO
body = buffer.getvalue()
#decoding the buffer 
print(body.decode('iso-8859-1'))

Результат должен быть примерно таким:

<!DOCTYPE html> <html lang="en"> <head> <meta name="generator" content="Hugo 0.60.1"/> <meta charset="utf-8"/> <meta http-equiv="x-ua-compatible" content="ie=edge"/> <title>ScrapingBee - Web Scraping API</title> <meta name="description" content="ScrapingBee is a Web Scraping API that handles proxies and Headless browser for you, so you can focus on extracting the data you want, and nothing else."/> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/> <meta name="twitter:title" content="ScrapingBee - Web Scraping API"/>...

Создание POST-запросов

Метод POST - это способ по умолчанию отправлять данные на HTTP-сервер или создавать и обновлять данные.

Для POST-запросов используют функцию c.setopt(c.POSTFIELDS, postfields). Это означает, что программа отправит данные JSON на сервер, заполнив данные переменной данными JSON для отправки и указав «Content-Type» как «application/json».

import pycurl
from urllib.parse import urlencode

c = pycurl.Curl()
#initializing the request URL
c.setopt(c.URL, 'https://httpbin.org/post')
#the data that we need to Post
post_data = {'field': 'value'}
# encoding the string to be used as a query
postfields = urlencode(post_data)
#setting the cURL for POST operation
c.setopt(c.POSTFIELDS, postfields)
# perform file transfer
c.perform()
#Ending the session and freeing the resources
c.close()

Обратите внимание, что c.POSTFIELDS используется для настройки HTTP-запроса на операцию POST. Вы можете получить больше информации о urlencode из документации Python.

Поиск ответов

Чтобы найти в ответах определенные данные, используйте API c.getinfo() для доступа к дополнительным данным. Вернитесь к упомянутому ранее примеру GET и добавьте эти две строки в конце:

# page response code, Ex. 200 or 404.
print('Response Code: %d' % c.getinfo(c.RESPONSE_CODE))

Необходимо вызвать c.getinfo(c.RESPONSE_CODE)) перед c.close(), иначе код не будет работать. Более подробная информацию о getinfo() в документации PycURL.

Простой парсинг

Когда выполняется код для парсинга Интернета, он запрашивает указанный URL-адрес. Веб-сервер передает данные и позволяет получить доступ к вашей HTML- или XML-странице в ответ. Код анализирует HTML или XML-страницу, а затем находит и извлекает информацию.
Чтобы собрать данные с помощью парсера на Python, выполните следующие действия:
  • передайте URL-адрес, который необходимо спарсить;
  • изучите страницу, чтобы найти нужные данные;
  • напишите код и извлеките данные;
  • сохраните данные в необходимом формате.
Например, вот простой код Python, чтобы показать, как выглядит код разбора ответов HTML. Этот код следует примеру, приведенным ранее совместно использующей буферную переменную:

rom html.parser import HTMLParser
class  Parser(HTMLParser):
    #creating lists to parse the data in
    StartTags_list = list()
    EndTags_list = list()
    StartEndTags_list = list()
    Comments_list = list()
    
    def  handle_starttag(self, startTag, attrs):
        self.StartTags_list.append(startTag)
    def  handle_endtag(self, endTag):
        self.EndTags_list.append(endTag)
    def  handle_startendtag(self,startendTag, attrs):
        self.StartEndTags_list.append(startendTag) 
    def  handle_comment(self,data):
        self.Comments_list.append(data)
s = Parser()
body = buffer.getvalue()
x = body.decode('iso-8859-1')
s.feed(x)
print( s.Comments_list)
Для вывода используйте [' navigation ', ' JS Plugins ']
Узнайте больше о HTML-парсере Python lib в документации.

Запись данных ответа в файл

Самый простой способ написать ответ в файл — использовать метод open() с нужными вам атрибутами:
file1 = open("MyParsed.txt","a")
file1.writelines(s.StartEndTags_list)
file1.close()
Откроется файл с именем MyParsed.txt. Добавьте в него разобраненные StartEndTags и закройте файл.
Вы можете узнать больше о том, как использовать метод open в документации.

Заключение

PycURL предлагает большую гибкость в том, как получать информацию из Интернета, а также для других задач, таких как аутентификация пользователей или SSL-соединения. Это мощный инструмент, который хорошо работает с программами Python, особенно при использовании PycURL. PycURL - это пакет более низкого уровня по сравнению с Requests и другим популярным HTTP-клиентом на Python. Он не так прост в использовании, но намного быстрее, если нужны одновременные соединения.

Нужен парсинг сайтов?