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()
Будущее улучшение
- Используйте кеширование: при парсинге сайта можно отправить несколько запросов на одну и ту же страницу. Это может привести к медленной работе веб-сайта или, возможно, к блокировке IP-адреса. Использование кэширования поможет вам предотвратить это. Для этого библиотека кеша запросов является мудрым вариантом.
- Используйте фреймворк для веб-скрейпинга: фреймворки для веб-скрейпинга, такие как Scrapy, могут упростить процесс парсинга и предложить дополнительные возможности.
- Используйте заголовки: при отправке запроса на веб-сайт рекомендуется включать заголовки в ваши запросы. Это может предотвратить пометку вашего запроса как подозрительную активность или спам.
На мой взгляд, эта практика — хороший пример того, как использовать библиотеки Python для сбора данных с веб-сайтов. Это также хорошая отправная точка для всех, кто интересуется сбором данных с похожих веб-сайтов.
Спасибо, что прочитали мой первый пост в блоге! Я с нетерпением жду, чтобы поделиться с вами больше в будущем. Следите за моим будущим контентом!