CoderCastrov logo
CoderCastrov
Парсер

Как парсить динамический веб-сайт с использованием метода API

Как парсить динамический веб-сайт с использованием метода API
просмотров
7 мин чтение
#Парсер

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

Различия между динамическими и статическими веб-сайтами

Возможно, вы слышали термины "статический веб-сайт" и "динамический веб-сайт", когда люди разговаривают, но, возможно, вы не знаете...

www.pluralsight.com

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

Примеры статических веб-сайтов: http://quotes.toscrape.com/, www.google.com - все страницы являются статическими, но страница с изображениями Google является динамической, так как она загружает новые изображения на той же странице при прокрутке вниз, а не на новой странице.

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

Примеры динамических веб-сайтов: http://quotes.toscrape.com/scroll - если пользователь прокрутит страницу до конца, будет сгенерировано событие и новые цитаты будут загружены на той же странице с предыдущими цитатами. На странице с изображениями Google, если пользователь прокрутит страницу (автоматическое событие) или нажмет кнопку "Показать еще", будут загружены новые изображения на той же странице с уже загруженными изображениями.

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

Шаг 1: Проверьте, является ли веб-сайт динамическим или статическим, и также проанализируйте структуру веб-сайта.

Шаг 2: Выберите метод парсинга

  • Scrapy: Если веб-сайт является статическим, парсинг будет быстрее, и он потребляет меньше памяти и процессорного времени. Официальная ссылка
  • Scrapy-Splash: Если динамический веб-сайт имеет простую структуру, скорость парсинга быстрее, и он потребляет меньше памяти и процессорного времени по сравнению с Selenium. Официальная ссылка
  • Selenium: Если структура динамического веб-сайта сложная, а размер данных для парсинга небольшой или средний, скорость парсинга будет медленнее, и он потребляет больше памяти и процессорного времени. Официальная ссылка
  • Selenium-Grid: Параллельный и распределенный парсинг динамических веб-сайтов, скорость парсинга быстрее, но он потребляет много памяти и процессорного времени, поэтому требуется более мощная система для увеличения параллелизма. Ссылка
  • Библиотека Selenium-SubProcess: Параллельный парсинг динамических веб-сайтов, скорость парсинга быстрее, потому что он не ждет завершения одного экземпляра драйвера Chrome Selenium, как в Selenium-Grid, и если один из них завершается с ошибкой, он не останавливается и не застревает в неудачном экземпляре. Но в Selenium-Grid, если один из них застрял в цикле или завершился с ошибкой, вся система застрянет. Он также потребляет много памяти и процессорного времени. Код перенесен из Selenium-Grid. Ссылка
  • API: У каждого веб-сайта есть API, который является языком общения между фронтендом и бэкендом, насколько я знаю. Мы должны использовать этот метод, если веб-сайт является динамическим, структура сложная, а размер данных для парсинга очень большой. Скорость парсинга быстрее, и он потребляет меньше памяти и процессорного времени, так как мы получаем данные в структурированном формате JSON. Поэтому нам не нужно выполнять процесс рендеринга в большинстве случаев.
  • Гибридный: Я рекомендую использовать комбинацию каждого метода в зависимости от структуры веб-сайта, чтобы парсить его быстрее и уменьшить сложность кода. Например, на большинстве веб-сайтов страница со списком элементов является динамической, а страница элемента - статической. Сначала я использую один из следующих методов, таких как Selenium, Selenium-Grid, Selenium-SubProcess, API, чтобы спарсить все данные списка элементов и сохранить их в CSV или базу данных, а затем использую Scrapy или Scrapy-Splash для парсинга страницы элемента.

Я настоятельно рекомендую прочитать учебник по парсингу веб-сайтов с использованием API. Проверьте эту ссылку.


Парсинг бесконечно прокручиваемых страниц

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

blog.scrapinghub.com

Предположим, мы хотим следовать указанному выше блогу, чтобы спарсить данные с quotestoscrape, но если мы хотим попробовать некоторые из вышеуказанных методов на другом защищенном веб-сайте, то мы получим ошибку ответа от запроса из-за неправильно выровненного заголовка запроса или неправильно отправленного формата заголовка запроса, если вы отправляете его через код на Python, или вы не отправили предварительный заголовок запроса.

Я взял случайный веб-сайт при написании этого блога на Medium, потому что я забыл о трудном веб-сайте, который давал мне головную боль при парсинге его.

Шаг 1: Перейдите на www.********.com, затем щелкните правой кнопкой мыши и выберите "Инспектировать" или нажмите Ctrl + Shift + I или F12.

Шаг 2: Выберите вкладку "Network" в меню "Инспектировать".

Примечание: Во вкладке "Network" выберите "XHR" в меню фильтра, потому что в quotestoscrape нет ненужных файлов. Но на другом веб-сайте может быть много файлов. Чтобы отфильтровать ненужные файлы, выберите "XHR". После использования фильтра "XHR" вы снова найдете некоторые ненужные файлы. Поэтому нам нужно найти правильные файлы, следя за тем, когда происходит событие нажатия или прокрутки, и также мы должны проверить ответ API. Если файл API содержит данные, которые мы хотим спарсить.

Шаг 3: Затем создайте событие пользователя, такое как "Показать еще" или прокрутку вниз, и отслеживайте сеть. Мы получим список новых файлов, которые будут загружены в сеть. В приведенном ниже примере мы получаем только один файл, но вы можете получить несколько новых файлов.

Шаг 4: Теперь мы должны проверить файл, который содержит данные, которые мы хотим спарсить. Для этого щелкните на этом файле, затем перейдите на вкладку "Response" или "Preview" и проверьте данные.

Шаг 5: Если данные верны, то создайте аналогичный заголовок запроса и параметры запроса в Postman и проверьте, появляются ли данные ответа или нет.

Шаг 6: Затем дублируйте запрос, используя запрос вручную с помощью библиотеки Python или используйте библиотеку Scrapy для парсинга данных.

r=requests.get("http://www.example.com/", headers={"content-type":"text"})

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

Щелкните на коде, затем введите "python" и выберите запрос на языке Python.

Шаг 7: Наконец, извлеките данные из ответа в формате JSON.

Шаг 8: Если статус ответа не равен 200 или данные не отображаются, то проверьте, правильно ли указаны заголовок запроса и параметры запроса, а также правильно ли указаны параметры заголовка запроса в соответствии с оригинальным заголовком запроса. Если все верно, но это не работает, значит "заголовок запроса, который был показан, не является правильным заголовком. В целях безопасности заголовок запроса изменяется браузером сразу после завершения запроса. Чтобы преодолеть эту проблему, мы делаем скриншот оригинального заголовка запроса или предварительного заголовка запроса, который использовался браузером для получения данных с сервера перед изменением заголовка запроса браузером.

Теперь нажмите на панель ограничения и выберите "Добавить пользовательский".

Затем нажмите "Добавить пользовательский профиль", введите имя профиля, установите скорость загрузки 10 и скорость отдачи 10, и нажмите "Добавить", затем закройте окно.

Выберите пользовательское ограничение. Теперь мы замедляем процесс запроса, ограничивая скорость интернета.

Теперь нажмите кнопку "Показать еще" или прокрутите вниз в зависимости от вашего события. Как только вы нажмете на кнопку, немедленно нажмите кнопку "Print Screen", пока не исчезнет предварительный заголовок запроса с предупреждающей иконкой! Ура, этот предварительный заголовок запроса - это оригинальный запрос, который был изменен браузером сразу после завершения запроса, но теперь запрос занимает некоторое время для завершения. Используя это время, мы делаем скриншот, затем снова делаем запрос на код Python и надеемся на лучший результат.

Бонус:

В этом небольшом разделе я расскажу о том, как получить подходящий веб-сайт для парсинга данных. Допустим, я хочу спарсить много данных с реальных визитных карточек. Предположим, у меня есть образец визитной карточки. Сначала я использую образец визитной карточки в поиске изображений Google, чтобы получить связанное изображение образца визитной карточки. Затем я ищу наиболее повторяющийся веб-сайт в поиске изображений Google. После этого я выбираю один или несколько веб-сайтов, которые часто повторяются, и проверяю наличие соответствующих данных на веб-сайте и начинаю парсить их. Я не могу гарантировать, что это будет работать всегда, и также вы можете парсить поиск изображений Google с помощью этого расширения для Chrome.

Скачать все изображения

Сохраните все изображения на активной вкладке в виде .zip файла. Легко сохраняйте фотографии с Instagram, Google Images и т. д.

chrome.google.com

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

hardikvasa/google-images-download

Скрипт на языке Python для "поиска" и "загрузки" сотен изображений из Google на локальный жесткий диск! Эта программа позволяет вам...

github.com

Отказ от ответственности: - Для записи я собрал данные с веб-сайта исключительно в образовательных целях, я не продвигаю никакую незаконную деятельность здесь. Это чисто для образовательных целей. Я не несу ответственности за использование этого для незаконных целей.

Спасибо,

Если вам понравилось, пожалуйста, поделитесь и поставьте лайк.

Благодаря Сиве Пракашу, Linkedin-https://www.linkedin.com/in/sivaprakash-desingu/, который дал идею о временных заголовках.