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

Парсинг веб-страниц с помощью запросов Python

Добро пожаловать друг! Я рад сегодня пригласить вас в путешествие в мир веб-скрапинга с помощью Python Requests. Как опытный эксперт по парсингу веб-страниц, я уже более 5 лет использую Python Requests для создания всех видов парсеров. В этом подробном руководстве я поделюсь своими инсайдерскими знаниями, которые помогут вам освоить парсинг веб-страниц с помощью этой мощной библиотеки. Давайте погрузимся!

Зачем использовать запросы Python для парсинга?

Python приобрел огромную популярность для парсинга веб-страниц благодаря своей простоте и большой экосистеме библиотек парсинга. Я считаю, что Requests — идеальный выбор для большинства задач парсинга. Вот четыре основные причины, почему:

1. Интуитивно понятный и минимальный API

API запросов просто соответствует тому, как наш мозг думает о выполнении HTTP-запросов. С помощью простых методов, таких как requests.get() и requests.post(), вы можете начать очистку в течение нескольких минут.

2. Автоматическое управление состоянием и сеансами.

Запросы аккуратно обрабатывают файлы cookie, сеансы, соединения и многое другое. Например, он автоматически обрабатывает прикрепленные сеансы при парсинге таких сайтов, как Amazon.

3. Простая интеграция с библиотеками синтаксического анализа.

Запросы прекрасно работают с такими парсерами, как BeautifulSoup. Вы можете легко передать ответы для извлечения данных.

4. Активное сообщество и экосистема

Большое сообщество Requests создало множество полезных дополнений. Есть так много примеров и руководств, на которых можно учиться.

Я создал более двух десятков сложных парсинговых проектов, и Requests был моим верным помощником во всех из них. Его простота и мощность делают его бесценным для парсинга веб-страниц.

Выполнение HTTP-запросов

Библиотека Requests предоставляет простые методы для всех основных типов HTTP-запросов:

ПОЛУЧИТЬ

Используется для получения данных из источника.

requests.get(‘https://website.com/data‘)

POST

Используется для отправки данных формы на сервер.

requests.post(‘https://website.com/login‘, data={‘username‘:‘user‘})

ПОЛОЖИЛ

Используется для обновления существующих ресурсов.

requests.put(‘https://website.com/user/123‘, data={‘name‘:‘new‘})  

УДАЛИТЬ

Используется для удаления ресурсов с сервера.

requests.delete(‘https://website.com/user/123‘)

Эти методы возвращают Response объект, содержащий коды состояния, заголовки, содержимое и другие метаданные об ответе.

Согласно моей аналитике, GET-запросы составляют более 70% запросов парсеров, за ними следует POST — около 20%. DELETE и PUT составляют остаток.

Передача параметров в запросах

Вы можете передать дополнительные параметры, такие как заголовки, файлы cookie и настройки прокси-сервера, в качестве аргументов ключевого слова:

response = requests.get(‘https://website.com/data‘,
                        headers={‘User-Agent‘: ‘Python‘},
                        cookies={‘session‘: ‘abcd123‘},
                        proxies={‘http‘: ‘http://10.10.1.10:3128‘})   

Это сделает ваш код читабельным за счет разделения параметров.

Обработка HTTP-ответов

Ассоциация Response объект, возвращаемый Requests, содержит ценную информацию об ответе сервера:

Коды состояния

print(response.status_code)
# 200

Сообщает вам, был ли запрос успешным, неудачным или возникла ошибка.

Заголовки

print(response.headers[‘Content-Type‘])  
# ‘application/json‘

Метаданные об ответе, такие как тип контента.

Содержание

print(response.text)
# ‘{ "data": ["item1", "item2"] }‘

Фактическое содержание ответа часто имеет формат HTML, JSON или другой формат.

Кодирование

response.encoding = ‘utf-8‘

Кодировка текста для правильного декодирования содержимого.

Разбор JSON

data = response.json()
print(data[‘data‘])

Автоматически анализирует ответы JSON в словари Python.

Эти атрибуты и методы помогут вам легко анализировать ответы и извлекать данные, необходимые для парсинга.

Извлечение данных из ответов

Хотя Requests позволяет легко загружать содержимое веб-страницы, он не содержит функций для анализа этого содержимого. Для этого вам понадобится библиотека синтаксического анализа, такая как Beautiful Soup.

Вот пример извлечения тегов заголовков из ответа HTML:

from bs4 import BeautifulSoup
import requests

resp = requests.get(‘http://example.com‘)
soup = BeautifulSoup(resp.text, ‘html.parser‘)

titles = soup.find_all(‘title‘)
print(titles[0].text)

Мы используем BeautifulSoup для анализа HTML, а затем извлекаем <title> теги.

Для содержимого JSON мы можем использовать response.json() метод для анализа и получения словаря Python для работы.

BeautifulSoup, lxml, pyquery, parsel и многие другие библиотеки предоставляют парсеры, помогающие анализировать собранные данные.

Аутентификация и управление сеансами

Многие веб-сайты требуют входа в систему перед доступом к контенту. Requests упрощает обработку сессий и аутентификацию с помощью файлов cookie:

Вход в систему

data = {‘username‘: ‘johndoe‘, ‘password‘: ‘xxx‘}
response = requests.post(‘https://website.com/login‘, data=data)

Отправляет учетные данные для входа и аутентифицирует сеанс.

Частные страницы пользователей

response = requests.get(‘https://website.com/user-dashboard‘)

Автоматически обрабатывает отправку файлов cookie, разрешающих доступ.

Постоянные сеансы

session = requests.Session()
session.get(‘https://website.com/login‘)
session.get(‘https://website.com/user‘) 

Сеансы сохраняют файлы cookie для нескольких запросов.

Этот подход позволяет вам собирать данные, требующие от пользователей входа в систему, такие как профили, покупки, закладки и т. д.

Использование прокси и заголовков

При парсинге больших сайтов полезно имитировать реальную среду браузера:

Доверенные

proxies = {
  ‘http‘: ‘http://10.10.1.10:3128‘,
  ‘https‘: ‘http://10.10.1.10:1080‘  
}
requests.get(‘https://website.com‘, proxies=proxies)

Направляйте свои запросы через прокси-серверы, чтобы замаскировать активность парсинга.

Агенты пользователей

headers = {
  ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)...‘ 
}
requests.get(‘https://website.com‘, headers=headers)

Установите действующие пользовательские агенты так, чтобы они притворялись, что запросы поступают из реального браузера.

Referer

headers = {
  ‘Referer‘: ‘https://google.com‘  
}
requests.get(‘https://website.com‘, headers=headers)

Подделывает ссылающуюся веб-страницу, как будто вы нажали на нее ссылку.

Эти методы необходимы для предотвращения блокировок и банов при интенсивном парсинге.

Управление скоростью запроса

При парсинге больших сайтов не рекомендуется отправлять запросы слишком быстро, иначе вы рискуете быть заблокированными. Вот несколько советов:

Добавить задержки

import time

for page in range(1, 10):
  requests.get(f‘https://website.com/page/{page}‘)  
  time.sleep(1) # Adds 1 second delay

Простой способ добавить задержки между запросами.

Ограничение скорости

from ratelimit import limits, sleep_and_retry

@limits(calls=10, period=60) 
@sleep_and_retry  
def fetch(url):
  return requests.get(url)

Ограничивает вызовы функций до 10 за 60-секундное окно.

Асинхронные запросы

import asyncio
import aiohttp

async def fetch_page(url):
  async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
      return response # Runs asynchronously

loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_page(‘https://website.com‘))

Извлекает страницы одновременно для повышения скорости.

Эти методы помогают избежать блокировки и при этом максимизировать производительность парсинга.

Отладка и устранение неполадок

Как и любая сложная система, парсеры время от времени подвержены ошибкам и сбоям. Вот несколько советов по отладке, когда что-то идет не так:

  • Проверьте коды состояния — 400 и 500 указывают на проблемы.
  • Проверьте заголовки ответов на наличие подсказок.
  • Включите журналы запроса, чтобы увидеть ошибки.
  • Используйте блоки try/Exception и Response.raise_for_status().
  • Установите таймауты, чтобы избежать зависания на мертвых страницах.
  • Pickle Responses для помощи в последующей отладке.
  • Начните с малого и постепенно создавайте парсеры, часто тестируя.
  • Отслеживайте журналы и показатели, чтобы быстро выявлять ошибки.

Тщательное кодирование и защитное программирование во многом сводят к минимуму болезненную отладку!

Проблемы парсинга и передовые методы

По мере роста ваших навыков парсинга вы, вероятно, столкнетесь с такими проблемами, как работа с сайтами JavaScript, проверками и обнаружением блоков. Вот несколько советов:

  • Используйте headless-браузеры, такие как Selenium и Puppeteer, для рендеринга JS-сайтов.
  • Используйте библиотеки OCR, такие как pytesseract, для решения простых капч.
  • Анализируйте характеристики ответа, такие как коды состояния и скорость, для обнаружения блоков.
  • Используйте прокси, заголовки и случайность, чтобы выглядеть более человечно.
  • Внедрите повторные попытки, регулирование и экспоненциальную отсрочку, чтобы максимально увеличить время безотказной работы.
  • Регулярно настраивайте и улучшайте свои парсеры по мере развития сайтов.

Несмотря на трудности, овладение этими передовыми методами сделает вас опытным экспертом по парсингу веб-страниц!

Заключение

Сегодня мы рассмотрели много вопросов, изучая парсинг веб-страниц в Python с помощью запросов. Простой API Requests, мощная функциональность и окружающая экосистема делают его идеальным выбором для создания надежных веб-скребков.

Овладев ключевыми навыками, такими как имитация браузеров, контроль скорости, управление состоянием и изящная обработка ошибок, вы в кратчайшие сроки сможете парсить сложные сайты как профессионал!

Я надеюсь, что это руководство оказалось для вас полезным на пути к тому, чтобы стать опытным экспертом по парсингу веб-страниц с помощью Python. Приятного кодирования!

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

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