CoderCastrov logo
CoderCastrov
Парсер веб-страниц

Как парсить Google News — BeautifulSoup | Requests

Как парсить Google News — BeautifulSoup | Requests
просмотров
4 мин чтение
#Парсер веб-страниц

Парсинг веб-сайтов

Что я хочу

  • парсить новости на [странице], которая содержит заголовки, источники, даты и время, и ссылки
  • создать DataFrame из этого и сохранить его в csv

Проблемы

  • [Учебник], который я нашел на YouTube, использует **.py **вместо **.ipynb. Он использует библиотеку [Requests-HTML] **и она не работает в **.ipynb. Есть обходной путь для этого, но он [сложный] [сложный]. **Я попробовал использовать **.py **и это работает, но я просто люблю блокноты. Поэтому я сдаюсь.
  • другой [учебник2]** использует пакеты и рекомендует использовать API сторонней компании, чтобы избежать блокировки Google. Пакет [pygooglenews] не установился успешно на моей системе. Он говорит, что зависимости библиотеки конфликтуют. Моя система использует conda environment, а пакет доступен только в [pip]. **Я беспокоюсь, что установка чего-либо в pip может конфликтовать с другими моими библиотеками Python. Я сдаюсь, снова.
  • Я попытался найти [прямой запрос API]** **, но не нашел ничего. Идем дальше.
  • Я нашел еще один [учебник]** , в котором парсят онлайн-книжный магазин с помощью [BeautifulSoup4]. **Проблемы следующие:
  • ______ Он парсит оффлайн-файл HTML, а не запросы. Есть обходной путь для этого с использованием библиотеки [Requests]** **. Я собираюсь использовать это.
  • ______ Поскольку веб-сайт отличается, мне нужно изучить HTML (теги, атрибуты и CSS-селекторы). Достаточно понять, где данные хранятся в HTML. Есть отличный [учебник]** **по этому, он сосредоточен на def function и iteration и у меня возникли трудности с этим.
  • BeautifulSoup парсит HTML, поэтому для веб-сайтов с большим количеством JavaScript, таких как news.google, люди обычно используют HTMLSession. Вот [учебник]** **снова на **.py. **Или еще один обходной путь с использованием **BeautifulSoup и Selenium, как в этом [учебнике] и [этих]. И тем не менее, **люди все равно не рекомендуют использовать selenium для парсинга. Вот почему [статья] и [статья2]
  • Чтобы лучше понять разные инструменты и ограничения, рекомендуется прочитать [здесь], [здесь2], и [здесь3]

Окружение

  • **IDE: **VSCode с расширениями Jupyter Notebook
  • **Парсер: **bs4, requests
  • Ограничение: так как сайт news.google содержит много JavaScript, bs4 не справляется с ним хорошо, поэтому я использую только функцию **.select(). **С другой стороны, **CSS-селекторы **помогают при парсинге, но я все еще путаюсь в некоторых моментах. Наконец, я не буду добавлять функцию **scroll down в этот парсер, так как для этого требуется использовать selenium, вот хороший [туториал] **по этому.

Финальный код

Чтение HTML

Нажмите **F12** или щелкните правой кнопкой мыши > **инспектировать** в вашем браузере каждая новость находится внутри тега **`<article>``</article>`**

Объяснение:

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

  • каждая новость находится внутри тега <article>``</article>, что означает, что на одну новость приходится один тег, если есть 10 новостей, то будет 10 <article>``</article>. См. изображение выше, я просто навел курсор на одну из новостей.
  • каждый тег внутри <article>``</article> имеет одинаковый класс по всему HTML-документу. См. изображение ниже.

Парсинг HTML

Объяснение:

  • **.select(‘article .DY5T1D.RZIKme’): **находит и выбирает все элементы внутри тега <article> с классом "DY5T1D RZIKme". Пробелы имеют значение здесь.
  • **.text: **парсит все, что находится внутри тега <tag>здесь</tag>
  • **t.text: **для каждого парсинга
  • **.select(): рекомендую ознакомиться с CSS-селекторами **- здесь много примеров по работе с этой темой
  • **for loop: **это обычный цикл for, только он встроенный. Я не пробовал объединить их все вместе в def функцию, это предмет другой статьи.

Парсинг относительного URL в абсолютный URL

Объяснение:

  • все ссылки в newsgoogle являются относительными URL, так как JavaScript обрабатывает ссылки в фоновом режиме. Это будет почти всегда так в случае веб-сайтов, основанных на JavaScript.
  • Я использую urljoin, чтобы объединить base_link и все, что найдено с помощью .get(href). Вот почему я прохожу по нему в цикле и добавляю все в пустой список links = []
  • Почему я помещаю URL в список? Просто потому, что title, source и datetime - все это типы списков.

DataFrame в csv

Объяснение:

  • **zip(): **[здесь] хорошее объяснение. В основном, то, что он делает, это zip(итератор1, итератор2, итератор3 …). Поскольку наши данные сохранены в переменной итерации
  • **pd.DataFrame(): **для преобразования списка в DataFrame это так просто, как это есть
  • **to_csv(): **я обычно использую **r’’ **для обработки пути в Windows. [Здесь] хорошая статья об этом

Заключение

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


Мне сказали, что будет что-то удивительное, если вы Зажмете + Нажмете 👏. Хорошего дня 😁