CoderCastrov logo
CoderCastrov
Наука о данных

Минималистическое пошаговое руководство по парсингу с помощью Scrapy (Часть V)

Минималистическое пошаговое руководство по парсингу с помощью Scrapy (Часть V)
просмотров
3 мин чтение
#Наука о данных

Систематический парсинг веб-страниц для начинающих

Часть 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)

Вот и все! Спасибо за чтение!

Часть I, Часть II, Часть III, Часть IV, Часть V