Создание скрапера RSS-канала с помощью Python

Программный код этого проекта доступен на моем GitHub в разделе web_scraping_example.

В этом руководстве при помощи Python мы создадим простой скрапер RSS-канала, который можно использовать на любом веб-сайте.

Необходимые ресурсы:

  • Python 3.7+.
  • Библиотека Requests.
  • Библиотека BeautifulSoup 4(BS4).
  • Текстовый редактор(я использую Visual Studio Code).

Начинаем

Сначала создадим каталог проекта и перейдем в него из командной строки.

$ mkdir web_scraping_example && cd web_scraping_example

Далее создадим файл проекта.

$ touch scraping.py

Примечание: я использую Ubuntu, так что мои команды могут отличаться от.

После этого установите пакеты, которые мы будем использовать. Вы можете без труда сделать это при помощи pip:

$ pip install requests$ pip install bs4

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

В файле scraping.py мы импортируем установленные пакеты при помощи pip.

# scraping.pyimport requestsfrom bs4 import BeautifulSoup

Это сможет использовать возможности, предоставляемые библиотеками Requests и BeautifulSoup.

Тестирование запроса

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

Начнем с создания базовой возможности скрапинга.

# scraping.py# импорт библиотек пропущен...# функцию скрапингаdef hackernews_rss('https://news.ycombinator.com/rss'): try: r = requests.get() return print('The scraping job succeeded: ', r.status_code) except Exception as e: print('The scraping job failed. See exception: ')     print(e)print('Starting scraping')hackernews_rss()print('Finished scraping')

Мы вызываем библиотеку Requests и загружаем веб-сайт при помощи request.get(…). Далее выводим программный код состояния в терминал, используя r.status_code, чтобы проверить подключение к веб-сайту. Также для отслеживания ошибок мы используем блок try: except:.

После запуска программы мы получи программный код состояния 200. Это означает, что мы можем пропинговать веб-сайт и «приобрести» информацию.

$ python scraping.pyStarting scrapingThe scraping job succeeded: 200Finsihed scraping

Скрапинг содержимого

Сейчас начинаем извлекать XML-контент с веб-сайта при помощи BS4 и Requests.

# scraping.py...def hackernews_rss():    try:        r = requests.get('https://news.ycombinator.com/rss')        soup = BeautifulSoup(r.content, features='xml')                return print(soup)...

Этот код запишет извлекаемый XML-контент в переменную soup. Мы используем r.content для передачи возвращенного контента в BeautifulSoup. Обратите внимание, что мы используем features=’xml’.

Разбор данных

Начнем с рассмотрения структуры RSS-канала:

<item><title>...</title><link>...</link><pubDate>...</pubDate><comments>...</comments><description>...</description></item>

Каждая из статей, доступных в RSS, имеет в себя приведенную выше структуру. Она включает всю необходимую информацию в тегах элементов — <item> … </ item>. Мы будем использовать постоянные теги элементов для анализа информации.

# scraping.py def hackernews_rss():    article_list = []    try:        r = requests.get('https://news.ycombinator.com/rss')        soup = BeautifulSoup(r.content, features='xml')        articles = soup.findAll('item')                for a in articles:            title = a.find('title').text link = a.find('link').text published = a.find('pubDate').text article = {                'title': title,                'link': link,                'published': published                }            article_list.append(article)        return print(article_list)...

Начнем с проверки articles = soup.findAll(‘item’). Это сможет извлечь каждый из тегов <item> … </ item> из XML.

Каждая из статей будет разделена при помощи цикла: for a in articles:. Это сможет разделить данные на отдельные переменные и добавить их в созданный пустой словарь.

Библиотека BS4 модифицировала код XML в строку. Это может вызывать возможность find() для каждого из объектов, чтобы найти теги. Используя.text, очистим элементы от <tag> … </ tag> и сохраним только строку. Далее поместим элементы в список, чтобы позже приобрести к ним доступ через article_list.append(article).

Теперь при запуске программы-скрапера будут выведены извлеченные из RSS данные.

Отображение в файл

Сейчас RSS-канал успешно отображается через возможность print(). Сейчас поместим данные в.txt-файл при помощи JSON.

Начнем с создания ещё одной возможности def save_function():. В виде аргументов она принимает список из возможности hackernews_rss().

# scraping.pyimport json...def save_function(article_list):    with open('articles.txt', 'w') as outfile:        json.dump(article_list, outfile)...

Для записи результатов веб-скрапинга в файл article.txt используется библиотека JSON. Этот файл будет перезаписан при выполнении программы.

Другой способ записи в.txt-файл – использование цикла for:

# scraping.py...def save_function(article_list):with open('articles.txt', 'w') as f:for a in article_list:f.write(a+'n')f.close()

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

# scraping.py...def hackernews_rss():...    try:...        return save_function(article_list)...

Изменив return print(article_list) на возможность save_function (article_list), мы можем перенести данные в текстовый файл. Запустив программу, вы получите.txt файл с данными, извлеченными из RSS-канала.

Заключение

Мы успешно создали инструмент веб-скрапинга RSS-каналов, используя Python, Requests и BeautifulSoup. Они могут преобразовывать информацию из XML в читаемый формат.

Что дальше?

В данной статье были рассмотрены только основы веб-скрапинга. Вы можете без проблем улучшить данный проект, используя Celery и Django.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *