Рубрики
Без рубрики

30 дней питона 👨‍💻 – День 23 – Строительство Интернета

Скраинг в Интернете – это метод или концепция извлечения данных с веб -сайта, ползая им. Это главное … Tagged с Python, Challenge.

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.

использованная литература

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

Завтра я буду переходить на концепции веб -разработки с Python.

Удачного!

30 дней питона (серия 30 частей)

Оригинал: “https://dev.to/arindamdawn/30-days-of-python-day-23-web-scraping-1j58”