Python стал языком, широко используемым разработчиками, потому что он прост, эффективен и гибок. Здесь мы узнаем, как скреативить веб-сайты с помощью Python. Мы изучим несколько основных концепций, но основное внимание мы уделим парсингу в Python с помощью библиотеки Requests.Проще говоря, парсинг означает получение содержимого сайта и извлечение из него нужных данных. Почти все языки программирования предоставляют поддержку для автоматизации этого процесса. Аналогичным образом, в Python также есть библиотеки, позволяющие сделать этот процесс проще и быстрее.
УПРАВЛЕНИЕ НЕДВИЖИМОСТЬЮ
СФЕРА РАЗВЛЕЧЕНИЙ
ИСКУССТВО И КУЛЬТУРА
ДОСТАВКА ТОВАРОВ И ПРОДУКТОВ
База всех компаний в категории: ПУНКТЫ ВЫДАЧИ ИНТЕРНЕТ ЗАКАЗОВ
Существует множество причин, по которым вам следует использовать Python для парсинга. Вот несколько из них:
В зависимости от ваших потребностей и вариантов использования, в Python есть несколько инструментов и библиотек для парсинга. Давайте рассмотрим некоторые из них:
В этой статье мы сосредоточимся на библиотеке Requests. Итак, давайте начнем наше путешествие.
Библиотека Python Requests сделала HTTP-запросы очень простыми, потому что она очень легкая и эффективная, что делает ее отличным выбором для парсинга. Это самый скачиваемый пакет Python, и на это есть веская причина. Он отлично справляется с задачами, которые раньше были сложными и запутанными. Именно поэтому девиз библиотеки Requests — «HTTP для людей».
Давайте установим библиотеку, чтобы мы могли ее использовать. Откройте терминал или командную строку и введите следующую команду, чтобы создать новый каталог и файл Python.
mkdir pythonRequests
cd pythonRequests
touch main.py
Мы будем использовать pip3 для установки Requests:
pip3 install requests
Это должна быть довольно быстрая загрузка. После выполнения команды вы можете подтвердить установку, просто выполнив следующую команду:
pip3 show requests
Это должно вывести имя библиотеки и другую информацию. После завершения установки мы готовы к выполнению HTTP-запросов.
Вам нужно быть осторожным при установке пакетов через pip. Если вы используете Python 3 или выше, вам необходимо использовать pip3 вместе с ним. В противном случае это создаст проблемы.
С помощью библиотеки Requests вы можете не только получать информацию с различных веб-сайтов, но и отправлять информацию на страницы, загружать изображения и выполнять множество других задач. Давайте посмотрим, что предлагает эта библиотека:
Эти методы работают так же, как и разговор с сервером. В ответ на эти методы мы также получаем ответ от сервера. Этот ответ приходит с различными кодами, называемыми кодами состояния. Например, сервер возвращает 200, когда у него есть конкретная запрошенная вещь или файл; 404 означает, что у него нет ничего, связанного с запросом, и так далее.
Теперь наступает момент, когда вы делаете HTTP-запросы. Просто создайте объект Request, используя соответствующий метод для выполнения запроса. Допустим, вы просто хотите получить данные с веб-сайта; используйте для этого метод GET.
import requests
response = requests.get('https://www.lipsum.com/')
print(response.status_code)
print(response.content)
Этот код отправляет GET-запрос на сайт Lorem Ipsum и печатает код состояния и содержимое ответа.
Здесь необходимо упомянуть одну вещь: библиотека Requests — это отличный инструмент для выполнения HTTP-запросов, но она не предназначена для разбора HTML-страниц и получения информации. Если вы хотите сделать это, вам нужно использовать ее вместе с другими библиотеками, например, Beautiful Soup.
Получив ответ, вы можете применить к нему различные методы; ниже приведены некоторые из них:
Reply.content и response.text извлекают данные в различных форматах. response.content полезен при работе с изображениями или pdf. response.text помогает нам извлекать данные в виде HTML.
Давайте сделаем запрос и посмотрим, будет ли он успешным.
import requests
response = requests.get("https://www.wikipedia.org")
if response.status_code == 200:
print("It's a successful Get requested")
else:
print("The server returned the Status code: ", response.status_code)
Этот код отправляет GET-запрос на веб-сайт. Он возвращает «Это успешный Get requested», если ответ успешный. В противном случае он печатает «The server returned the Status code:» с кодом состояния.
При извлечении данных с веб-сайтов мы можем взаимодействовать с различными типами данных. Requests специально предоставляет встроенные методы для работы с различными типами данных. Вот некоторые из них с примерами.
После выполнения запроса к веб-сайту, если сервер возвращает HTML-файл веб-страницы, вот как это можно сделать:
import requests
response = requests.get("https://www.wikipedia.org")
htmlResponse = response.text
print(htmlResponse)
Код отправляет GET-запрос на сайт Википедии и преобразует ответ в HTML.
Допустим, вы извлекаете набор данных в JSON: библиотека Requests предоставляет функцию, которая автоматически преобразует данные в словарь Python.
import requests
response=requests.get("https://jsonplaceholder.typicode.com/posts/1")
jsonResponse = response.json()
print(jsonResponse)
Код отправляет GET-запрос на сайт jsonplaceholder и возвращает данные в виде словаря Python.
Библиотека Requests предоставляет поддержку для работы с двоичными данными или содержимым в байтах, например, изображениями или pdf-файлами. Допустим, вы хотите загрузить логотип Google:
import requests
response = requests.get("https://xmldatafeed.com/wp-content/uploads/2023/06/googlelogo_light_color_272x92dp-1.png")
googleLogo = response.content
with open("logo.png", "wb") as file:
file.write(googleLogo)
Этот код отправляет GET-запрос на указанную ссылку и возвращает ответ в байтах. Здесь используется метод open() для записи данных в режиме wb (Write Binary), который открывает файл logo.png и записывает данные в этот файл.
Метод open() открывает файл, предоставленный в качестве аргумента. Если файл отсутствует, он создает файл с тем же именем и записывает данные в него.
Как мы уже видели, библиотека Requests позволяет только получить данные сайта, но не обеспечивает поддержку разбора этих данных. Поэтому для этого нам нужна другая библиотека. В этом руководстве нам поможет Beautiful Soup. Чтобы установить Beautiful Soup в свой проект, просто введите следующую команду в командной строке и нажмите Enter.
pip3 install beautifulsoup4
Теперь вы готовы разбирать и извлекать данные с любого веб-сайта. Допустим, вам нужны все заголовки блогов с сайта Apify.
Код для этого выглядит следующим образом:
import requests
from bs4 import BeautifulSoup
response = requests.get("https://blog.apify.com/")
# Создаем объект BeautifulSoup путем разбора содержимого
soup = BeautifulSoup(response.content, "html.parser")
# Найдите все элементы с классом "post-title" и заголовком "h2"
postTitles = soup.find_all("h2", class_="post-title")
# Пройдитесь по списку всех заголовков постов
for postTitle in postTitles:
print(postTitle.text.strip())
Этот код отправляет GET-запрос на сайт Apify, разбирает HTML-содержимое с помощью Beautiful Soup и находит все заголовки блогов.
Каждый инструмент имеет свои функциональные возможности и ограничения. Ограничения есть и у Python Requests. Давайте рассмотрим некоторые из них.
Python Requests предоставляет некоторые расширенные возможности, такие как работа с cookies, аутентификация, управление сессиями и т.д. Их можно использовать, чтобы избежать блокировки и повысить эффективность парсинга.
Cookie — это небольшой фрагмент текста, отправляемый с сайта пользователю. Он хранится в браузере пользователя для запоминания информации, например, товаров в корзине и данных для входа в систему. Таким образом, в следующий раз, когда вы добавляете товар в корзину или регистрируетесь где-то и случайно закрываете окно браузера, вы откроете сайт и найдете то же состояние. Это делается с помощью файлов cookie. Они поддерживают состояние веб-сайта. Они также используются для отслеживания поведения пользователей, например, какие страницы они посещают и как долго остаются на сайте.
С помощью Python Requests мы можем получить доступ к файлам cookie и добавить их. Давайте посмотрим, как мы можем получить доступ к файлам cookie:
import requests
# отправляем GET-запрос
response = requests.get('https://stackoverflow.com/')
# Получить файлы cookie из ответа
cookies = response.cookies
print(cookies)
Этот код отправляет GET-запрос на сайт StackOverflow и получает от него файлы cookie. Теперь, допустим, мы хотим отправить cookies на сайт httpbin. Параметр cookies в запросе позволяет нам отправить cookies обратно на сервер.
import requests
# Создаем словарь cookie
cookies = {'exampleCookie': '123456789'}
response = requests.get('http://httpbin.org/cookies', cookies=cookies)
print(response.text)
Этот код отправляет Get запрос и cookies в качестве параметра. Сервер получит cookies из запроса и обработает их в соответствии со своей собственной реализацией.
Для аутентификации веб-сайтов Requests предоставляет поддержку автоматической аутентификации. Нам просто нужно указать имена полей с правильными учетными данными, и БУМ! Requests автоматически находит форму, заполняет поля и нажимает кнопку входа. Это так просто.
Вот как это делается:
import requests
# Login credentials
credentials = {
'email': 'yourEmail',
'password': 'yourPassword'
}
response = requests.post('https://newsapi.org/login', data=credentials)
if response.status_code == 200:
homePage = response.text
print('Authentication Successful!')
else:
print('Authentication failed!')
Этот код отправляет POST-запрос на сайт news api с учетными данными для аутентификации. Он сохраняет HTML домашней страницы в переменной homePage и печатает «Authentication Successful!», если аутентификация прошла успешно; в противном случае печатается «Authentication failed!». Вы все еще можете опубликовать свои учетные данные, используя запрос GET и включив их в строку запроса. Обычно это не рекомендуется, поскольку строка запроса может быть видна третьим лицам и может кэшироваться посредниками, такими как прокси-серверы или серверы кэширования.
Сессия может использоваться для хранения информации о пользователе на сервере в течение всего времени его взаимодействия с веб-сайтом. Вместо того, чтобы хранить изменяющуюся информацию о пользователе через cookies в браузере, сервер присваивает браузеру уникальный идентификатор и хранит некоторые временные переменные. Каждый раз, когда браузер делает запрос, сервер получает идентификатор и извлекает переменные. В контексте парсинга иногда требуется аутентификация веб-сайта и переход к различным маршрутам. Сессии используются для сохранения производительности и информации о состоянии между этими страницами.
Вот пример, в котором мы сначала войдем в систему, а затем попытаемся зайти на страницу подписки.
Чтобы сделать этот пример выполнимым и получить желаемый результат, вам необходимо предоставить те же учетные данные, которые вы указали в примере выше. Если у вас нет учетной записи, вы можете создать ее бесплатно.
Мы также извлечем текущий план со страницы подписки.
import requests
from bs4 import BeautifulSoup
# create session object
session = requests.Session()
# Login credentials
credentials = {
'email': 'yourEmail',
'password': 'yourPassword'
}
response = session.post('https://newsapi.org/login', data=credentials)
# Show an error if the status_code is not 200
if response.status_code != 200:
print("Login failed.")
else:
subscriptionResponse = session.get('https://newsapi.org/account/manage-subscription')
soup = BeautifulSoup(subscriptionResponse.content, 'html.parser')
subscriptionPlan = soup.find('div', class_ = 'mb2')
#If the subscriptionPlan is not found
if subscriptionPlan is not None:
print(subscriptionPlan.text.strip())
else:
print("Failed to find plan element.")
При попытке сделать несколько HTTP-запросов к сайту через скрипт, сайт может обнаружить это и заблокировать нас от дальнейших запросов. Поэтому, чтобы избежать этого, мы можем использовать различные прокси. При использовании нескольких прокси веб-сайт будет думать, что запрос поступает из разных источников, и не будет ограничивать его использование.
Вот пример использования прокси с помощью Requests:
import requests
# Different proxies
proxies = {
'http': 'http://103.69.108.78:8191',
'http': 'http://198.199.86.11:8080',
'http': 'http://200.105.215.22:33630',
}
# Make four GET requests
for i in range(4):
response = requests.get('https://httpbin.org', proxies=proxies)
# Print **Request successful** if the status code is **200**
if response.status_code == 200:
print("Request successful")
# Print **Request failed** otherwise
else:
print("Request failed")
Этот код отправляет четыре GET-запроса на HTTP-сайт, используя несколько прокси-серверов, и выводит соответствующее сообщение. Вы можете получить различные прокси из этого списка бесплатных прокси.
Современные сайты могут легко обнаружить запросы, сделанные через любой скрипт. Чтобы избежать обнаружения, мы можем добавить агенты пользователя в заголовки нашего запроса, чтобы он выглядел как настоящий запрос браузера. Это очень важная техника, которая используется для того, чтобы избежать блокировки.
import requests
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'}
response = requests.get('https://apify.com/', headers=headers)
if response.status_code == 200:
print("Request successful")
# Print Request failed otherwise
else:
print("Request failed")
Этот код отправляет GET-запрос на HTTP-сайт с использованием user-agents и печатает сообщение в соответствии с ответом. Генерация User-агентов Online позволяет вам также генерировать User-агенты.
Дросселирование и ограничение скорости — очень важные методы, позволяющие нам ограничить количество запросов и создать задержку между несколькими запросами. Если мы будем быстро отправлять запросы, сайт может обнаружить нашего бота и заблокировать нас. Поэтому, чтобы избежать этого, мы можем использовать эти техники:
import requests
# Импортируйте библиотеку времени, чтобы добавить задержки между запросами
import time
# Сделайте 10 запросов
for i in range(10):
response = requests.get('https://blog.apify.com/')
# Добавьте 1-секундную задержку между запросами
time.sleep(1)
if response.status_code == 200:
print("Запрос успешен")
# В противном случае вывести запрос не удалось
else:
print("Запрос не прошел")
Этот код отправляет 10 GET-запросов в Apify с 1-секундной задержкой между каждым запросом.
Процесс парсинга может привести к ошибкам и техническим проблемам. Хорошо протестировать код перед развертыванием, чтобы избежать потенциальных ошибок, но каждый новичок может застрять на нескольких распространенных проблемах:
Вот несколько ошибок, которые могут повлиять на наши скрипты парсинга.
Очень полезно иметь некоторые знания об этих распространенных ошибках, которые могут остановить наш процесс парсинга. Почему бы не начать с нашей статьи о том, как решить 403 ошибку?
Краткое резюме: как превратить сеть сайтов в стабильный источник дохода Создание сети информационных сайтов —…
Знаете ли вы, что невидимые технические ошибки могут «съедать» до 90% вашего потенциального трафика из…
Введение: почему мониторинг цен — необходимость, а защита — не преграда Представьте, что вы пытаетесь…
Значительная часть трафика на любом коммерческом сайте — это не люди. Это боты, которые могут…
Систематический мониторинг цен конкурентов — это не просто способ избежать ценовых войн, а доказанный инструмент…
Краткое содержание В мире, где 93% потребителей читают отзывы перед покупкой 1, а рейтинг компании…