Минималистическое пошаговое руководство по парсингу с помощью Scrapy (Часть V)
Table Of Content
Систематический парсинг веб-страниц для начинающих
Часть I, Часть II, Часть III, Часть IV, Часть V
В этой последней части серии уроков я кратко расскажу о очень важной теме: динамическом парсинге. Пример кода можно найти в следующем репозитории:
harrywang/scrapy-selenium-demo
В этом репозитории содержится код для части V моего учебника: Минималистический учебник по парсингу с использованием Scrapy (…
github.com
В реальных проектах по парсингу веб-сайтов вы часто не можете прямо обходить сайты, используя подход, представленный в первых четырех частях этого учебника, по разным причинам, таким как динамическая генерация веб-страниц (как в примере в этом учебнике, где веб-страница загружается, когда пользователь прокручивает до конца текущей страницы), необходимость входа в систему с использованием динамической формы входа и т. д. В этой ситуации одним из вариантов является использование Selenium https://www.selenium.dev/, чтобы имитировать действия реального пользователя, управляя браузером для получения данных.
Веб-страница, которую мы собираемся парсить, находится по адресу https://dribbble.com/designers, которая является бесконечной прокруткой страницы - больше содержимого страницы появляется, когда вы прокручиваете до конца страницы. Selenium позволяет нам управлять браузером с помощью кода, и в этом примере мы используем Chrome. Также убедитесь, что вы установили Selenium и Scrapy, как показано в файле requirements.txt
.
Сначала вам нужно установить Chrome на компьютере, на котором вы собираетесь запустить код парсинга, и загрузить файл драйвера Chrome с https://chromedriver.chromium.org/downloads для Selenium. Убедитесь, что версия драйвера соответствует установленной версии Chrome (проверьте это в меню → Chrome → О Google Chrome):
Вы должны заменить файл драйвера Chrome в репозитории на правильную версию, чтобы код работал!
Поскольку код довольно прост, я не буду вдаваться в подробности и объясню только ключевые идеи. В файле паука:
- Сначала я использую
last_height = driver.execute_script(“return document.body.scrollHeight”)
, чтобы получить текущую высоту страницы - затем я использую
driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”)
, чтобы прокрутить до конца страницы и получить загруженное содержимое страницы - жду 5 секунд и повторяю это - каждый раз собирается больше содержимого страницы - пока я не смогу прокрутить больше или не достигну предопределенного максимального количества прокруток (в данном случае 10)
Я также включил небольшой пример, чтобы показать, как можно автоматически найти поле поиска, ввести "New York" и нажать кнопку поиска (пауза 1 секунда между действиями):
search_location = driver.find_element_by_css_selector('#location-selectized').send_keys('New York')
sleep(1)
search_button = driver.find_element_by_css_selector('input[type="submit"]') search_button.click()
sleep(5)
Теперь, когда вы запускаете scrapy crawl dribbble
, будет запущен экземпляр Chrome, и вы можете видеть прокрутку до конца страницы и действия поиска, о которых я только что упомянул - все полностью автоматизировано :). Извлеченные данные регистрируются в консоли.
В репозитории я также включил код, чтобы показать, как можно использовать сервис прокси "ProxyMesh" для смены IP-адресов, чтобы избежать возможного блокирования со стороны веб-сайта - вы никогда не должны агрессивно парсить любой веб-сайт, что по сути является видом атаки отказа в обслуживании (DOS).
Для ProxyMesh вам нужно зарегистрироваться и затем вы можете получить адрес прокси-сервера, например, http://harrywang:mypassword@us-wa.proxymesh.com:31280
, и вы должны установить локальную переменную среды http_proxy
: export http_proxy=http://harrywang:mypassword@us-wa.proxymesh.com:31280
, затем активировать HttpProxyMiddleware, раскомментировав следующую часть в settings.py
:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 100,
}
Чтобы ProxyMesh работал с Selenium, выполните следующие два шага:
# PROXY = "us-wa.proxymesh.com:31280"
# chrome_options.add_argument('--proxy-server=%s' % PROXY)
Вот и все! Спасибо за чтение!