Представьте, что вы можете легко получать всю необходимую информацию из интернета, не прибегая к ручному просмотру веб-страниц или копированию и вставке. Вот в чем прелесть веб-скрапинга. Независимо от того, являетесь ли вы аналитиком данных, исследователем рынка или разработчиком, веб-скрапинг открывает новый мир автоматизированного сбора данных.
В этой эпохе данных информация — это сила. Однако ручное извлечение информации с сотен или даже тысяч веб-страниц не только занимает много времени, но и подвержено ошибкам. К счастью, веб-скрапинг предоставляет эффективное и точное решение, позволяя автоматизировать процесс извлечения данных из интернета, тем самым значительно повышая эффективность и качество данных.
Содержание
- Что такое веб-скрапинг?
- Процесс веб-скрапинга обычно включает следующие шаги:
- Начало работы с Selenium
- Подготовка
- Импорт библиотек
- Доступ к странице
- Параметры запуска
- Пример: запуск в безголовом режиме
- Поиск элементов страницы
- Взаимодействие с элементами
- Извлечение данных
- Ожидание загрузки элементов
- Обход защиты от скрапинга
- Заключение
Что такое веб-скрапинг?
Веб-скрапинг — это техника автоматического извлечения информации с веб-страниц с помощью написания программ. Эта технология имеет широкий спектр применения во многих областях, включая анализ данных, маркетинговые исследования, конкурентный анализ, агрегацию контента и многое другое. С помощью веб-скрапинга можно собирать и консолидировать данные с большого числа веб-страниц за короткое время, не прибегая к ручным операциям.
Процесс веб-скрапинга обычно включает следующие шаги:
- Отправка HTTP-запроса: Программно отправлять запрос на целевой веб-сайт для получения HTML-кода исходного кода веб-страницы. Для этого легко использовать такие распространенные инструменты, как библиотека requests для Python.
- Разбор HTML-контента: После получения HTML-кода исходного кода его необходимо разобрать для извлечения необходимых данных. Для обработки структуры HTML можно использовать библиотеки парсинга, такие как BeautifulSoup или lxml.
- Извлечение данных: На основе разобранной структуры HTML находить и извлекать конкретные содержимое, такие как заголовок статьи, информацию о цене, ссылки на изображения и т.д. Часто используемые методы включают использование XPath или CSS-селекторов.
- Хранение данных: Сохранение извлеченных данных в подходящее хранилище, такое как база данных, CSV-файл или JSON-файл для последующего анализа и обработки.
И при помощи таких инструментов, как Selenium, можно имитировать работу браузера пользователя, обходя некоторые механизмы против сканера, чтобы более эффективно выполнить задачу веб-скрапинга.
Проблемы, связанные с повторяющимся отказом в полном решении раздражающего капча, решаются?
Встречайте безшовное автоматическое решение капчи с технологией AI-powered Auto Web Unblock от Capsolver!
Получите свой бонусный код для лучших решений капчи, CapSolver: WEBS. После его активации вы получите дополнительный бонус в размере 5% после каждой пополнения.
Начало работы с Selenium
Давайте возьмем в качестве примера ScrapingClub и используем Selenium для выполнения упражнения номер один.
Подготовка
Сначала вам нужно убедиться, что Python установлен на вашем компьютере. Вы можете проверить версию Python, введя следующую команду в вашем терминале:
python --version
Убедитесь, что версия Python выше 3. Если он не установлен или версия слишком низкая, загрузите последнюю версию с официального сайта Python. Затем вам нужно установить библиотеку selenium
с помощью следующей команды:
pip install selenium
Импорт библиотек
from selenium import webdriver
Доступ к странице
Использование Selenium для управления Google Chrome для доступа к странице несложно. После инициализации объекта Chrome Options вы можете использовать метод get()
для доступа к целевой странице:
import time
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
time.sleep(5)
driver.quit()
Параметры запуска
Chrome Options может добавлять множество параметров запуска, которые помогают улучшить эффективность извлечения данных. Вы можете просмотреть полный список параметров на официальном сайте: Список командных ключей Chromium. В таблице ниже приведены некоторые распространенные параметры:
Параметр | Назначение |
---|---|
--user-agent="" | Установка User-Agent в заголовке запроса |
--window-size=xxx,xxx | Установка разрешения браузера |
--start-maximized | Запуск с максимальным разрешением |
--headless | Запуск в безголовом режиме |
--incognito | Запуск в режиме инкогнит |
о |
| --disable-gpu | Отключение аппаратного ускорения GPU|
Пример: запуск в безголовом режиме
import time
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
time.sleep(5)
driver.quit()
Поиск элементов страницы
Необходимый этап при скрапинге данных — найти соответствующие элементы HTML в DOM. Selenium предоставляет два основных метода для поиска элементов на странице:
find_element
: Находит один элемент, соответствующий критериям.find_elements
: Находит все элементы, соответствующие критериям.
Оба метода поддерживают восемь различных способов для локализации элементов HTML:
Метод | Назначение | Пример HTML | Пример Selenium |
---|---|---|---|
By.ID | Локализация по ID элемента | <form id="loginForm">...</form> |
driver.find_element(By.ID, 'loginForm') |
By.NAME | Локализация по имени элемента | <input name="username" type="text" /> |
driver.find_element(By.NAME, 'username') |
By.XPATH | Локализация по XPath | <p><code>My code</code></p> |
driver.find_element(By.XPATH, "//p/code") |
By.LINK_TEXT | Локализация гиперссылки по тексту | <a href="continue.html">Continue</a> |
driver.find_element(By.LINK_TEXT, 'Continue') |
By.PARTIAL_LINK_TEXT | Локализация гиперссылки по части текста | <a href="continue.html">Continue</a> |
driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti') |
By.TAG_NAME | Локализация по имени тега | <h1>Welcome</h1> |
driver.find_element(By.TAG_NAME, 'h1') |
By.CLASS_NAME | Локализация по имени класса | <p class="content">Welcome</p> |
driver.find_element(By.CLASS_NAME, 'content') |
By.CSS_SELECTOR | Локализация по CSS-селектору | <p class="content">Welcome</p> |
driver.find_element(By.CSS_SELECTOR, 'p.content') |
Вернемся к странице ScrapingClub и напишем следующий код для поиска элемента кнопки "Get Started" для первого упражнения:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
time.sleep(5)
driver.quit()
Взаимодействие с элементами
После того как мы найдем элемент кнопки "Get Started", нам нужно нажать на кнопку, чтобы перейти на следующую страницу. Это включает взаимодействие с элементом. Selenium предоставляет несколько методов для имитации действий:
click()
: Нажать на элемент;clear()
: Очистить содержимое элемента;send_keys(*value: str)
: Имитировать ввод с клавиатуры;submit()
: Отправить форму;screenshot(filename)
: Сохранить снимок экрана страницы.
Для дополнительных взаимодействий см. официальную документацию: API WebDriver. Давайте продолжим улучшать код упражнения ScrapingClub, добавив взаимодействие с кликом:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()
time.sleep(5)
driver.quit()
Извлечение данных
Когда мы переходим на первую страницу упражнения, нам нужно собрать информацию о изображении продукта, его названии, цене и описании. Мы можем использовать различные методы для нахождения этих элементов и их извлечения:
from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()
product_name = driver.find_element(By.CLASS_NAME, 'card-title').text
product_image = driver.find_element(By.CSS_SELECTOR, '.card-img-top').get_attribute('src')
product_price = driver.find_element(By.XPATH, '//h4').text
product_description = driver.find_element(By.CSS_SELECTOR, '.card-description').text
print(f'Product name: {product_name}')
print(f'Product image: {product_image}')
print(f'Product price: {product_price}')
print(f'Product description: {product_description}')
driver.quit()
Код выведет следующее содержимое:
Product name: Майка с длинным рукавом из джерси
Product image: https://scrapingclub.com/static/img/73840-Q.jpg
Product price: $12.99
Product description: Сознательная. Облегающая майка с длинным рукавом из органического хлопка с круглым вырезом. 92% хлопок, 3% спандекс, 3% вискоза, 2% полиэстер.
Ожидание загрузки элементов
Иногда из-за сетевых проблем или других причин элементы могут еще не загрузиться, когда Selenium завершает работу, что может привести к сбою сбора данных. Чтобы решить эту проблему, мы можем установить ожидание, пока не загрузится определенный элемент перед продолжением извлечения данных. Вот пример кода:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()
# ожидание полной загрузки элементов изображения продукта
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.card-img-top')))
product_name = driver.find_element(By.CLASS_NAME, 'card-title').text
product_image = driver.find_element(By.CSS_SELECTOR, '.card-img-top').get_attribute('src')
product_price = driver.find_element(By.XPATH, '//h4').text
product_description = driver.find_element(By.CSS_SELECTOR, '.card-description').text
print(f'Product name: {product_name}')
print(f'Product image: {product_image}')
print(f'Product price: {product_price}')
print(f'Product description: {product_description}')
driver.quit()
Обход защиты от скрапинга
Упражнение ScrapingClub легко выполнить. Однако в реальных сценариях сбора данных получить данные не так легко, потому что некоторые веб-сайты используют методы защиты от скрапинга, которые м
огут обнаружить ваш сценарий как бота и заблокировать сбор. Самая распространенная ситуация — это капча, такие как funcaptcha, datadome, recaptcha, hcaptcha, geetest и др.
Для решения этих вызовов капчи требуется обширный опыт в машинном обучении, обратной инженерии и контрмер по браузерному отпечатку, что может занять много времени. К счастью, теперь вам не нужно делать всю эту работу самостоятельно. CapSolver предоставляет полное решение, чтобы помочь вам легко обойти все вызовы. CapSolver предлагает браузерные расширения, которые автоматически решают вызовы капчи при использовании Selenium для сбора данных. Кроме того, они предоставляют API-методы для решения вызовов капчи и получения токенов, что можно выполнить всего за несколько секунд. Смотрите документацию CapSolver для получения дополнительной информации.
Вывод
От извлечения деталей продукта до навигации через сложные анти-скрапинговые меры, скрапинг веб-страниц с помощью Selenium открывает двери в огромный мир автоматизированного сбора данных. При переходе по постоянно изменяющемуся ландшафту веба инструменты, такие как CapSolver, предоставляют возможность более плавного извлечения данных, что делает ранее сложные задачи в прошлом. Так что, будь то энтузиаст данных или опытный разработчик, использование этих технологий не только повышает эффективность, но и открывает мир, где доступ к аналитике, основанной на данных, всего лишь в одном скрэпе