Как использовать запросы для веб-скрапинга

Как использовать запросы для веб-скрапинга

В этом руководстве я расскажу вам о том, как собирать информацию с веб-сайтов с помощью Hrequests. Не волнуйтесь, если вы новичок в этом деле - я буду все упрощать и показывать шаг за шагом.

Для начала установим Hrequests и отправим HTTP-запросыи извлечение полезных данных. Затем мы рассмотрим работу с несколькими страницами, работу с динамическим контентом и даже использование параллелизма для ускорения работы. К концу курса вы будете знать, как скрести сайты как профессионал.

Если вам интересно узнать о веб-скреппинге и вы хотите легко начать, это руководство для вас. Давайте приступим!

Что такое Hrequests?

Hrequests означает «человеческие запросы». Это библиотека для Python, предназначенная для веб-скрапинга. Hrequests сочетает в себе HTTP-клиент, HTML-парсер и headless-браузер. Это означает, что с ее помощью можно собирать данные как со статических, так и с динамических сайтов. Библиотека проста в использовании и отлично подходит тем, кто только начинает заниматься веб-скрапингом.

Hrequests может упростить ваши проекты по веб-скрапингу. Если сайт отдает контент в обычном HTML, можно использовать HTTP-клиент и парсер. Если нужно работать с сайтами, которые загружают данные через JavaScript, можно воспользоваться функцией headless-браузера. В Hrequests также есть режим имитации поведения человека. Это помогает избегать срабатывания антибот-защиты на некоторых сайтах.

Оптимизируйте настройку скрапинга с помощью Bright Data

Продвинутые прокси-сервисы Bright Data Такие сервисы обеспечивают надежные высокоскоростные соединения, которые хорошо дополняют Hrequests. Интегрировав их ротационные резидентные прокси в рабочий процесс веб-скрапинга, вы сможете обходить антибот-защиту и собирать данные без сложной настройки.

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

Начало работы с Hrequests

Перед началом убедитесь, что на вашем компьютере установлен Python 3. Последнюю версию Python можно скачать с официального сайта. После установки Python вы можете установить Hrequests с помощью pip. Откройте терминал или командную строку и выполните следующую команду:

pip install -U hrequests[все]

Эта команда установит Hrequests вместе со вспомогательными библиотеками. Одна из них - Playwright, который Hrequests использует для функции браузера в headless-режиме.

Затем нужно установить веб-драйверы для Playwright. Выполните эту команду:

playwright install

После установки Hrequests и веб-драйверов создайте новую папку для вашего проекта. Откройте ваш любимый редактор кода и создайте новый Python-файл, например scraper.py. Теперь вы готовы приступить к созданию своего веб-скрапера.

Узнайте больше о веб-скрапинге с помощью Playwright здесь.

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

Первый шаг в веб-скраппинге - это отправка HTTP-запроса на сайт и получение его HTML-содержимого. Hrequests упрощает эту задачу. В вашем файле scraper.py начните с импорта Hrequests:

импорт запросы

Затем с помощью метода `get` отправьте запрос к целевому сайту. Например, если вы хотите выполнить скрапинг демонстрационного сайта электронной коммерции, можно использовать следующий код:

response = hrequests.get("https://www.scrapingcourse.com/ecommerce/")

Эта строка кода отправляет GET-запрос на веб-сайт. Объект ответа содержит HTML страницы. Чтобы посмотреть HTML, можно вывести текст ответа:

html_content = response.text
печать(html_content)

Когда вы запустите этот код, в консоль будет выведено полное HTML-содержимое страницы. Это ваш первый шаг в веб-скрапинге.

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

После получения HTML-контента следующим шагом становится извлечение ценных данных. Веб-страницы содержат множество элементов, таких как абзацы, изображения и ссылки. У Hrequests есть встроенный HTML-парсер, который поможет найти эти элементы. Допустим, вам нужно извлечь со страницы электронной коммерции сведения о товаре: название, цену, URL и ссылку на изображение.

Сначала откройте сайт в браузере. Щелкните правой кнопкой мыши по товару и выберите «Осмотреть», чтобы увидеть структуру HTML. Вы можете заметить, что каждый товар находится внутри

  • Элемент с классом, например `product`. Имея эту информацию, вы можете использовать CSS-селекторы для поиска этих элементов.

 

Вот пример фрагмента кода для извлечения информации о продукте:

# Получите все контейнеры с продуктами
продукты = response.html.find_all(".product")
# Создайте пустой список для хранения данных о продукте
данные о продукте = []
# Пройдитесь по каждому контейнеру с продуктом, чтобы извлечь подробную информацию
для продукт в продукты:
data = {
"имя": product.find(".woocommerce-loop-product__title").text,
"цена": product.find(".price").text.replace("n", ""),
"url": product.find("a").href,
"img": product.find("img").src
}
product_data.append(data)
# Печать извлеченных данных о продукте
печать(product_data)

В приведенном выше коде мы сначала находим все элементы с классом `.product`. Затем перебираем эти элементы и извлекаем нужный текст и атрибуты. Метод `replace` используется для удаления лишних символов новой строки из данных о цене.

Когда вы запустите этот код, в консоли появится список словарей. Каждый словарь представляет собой товар с названием, ценой, URL и ссылкой на изображение.

Сохранение данных в CSV-файл

Сохранение собранных данных в CSV-файле - распространенная практика. Встроенный модуль `csv` в Python упрощает эту задачу. Получив данные о товарах в виде списка словарей, вы можете записать их в CSV-файл.

Вот как вы можете это сделать:

импорт csv
# Определите ключи из первого словаря продуктов
ключи = product_data[0].keys()
# Открытие нового файла CSV в режиме записи
с открыть("product_data.csv", "w", newline="", кодировка="utf-8") в роли выходной_файл:
dict_writer = csv.DictWriter(output_file, fieldnames=keys)
dict_writer.writeheader()
dict_writer.writows(product_data)
печать("CSV создан успешно")

Этот фрагмент кода создает CSV-файл с именем product_data.csv и записывает в него заголовок и строки. При открытии файла вы увидите данные в формате таблицы. Этот метод удобен для сохранения и последующего анализа собранных данных.

Скрапирование нескольких страниц

Многие веб-сайты используют пагинацию для отображения большого количества элементов. Если вам нужно получить данные со всех страниц, вам придется переходить по каждой из них. Давайте посмотрим, как можно модифицировать код для работы с несколькими страницами.

Использование цикла для пагинации

Предположим, что веб-сайт показывает товары на нескольких страницах с кнопкой «Далее». Следующий код использует цикл while, чтобы проверять наличие следующей страницы и собирать данные, пока не закончатся доступные страницы:

# Определите функцию для сканирования текущей страницы
def скребок(ответ):
products = response.html.find_all(".product")
данные о продукте = []
для продукт в продукты:
data = {
"имя": product.find(".woocommerce-loop-product__title").text,
"цена": product.find(".price").text.replace("n", ""),
"url": product.find("a").href,
"img": product.find("img").src
}
product_data.append(data)
возврат данные о продукте
# Начните с запроса первой страницы
response = hrequests.get("https://www.scrapingcourse.com/ecommerce/")
# Список для сбора всех продуктов
all_products = []
в то время как Правда:
# Соскабливание данных с текущей страницы
all_products.extend(scraper(response))
# Найдите следующий элемент страницы
следующая_страница = response.html.find(".next")
# Если найдена следующая страница, продолжите поиск
если следующая_страница:
response = hrequests.get(next_page.href)
else:
перерыв
печать(all_products)

Этот код определяет функцию `scraper` для извлечения данных со страницы. Затем мы переходим по страницам с помощью кнопки «Далее». Когда следующей страницы нет, цикл останавливается. Такой подход позволяет собирать данные со всех страниц сайта.

Использование параллелизма для ускорения скрапинга

Если нужно собирать данные со множества страниц, обработка по одной может занять много времени. Hrequests поддерживает параллелизм. Это значит, что можно запрашивать несколько страниц одновременно. На многих сайтах есть URL-адреса с номерами страниц, например:

https://www.scrapingcourse.com/ecommerce/page/1/
https://www.scrapingcourse.com/ecommerce/page/2/
...

Узнайте больше о Параллельный веб-скрапинг с помощью Python.

Одновременная очистка нескольких страниц

Вот пример того, как можно одновременно скрести несколько страниц:

# Список URL-адресов для каждой страницы
урлы = [
"https://www.scrapingcourse.com/ecommerce/page/1/",
"https://www.scrapingcourse.com/ecommerce/page/2/",
"https://www.scrapingcourse.com/ecommerce/page/3/",
"https://www.scrapingcourse.com/ecommerce/page/4/",
"https://www.scrapingcourse.com/ecommerce/page/5/",
"https://www.scrapingcourse.com/ecommerce/page/6/",
"https://www.scrapingcourse.com/ecommerce/page/7/",
"https://www.scrapingcourse.com/ecommerce/page/8/",
"https://www.scrapingcourse.com/ecommerce/page/9/",
"https://www.scrapingcourse.com/ecommerce/page/10/",
"https://www.scrapingcourse.com/ecommerce/page/11/",
"https://www.scrapingcourse.com/ecommerce/page/12/"
]
# Одновременный запрос всех URL-адресов
responses = hrequests.get(urls)
# Список для хранения всех данных о продукте
all_products = []
# Пройдитесь по каждому ответу, чтобы извлечь данные о продукте
для ответ в ответы:
all_products.extend(scraper(response))
печать(all_products)

Этот метод отправляет запросы на все страницы одновременно. Затем он просматривает каждый ответ и собирает данные о продукте. Конкуренция ускоряет процесс скрапинга. Это очень полезно, когда нужно быстро отсканировать много страниц.

Скрапинг страниц с JavaScript-рендерингом

Не все сайты отдают статичный HTML. Некоторые загружают контент с помощью JavaScript. В Hrequests есть функция браузера в headless-режиме. Она позволяет отображать страницы, которым требуется JavaScript. Один из распространенных примеров - бесконечная прокрутка. При бесконечной прокрутке новый контент подгружается по мере прокрутки страницы вниз.

Использование запросов для динамического содержимого

Давайте посмотрим, как соскрести страницу, использующую бесконечную прокрутку. В этом примере мы возьмем сайт, который загружает товары по мере прокрутки.

Сначала импортируйте класс Session из Hrequests и модуль time:

с сайта запросы импорт Сессия
импорт время

Настройка безголового браузера

Создайте сеанс в браузере без интерфейса. Можно выбрать, например, Chrome:

session = Session(browser="хром")
Теперь создайте сессию страницы и загрузите целевой веб-сайт:
page = session.render("https://www.scrapingcourse.com/infinite-scrolling")

Прокрутка страницы

Идея в том, чтобы прокручивать страницу вниз, пока не загрузится новый контент. Для прокрутки можно использовать JavaScript. Воспользуйтесь методом evaluate, чтобы выполнить JavaScript в браузере:

# Получение текущей высоты страницы
last_height = page.evaluate("document.body.scrollHeight")
в то время как Правда:
# Прокрутите страницу вниз
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
# Подождите, пока загрузится новое содержимое
time.sleep(10)
# Получение новой высоты после прокрутки
new_height = page.evaluate("document.body.scrollHeight")
# Проверьте, не увеличилась ли высота страницы
если new_height == last_height:
перерыв
# Обновление высоты
last_height = new_height

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

Извлечение данных после прокрутки

После того как страница перестанет загружать новый контент, вы сможете извлечь данные о продукте. Определите функцию для извлечения данных с динамической страницы:

def скребок(страница):
products = page.html.find_all(".product-item")
данные о продукте = []
для продукт в продукты:
data = {
"имя": product.find(".product-name").text,
"цена": product.find(".product-price").text
}
product_data.append(data)
печать(product_data)
# Вызов функции скребка
скребок(страница)
# Закрыть сеанс браузера
page.close()

Этот код выводит названия и цены товаров на странице с бесконечной прокруткой. Браузер без интерфейса помогает загрузить и выполнить весь JavaScript.

Решение проблем и ограничений

Хотя Hrequests - мощный инструмент, у него есть несколько ограничений. Одно из них - небольшое сообщество пользователей, из-за чего бывает сложнее найти помощь при возникновении проблем. Еще одна проблема - Hrequests не поддерживает аутентификацию прокси. Многим премиум-прокси-сервисам нужна эта функция.

Кроме того, Hrequests не может обходить современные системы защиты от ботов. Сайты, защищенные такими сервисами, как Cloudflare, Akamai или DataDome, могут заблокировать ваш скрейпер. Например, если вы попытаетесь скрапить сайт с сильной антибот-защитой, вместо полного HTML-контента можете получить заблокированный ответ.

Преодоление мер по борьбе с ботами

Если вы столкнулись с антибот-защитой, может понадобиться альтернативное решение. Одно из них - API Bright Data. Bright Data берет на себя ротацию прокси, браузеры без интерфейса и обработку CAPTCHA. Это помогает обходить большинство антибот-механизмов.

Вот пример того, как можно использовать Bright Data в Python-коде:

импорт запросы
url = "https://www.g2.com/products/asana/reviews"
apikey = ""
параметры = {
"url": url,
"apikey": apikey,
"js_render": "правда",
"premium_proxy": "правда",
}
response = requests.get("https://api.brightdata.com/v1/", params=params)
печать(response.text)

Этот код отправляет запрос к API Bright Data. Затем Bright Data берет на себя ротацию прокси и рендеринг JavaScript. В результате вы можете получить доступ к сайтам, которые обычно блокируются вашим скрапером.

Bright Data - хороший вариант, когда вы сталкиваетесь с серьезной антибот-защитой. Однако Hrequests по-прежнему остается отличным инструментом для решения многих задач, связанных с веб-скрапингом. Вы можете выбрать инструмент, который лучше всего соответствует вашим потребностям.

Лучшие практики для веб-скрапинга

При использовании Hrequests или любого другого инструмента для веб-скрапинга важно придерживаться лучших практик. Вот несколько советов:

  1. Соблюдайте Robots.txt веб-сайта: На многих сайтах есть файл robots.txt. В этом файле указывается, какие части сайта разрешено скрапить. Всегда проверяйте этот файл перед тем, как начать скраппинг.
  2. Не перегружайте веб-сайт: Обязательно добавляйте задержки между запросами. Это поможет избежать отправки слишком большого числа запросов за короткий промежуток времени. Перегрузка сервера может привести к блокировке вашего IP-адреса.
  3. Грациозно обрабатывайте ошибки: Веб-сайты могут в любой момент изменить свою структуру. Обязательно добавьте в код обработку ошибок. Таким образом, ваш скрапер сможет обрабатывать отсутствующие элементы или проблемы с подключением без сбоев.
  4. Используйте параллелизм с умом: Хотя параллелизм может ускорить работу, не отправляйте слишком много запросов одновременно. Учитывайте нагрузку на сервер целевого сайта, чтобы не вызвать проблем.
  5. Надежное хранение данных: Сохраняя данные в файлах или базах данных, обеспечьте их безопасное хранение. Всегда проверяйте и обеззараживайте данные, чтобы избежать проблем в дальнейшем.

Заключение

Hrequests - мощная и простая в использовании библиотека для веб-скрапинга на Python. Ее способность работать как со статическим, так и с динамическим контентом делает ее отличным выбором для многих проектов. Неважно, скрапите ли вы простой интернет-магазин или сложный сайт с бесконечной прокруткой, Hrequests поможет вам справиться с этой задачей. Используйте примеры из этого руководства, чтобы начать собственные проекты. С практикой и тщательным планированием вы сможете создавать эффективные веб-скраперы, отвечающие вашим потребностям.

Похожие записи