темный логотип proxyscrape

Как скрапировать страницы с бесконечной прокруткой с помощью Python

Как это сделать, Python, Скрапинг, Мар-06-20245 минут чтения

В современном мире все используют новые технологии. Вы можете получить доступ к структурированным данным в автоматизированном режиме с помощью веб-скрепинга. Например, вы можете использовать веб-скраппинг для: Бесконечная прокрутка, также известная как бесконечная прокрутка, - это техника веб-дизайна, которую веб-сайты часто используют с AJAX или Javascript.

Оглавление

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

  • Мониторинг цен
  • Генерация свинца
  • Мониторинг новостей
  • Исследование рынка
  • Ценовой интеллект

Бесконечная прокрутка, также известная как бесконечный скроллинг, - это техника веб-дизайна, которую веб-сайты часто используют с AJAX или Javascript для динамической загрузки дополнительного контента, когда пользователь прокручивает страницу до самого низа. Эта техника приобрела популярность благодаря успеху в социальных сетях. Например, бесконечная прокрутка в Twitter осуществляется за счет асинхронной загрузки. Twitter выполняет вызовы AJAX после загрузки страницы, чтобы постоянно добавлять новый контент по мере прокрутки. Хотя бесконечная прокрутка имеет множество преимуществ, ее не рекомендуется использовать в задачах поиска, требующих от пользователя найти определенный контент.

Давайте сначала разберемся в преимуществах скраппинга страниц с бесконечной прокруткой.

Зачем нужно скрести страницы с бесконечной прокруткой?

Ниже перечислены некоторые причины, по которым необходимо скрапировать страницы с бесконечной прокруткой.

  • Вовлеченность пользователей - бесконечная прокрутка удерживает пользователей на странице. На сайтах социальных сетей, таких как Twitter и Facebook, можно прокручивать тонны пользовательского контента, поэтому пользователь постоянно вовлечен в процесс. 
  • Меньше кликов - Прокрутка требует меньше действий, и она проще для пользователей, чем клики.
  • Идеально подходит для мобильных устройств - бесконечная прокрутка отлично подходит для мобильных устройств и сенсорных экранов. Пользователи могут пролистывать вниз, чтобы получить новый контент, вместо того чтобы переходить на новые вкладки. 

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

  • Это не очень хорошо для поисковой оптимизации (SEO).
  • Пользователям с ограниченными физическими возможностями нелегко ориентироваться на страницах с бесконечной прокруткой.
  • Сайты с бесконечной прокруткой могут иметь длительное время загрузки, которое может быть как со стороны пользователя, так и со стороны разработчика.

Как скрапировать страницы с бесконечной прокруткой с помощью Python

Давайте посмотрим, как с помощью Python скрафтить страницы с бесконечной прокруткой с помощью описанных ниже шагов.

Импорт библиотек

Вам необходимо импортировать библиотеку Selenium.

from selenium import webdriver
из selenium.webdriver.common.keys import Keys    
импортировать время

Настройка Selenium

Здесь вам нужно выбрать браузер, который вы хотите использовать. Мы выберем Chrome, так как он предлагает больше возможностей, чем Firefox. 

def get_selenium():                          
  options = webdriver.ChromeOptions()
  options.add_argument('--ignore-certificate-errors')
  options.add_argument('--incognito')
  options.add_argument('headless')                       
   driver = webdriver.Chrome(chrome_options=options)
  return (driver)

Аргумент headless, упомянутый выше, очень важен. Selenium не будет открывать Chrome в новом окне при запуске без головы в Python. Однако если вы столкнетесь с проблемой во время скраппинга, вы можете закомментировать опцию headless и посмотреть, что происходит в Chrome и что загружается на странице.

Мы можем опустить два флага: ignore-certificate-errors и incognito.

Если вы столкнулись с капчей или баннером cookie, который мешает загрузке страницы, вы можете нажать OK и перейти на страницу в обычном режиме. Однако если браузер неожиданно закрывается, вы можете использовать time.sleep(), чтобы приостановить выполнение кода и уделить достаточно времени отладке.

Устранение бесконечной прокрутки

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

  • Вам нужно найти последний элемент, загруженный на страницу.
  • Чтобы прокрутить страницу вниз до этого элемента, необходимо использовать Selenium.
  • Чтобы подождать, пока страница загрузит больше содержимого, используйте time.sleep().
  • Прокрутите страницу до последнего элемента, который был загружен на страницу.
  • Повторяйте этот процесс, пока не дойдете до конца страницы.

Для лучшего понимания вы можете рассмотреть приведенный ниже пример.

selenium = get_selenium()              
selenium.get("your/url")   
last_elem = '';
while True:
   current_last_elem = "#my-div > ul > li:last-child"
   scroll = "document.querySelector(\'" + current_last_elem + "\').scrollIntoView();"
   selenium.execute_script(scroll)
   time.sleep(3)
  if (last_elem == current_elem)
     break
  else
      last_elem = current_elem

В приведенном выше коде мы использовали jQuery и Javascript внутри Python. 

Вот,

  • Мы использовали функцию selenium.get(), которая откроет нашу страницу URL. Однако если вы хотите добавить ключевое слово в поиск URL, вы можете использовать следующую строку кода.
selenium.get("your/url.com/{0}".format(keyword))
  • Мы инициализировали last_time равным 0, записав в него пустую строку.
  • Мы использовали цикл while, в котором использовали CSS_selector или Xpath для получения текущего_последнего_элемента. Чтобы получить путь, выполните следующие действия. Откройте страницу. Чтобы выбрать элемент, к которому вам нужен путь, необходимо использовать инструменты webdev. Вы можете следовать этому руководству, чтобы выбрать элемент в HTML-структуре страницы и получить Xpath в Chrome.
  • Откройте свою страницу.
  • Чтобы выбрать элемент, к которому нужен путь, необходимо использовать инструменты webdev. Вы можете следовать этому руководству, чтобы выбрать элемент в HTML-структуре страницы и получить Xpath в Chrome.
  • Для прокрутки страницы вниз до выбранного элемента мы использовали jQuery и функцию scrollIntoView(). 
"document.querySelector(\'" + .. + "\').scrollIntoView();"

Здесь формат должен быть правильным, поэтому обратите внимание на одинарные и двойные кавычки, а также на управляющие символы.

  • Мы запускаем js-скрипт с помощью selenium.execute_script().
  • Необходимо дать странице достаточно времени для загрузки, чтобы она смогла найти последний элемент. Поэтому функция time.sleep() очень важна, так как она приостанавливает выполнение на несколько секунд. Если вы не дадите странице достаточно времени для загрузки, она остановит прокрутку, и вы получите неопределенный результат.
  • Мы проверяем, найден ли новый последний элемент каждый раз, когда прокручиваем страницу вниз. Если он найден, значит, мы еще не достигли конца страницы и должны продолжать прокрутку. Если не найден, значит, страница закончила прокрутку вниз, и мы можем выйти из цикла.

Устранение частых проблем

Среди часто встречающихся проблем при бесконечной прокрутке можно назвать следующие:

  • Поиск правильного Xpath к последнему элементу занимает некоторое время. Необходимо проверить одинарные и двойные кавычки в js-скрипте.
  • Если вы каждый раз получаете неопределенный или один и тот же последний элемент, вам нужно увеличить продолжительность времени, то есть увеличить time.sleep(), так как страница может не успеть полностью загрузиться. 
  • Вы можете закомментировать опцию headless в get_selenium(), если все правильно, но это все равно не сработает.

Запуск js внутри Python

Можно запустить js-скрипт из Python и получить в результате список. 

Например, мы можем использовать приведенный ниже код, чтобы получить источники всех изображений на странице.

js_script = '''\    
var jslist = []  
document.querySelectorAll('img').forEach(i => jslist.push(i.src));
return jslist; 
 '' '   
python_list = selenium.execute_script(js_script)

В приведенном выше коде,

  • Мы создали пустой массив под названием jslist.
  • Мы выбрали все теги img на странице.
  • Мы использовали forEach для вставки каждого img.src в наш массив.
  • Мы вернули jslist.

Мы можем использовать тот же подход для ссылок href:

  • Выбор всех тегов "a".
  • Вставляем каждый a.href в наш массив.

После этого мы можем запустить скрипт с помощью selenium.execute_script(). Затем мы можем сохранить возвращаемое значение js в переменной python, т.е. python_list. 

Вот как мы можем скрапировать страницы с бесконечной прокруткой с помощью Python.

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

Вы знаете, что прокси - это сторонний сервер, который выступает в качестве посредника между клиентом, запрашивающим ресурс, и сервером, предоставляющим этот ресурс. Если вы хотите использовать прокси с Selenium и Python, вы можете использовать следующие строки кода.

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s'% hostname +": "+port)
driver = webdriver.Chrome(chrome_options=chrome_options)

Для работы с бесконечной прокруткой вы можете использовать scroll-proxy, который поддерживает программную прокрутку прокручиваемых представлений в иерархии представлений. Если вы используете npm, вы можете установить scroll-proxy с помощью команды ниже. Для демонстрации использования scroll-proxy мы будем использовать js.

npm install scroll-proxy--save

После установки scroll-proxy вы можете создать объект ScrollProxy, используя приведенный ниже код.

var myScroll = новый ScrollProxy();

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

Однако если вы хотите получать обновления, когда пользователь прокручивает страницу внутри определенного HTML-элемента, вам нужно передать его в конструктор.

var myDiv = document.querySelector('.scrollable');
var myDivScroll = new ScrollProxy(myDiv);

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

Ниже перечислены некоторые причины, по которым следует использовать прокси при скраппинге бесконечного скроллинга.

  • Капча может привести к тайм-ауту страницы и заблокировать ваш скрепер. Вы можете вручную проверить страницу на наличие капчи, если часто получаете ошибки тайм-аута. Большинство капч срабатывает из-за мер безопасности, и вы можете избежать их, используя ротационные жилые прокси вместе с вашим скрапером.
  • Некоторые сайты предпочитают отфильтровывать подозрительные запросы по заголовкам, основываясь на предположении или вероятности того, что пользовательский агент может быть ботом. Чтобы избежать сигнала о том, что вы бот, вы можете использовать прокси-серверы, которые могут изменить ваш IP-адрес и предотвратить появление красных флажков для вас (user-agent). 

Заключение

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

Надеюсь, вы поняли, как скреативить страницы с бесконечной прокруткой с помощью Python.