Создание скрапера 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 requests
from 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.py
Starting scraping
The scraping job succeeded: 200
Finsihed 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.py
import 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.

Пожалуйста, опубликуйте ваши мнения по текущей теме материала. За комментарии, дизлайки, лайки, подписки, отклики огромное вам спасибо!

Пожалуйста, опубликуйте свои мнения по текущей теме материала. За комментарии, дизлайки, подписки, лайки, отклики низкий вам поклон!

Вадим Дворниковавтор-переводчик статьи «Building an RSS feed scraper with Python»