Hacker News — популярный сайт социальных новостей со статьями и дискуссиями о технологиях, стартапах, программировании и других темах. Меня это очень захватывает, потому что каждую минуту автор обновляет множество новостей. Если вы хотите быть в курсе последних новостей и тенденций в технологической отрасли, парсинг статей Hacker News с помощью Python может быть отличным способом.

В этом посте я покажу вам, как использовать Python для извлечения статей из Hacker News и отображения тех, которые получили наибольшее количество голосов.

Примечания: Уважаемый читатель, на самом деле это мой самый первый пост на этой платформе. Я был бы очень признателен, если бы вы могли сообщить мне, если есть какая-либо дезинформация, неправильное руководство, ошибка, улучшение или идея, которой вы хотели бы поделиться со мной. Кроме того, цель этого поста — поделиться своими усилиями по очистке данных с помощью Python.

Вамос, амигос!

Предпосылки

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

Вам также необходимо установить следующие библиотеки:

  • Запросы
  • КрасивыйСуп
  • ппринт

Вы можете установить их с помощью pip, выполнив следующую команду:

pip install requests beautifulsoup4 ppr

or

import requests
from bs4 import BeautifulSoup
import pprint

Я использую это приглашение, потому что запускаю этот код из Pycharm.

Парсинг хакерских новостных статей

Теперь мы начнем с определения функции, запрашивающей у пользователя ввод URL:

def get_url():
    '''Prompt user for URL input and return the URL'''
    url = input('Enter a URL: ')
    return url

Эта функция будет использоваться для получения URL-адреса страницы Hacker News, которую мы хотим очистить.

Далее мы определим функцию для получения супа HTML из URL:

def get_soup(url):
    '''Get HTML soup from URL'''
    res = requests.get(url)
    soup = BeautifulSoup(res.content, 'html.parser')
    return soup

Эта функция использует библиотеку запросов для выполнения запроса GET к URL-адресу и библиотеку BeautifulSoup для анализа содержимого HTML в объект супа.

Затем мы определим функцию для получения ссылок и подтекста из супа HTML:

def get_links_and_subtext(soup):
    '''Get links and subtext from HTML soup'''
    links = soup.select('.titleline > a')
    subtext = soup.select('.subtext')
    return links, subtext

Эта функция использует метод select объекта супа для получения ссылок и подтекста из содержимого HTML.

Мы также определим функцию для извлечения количества голосов из строки HTML:

def get_vote(points_str):
    '''Extract vote count from HTML string'''
    points = int(points_str.replace(' points', ''))
    return points

Эта функция принимает строку HTML, содержащую количество голосов, и извлекает количество баллов.

Далее мы определим функцию для создания пользовательского списка Hacker News со ссылками, подтекстом и подсчетом голосов:

def create_custom_hn(links, subtext, threshold):
    '''Create a custom Hacker News list with links, subtext, and vote count'''
    hn = []
    for idx, item in enumerate(links):
        title = item.getText()
        href = item.get('href', None)
        vote = subtext[idx].select('.score')
        if len(vote):
            points_str = vote[0].getText()
            points = get_vote(points_str)
            if points >= threshold:
                hn.append({'title': title, 'link': href, 'votes': points})
    return hn

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

Наконец, мы определим функцию для сортировки списка Hacker News по количеству голосов в порядке убывания:

def sort_stories_by_votes(hn):
    '''Sort Hacker News list by vote count in descending order'''
    return sorted(hn, key=lambda k: k['votes'], reverse=True)

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

def main():
    '''Main function to run the script'''
    url = get_url()
    soup = get_soup(url)
    links, subtext = get_links_and_subtext(soup)
    threshold = 400 # changeable value
    hn = create_custom_hn(links, subtext, threshold)
    hn_sorted = sort_stories_by_votes(hn)
    pprint.pprint(hn_sorted)

И последнее, но не менее важное: строка if __name__ == '__main__': в конце скрипта гарантирует, что функция main() вызывается только в том случае, если скрипт запускается напрямую, а не в том случае, если он импортируется как модуль другим скриптом.

if __name__ == '__main__': 
    main()

Будущее улучшение

  1. Используйте кеширование: при парсинге сайта можно отправить несколько запросов на одну и ту же страницу. Это может привести к медленной работе веб-сайта или, возможно, к блокировке IP-адреса. Использование кэширования поможет вам предотвратить это. Для этого библиотека кеша запросов является мудрым вариантом.
  2. Используйте фреймворк для веб-скрейпинга: фреймворки для веб-скрейпинга, такие как Scrapy, могут упростить процесс парсинга и предложить дополнительные возможности.
  3. Используйте заголовки: при отправке запроса на веб-сайт рекомендуется включать заголовки в ваши запросы. Это может предотвратить пометку вашего запроса как подозрительную активность или спам.

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

Спасибо, что прочитали мой первый пост в блоге! Я с нетерпением жду, чтобы поделиться с вами больше в будущем. Следите за моим будущим контентом!