30 дней питона (серия 30 частей)
Скраинг в Интернете – это метод или концепция извлечения данных с веб -сайта, ползая им. В основном он используется для сбора значимых данных с веб -сайтов, особенно когда нет доступных API для извлечения информации. Сегодня я исследовал основы сети с Python и хотел бы поделиться своим опытом.
Сскабливание – это форма сценариев, которая позволяет нам автоматизировать процесс извлечения больших неструктурированных данных с веб -сайтов и организовать их структурированным способом их использования для нескольких целей, таких как сбор электронных писем, цены на продукт, цены на акции, данные о полете или любые другие актуальные Информация. Делать такие вещи вручную занимает много времени и усилий. У Python есть удивительные библиотеки, чтобы сделать сериал довольно проще и забавную задачу для реализации. В основном я исследовал самую основную и популярную библиотеку Красивый суп Чтобы ознакомиться с концепцией.
Хорошие практики
В Интернете чрезвычайно мощный, и существует много дебатов по поводу его использования. Большинство веб -сайтов имеют robots.txt
Файл, в котором упоминается, какие конкретные URL -адреса следует заполнять (соскобаться), а какие не должны быть. Этот файл является в основном инструкцией для различных поисковых ботов, таких как Google Bot, Yahoo Bot, Bing Bot и т. Д. На каких конкретных страницах они должны ползти для оптимизации поисковой системы. Таким образом, все сканеры поисковых систем – это в основном веб -скребки, которые извлекают данные с веб -сайта, чтобы оценить их в соответствии с соответствующими ключевыми словами. Тем не менее, веб -сайт не может буквально ограничить программу для сети, чтобы не сканировать свои данные, даже если она запрещена в robots.txt
файл. Это хорошая и этическая практика, чтобы пройти через веб -сайт robots.txt
файл, если присутствуют, и извлечь данные из упомянутых URL -адресов, чтобы предотвратить какие -либо проблемы с нарушением данных.
Соскабливание с использованием красивого супа
Для сегодняшней сессии я решил попробовать извлечь данные из Hacker News Websion – Чрезвычайно популярный веб -сайт среди сообщества Dev. Это правила, определенные в его robots.txt
файл
User-Agent: * Disallow: /x? Disallow: /vote? Disallow: /reply? Disallow: /submitted? Disallow: /submitlink? Disallow: /threads? Crawl-delay: 30
Таким образом, нам разрешено ползти и извлекать данные со страницы новостей https://news.ycombinator.com/newest который перечисляет последние статьи из мира развития. Цель состоит в том, чтобы ползти первые 5 страниц и извлечь статьи с почти 100 очками вместе со своими связями. Это может быть довольно полезно для автоматического извлечения всех высокопроизводительных предметов и прочитать их из самого терминала без необходимости посещать веб -сайт Hacker News и вручную искать популярные посты.
Первые две библиотеки должны быть установлены, Запросы
Для выполнения HTTP -запросов и BeautifulSoup4
для соскоба на веб -сайте.
PIP установить запросы
PIP установить BeautifulSoup4
hacker_news_scraper.py
import requests from bs4 import BeautifulSoup BASE_URL = 'https://news.ycombinator.com' response = requests.get(BASE_URL) # extract the text content of the web page response_text = response.text # parse HTML soup = BeautifulSoup(response_text, 'html.parser') print(soup.prettify()) # prints the html content in a readable format
Документация для красивого супа https://www.crummy.com/software/beautifulsoup/bs4/doc/ демонстрирует различные варианты использования. Используя инструменты осмотренных элементов браузера, селектор для элементов можно просмотреть, а затем использовать для извлечения данных. В этом случае все статьи имеют StoryLink
класс и связанные с ними очки имеют класс счет
. Эти селекторы теперь можно использовать для получения соответствующих данных и их объединения.
# extract all the links using the class selector links_list = soup.select('.storylink') # extract all the points using the class selector points_list = soup.select('.score')
После прохождения ссылок связанный, заголовок, ссылку и их точки могут быть объединены как словарный объект, а затем добавлены в список популярных сообщений.
Следует отметить, что перечислять
Функция используется для получения индекса каждого элемента для получения соответствующих точек, поскольку точки не содержатся в контейнере ссылок.
Только сообщения с минимум 100 баллов добавляются к популярным спискам.
# loop though all links for idx, link in enumerate(links_list): # fetch the title of the post post_title = link.get_text() # fetch the link of the post post_href = link.get('href') # fetch the point text using the index of the link # convert the point to integer post_points = int(points_list[idx].get_text().replace(' points', '')) # append to popular posts as a dictionary object if points is atleast 100 if post_points >= 100: popular_posts.append( {'title': post_title, 'link': post_href, 'points': post_points})
Есть полезная встроенная библиотека Python pprint
Это печатает данные в консоли в более читаемом формате.
import pprint
Затем его можно использовать для просмотра популярных списков
# loop though all links for idx, link in enumerate(links_list): # fetch the title of the post post_title = link.get_text() # fetch the link of the post post_href = link.get('href') # fetch the point text using the index of the link # convert the point to integer post_points = int(points_list[idx].get_text().replace(' points', '')) # append to popular posts as a dictionary object if points is atleast 100 if post_points >= 100: popular_posts.append( {'title': post_title, 'link': post_href, 'points': post_points}) pprint.pprint(popular_posts) # prints in a readable format
Приведенный выше сценарий только получает популярные сообщения с первой страницы Hacker News. Однако, согласно желаемой цели, нам необходимо извлечь списки с пяти лучших страниц или, вероятно, любого введенного количества страниц. Таким образом, сценарий может быть изменен соответственно.
Вот последний сценарий, чтобы очистить популярные списки. Код также можно найти в репозитории GitHub https://github.com/arindamdawn/python-scripting
import requests from bs4 import BeautifulSoup import pprint import time BASE_URL = 'https://news.ycombinator.com' # response = requests.get(BASE_URL) def get_lists_and_points(soup): # extract all the links using the class selector links_list = soup.select('.storylink') # extract all the points using the class selector points_list = soup.select('.score') return (links_list, points_list) def parse_response(response): # extract the text content of the web page response_text = response.text # parse HTML soup = BeautifulSoup(response_text, 'html.parser') return soup def get_paginated_data(pages): total_links_list = [] total_points_list = [] for page in range(pages): URL = BASE_URL + f'?p={page+1}' response = requests.get(URL) soup = parse_response(response) links_list, points_list = get_lists_and_points(soup) for link in links_list: total_links_list.append(link) for point in points_list: total_points_list.append(point) # add 30 seconds delay as per hacker news robots.txt rules time.sleep(30) return (total_links_list, total_points_list) def generate_popular_posts(links_list, points_list): # create an empty popular posts list popular_posts = [] # loop though all links for idx, link in enumerate(links_list): # fetch the title of the post post_title = link.get_text() # fetch the link of the post post_href = link.get('href') # fetch the point text using the index of the link # convert the point to integer # if points data is not available, assign it a default of 0 try: post_points = int( points_list[idx].get_text().replace(' points', '')) except: points_list = 0 # append to popular posts as a dictionary object if points is atleast 100 if post_points >= 100: popular_posts.append( {'title': post_title, 'link': post_href, 'points': post_points}) return popular_posts def sort_posts_by_points(posts): return sorted(posts, key=lambda x: x['points'], reverse=True) def main(): total_links_list, total_points_list = get_paginated_data(5) popular_posts = generate_popular_posts(total_links_list, total_points_list) sorted_posts = sort_posts_by_points(popular_posts) # print posts sorted by highest to lowest pprint.pprint(sorted_posts) if(__name__ == '__main__'): main()
Теперь, используя этот сценарий, нам даже не нужно посещать Hacker News и искать популярные новости. Мы можем запустить этот сценарий из нашей консоли и получить последние новости. Не стесняйтесь настроить сценарий в соответствии с вашими потребностями и экспериментировать с ним или попробуйте соскрести данные с вашего любимого веб -сайта.
Мы можем сделать много вещей с вышеуказанными данными, такими как
- Создайте API, чтобы использовать его для приложения на веб -сайте
- Используйте его для анализа тенденций с использованием ключевых слов
- Создайте веб -сайт агрегатора новостей и многое другое
Популярные библиотеки скребки
Красивый суп имеет свои ограничения, когда связано с очисткой данных с веб -сайтов. Он довольно просто в использовании, но для очистки данных с сложных веб-сайтов, которые отображаются на стороне клиента (Angular, на основе реагирования веб-сайтов), разметка HTML не будет доступна при загрузке веб-сайта. Чтобы получить данные с таких веб -сайтов, можно использовать более продвинутые библиотеки. Вот несколько популярных библиотек и рамок для Python.
использованная литература
- https://realpython.com/beautiful-soup-web-scraper-python/
- https://realpython.com/python-web-scraping-practical-introduction/
- https://www.digitalocean.com/community/tutorials/how-to-scrape-web-pages-with-beautiful-soup-and-python-3
Интернет -царапин – это обширное поле. Используя красивый суп, мы, вероятно, просто поцарапали поверхность. В этой области есть множество возможностей, которые я бы изучал, изучая больше об анализе данных с помощью Python. Надеюсь, я смог охватить основные концепции, необходимые для дальнейшего изучения.
Завтра я буду переходить на концепции веб -разработки с Python.
Удачного!
30 дней питона (серия 30 частей)
Оригинал: “https://dev.to/arindamdawn/30-days-of-python-day-23-web-scraping-1j58”