[Перевод] Как очистить содержимое веб-сайта с помощью Python и BeautifulSoup

Python рептилия Программа перевода самородков HTML

Объем информации в Интернете намного больше, чем любой человек может удержать за всю свою жизнь. Итак, что нам нужно сделать, так это не получать доступ к информации по отдельности в Интернете, а должен быть гибкий способ сбора, организации и анализа этой информации.

Нам нужно очистить веб-данные.

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

Если вы заядлый инвестор, получение ежедневной цены закрытия может быть проблемой, особенно когда необходимая вам информация разбросана по нескольким страницам. Мы упростим сбор данных, создав веб-краулер для автоматического извлечения фондовых индексов из Интернета.

начиная

Мы будем использовать Python в качестве языка сканера и простую, но мощную библиотеку BeautifulSoup.

  • Для пользователей Mac OS X поставляется с предустановленным Python. Откройте терминал и введитеpython --version. Ваша версия Python должна быть 2.7.x.
  • Для пользователей Windows пройдитеОфициальный сайтУстановите Питон.

Далее нам нужно использовать инструменты управления пакетами Python.pipдля установки библиотеки BeautifulSoup.

Введите в терминале:

easy_install pip  
pip install BeautifulSoup4

Уведомление: если вы получаете сообщение об ошибке при выполнении вышеуказанной команды, попробуйте добавить перед каждой командойsudo.

Базовые знания

Прежде чем мы действительно начнем программировать, давайте сначала разберемся с основами HTML и некоторыми правилами веб-сканирования.

HTML-теги
Если вы уже понимаете HTML-теги, пропустите этот раздел.

<!DOCTYPE html>  
<html>  
    <head>
    </head>
    <body>
        <h1> First Scraping </h1>
        <p> Hello World </p>
    <body>
</html>

Ниже приведен основной синтаксис HTML-страницы. Каждый тег на веб-странице определяет блок контента:

  1. <!DOCTYPE html>: объявление типа, которое должно присутствовать в начале HTML-документа.
  2. HTML-документация, содержащаяся в тегах<html>Внутри.
  3. <head>Внутри тегов находятся метаданные и объявления сценариев для HTML-документов.
  4. <body>Внутри тега находится видимая часть HTML-документа.
  5. титульный пропуск<h1>прибыть<h6>определение ярлыка.
  6. Содержание абзаца определяется в<p>в этикетке.

Другие часто используемые теги для гиперссылок<a>метка, используемая для отображения таблицы<table>метки и для отображения строк таблицы<tr>метка для отображения столбцов таблицы<td>Этикетка.

Кроме того, теги HTML часто имеютidилиclassАтрибуты.idАтрибут определяет уникальный идентификатор тега, и это значение должно быть уникальным в пределах текущего документа.classАтрибуты используются для определения одного и того же стиля для тегов HTML с одним и тем же атрибутом класса. Мы можем использовать эти идентификаторы и классы, чтобы помочь нам найти данные, которые мы хотим очистить.

Нужно больше о HTMLЭтикетка,idиclassСопутствующий контент см. на веб-сайте W3Schools.руководство.

Правила сканирования

  1. Вы должны проверить условия использования веб-сайта перед сканированием. Внимательно прочитайте заявление о законном использовании данных. Как правило, данные, которые вы очищаете, не могут использоваться в коммерческих целях.
  2. Не будьте слишком агрессивны со своими поисковыми роботами, запрашивающими данные с веб-сайта (как при известной спам-атаке), которые могут нанести ущерб веб-сайту. Убедитесь, что ваш поисковый робот работает разумно (как если бы веб-сайтом управлял человек). Рекомендуется запрашивать веб-страницу каждую секунду.
  3. Макет сайта время от времени меняется, поэтому не забывайте часто посещать сайт и при необходимости переписывать свой код.

Проверьте веб-страницу

Давайте начнем сBloomberg QuoteВозьмите страницу веб-сайта в качестве примера.

Поскольку некоторые люди следят за фондовым рынком, мы получаем название индекса (S&P 500) и его цену с этой страницы. Сначала выберите параметр Inspect в меню правой кнопки мыши, чтобы просмотреть страницу.

Попробуйте навести указатель мыши на цену, и вокруг цены должен появиться синий квадрат. Если щелкнуть в консоли браузера, будет выбран HTML-контент.

По результатам видно, что цена заключена в несколько слоев HTML-тегов.<div class="basic-quote"><div class="price-container up"><div class="price">.

Точно так же, если вы наведете курсор мыши и нажмете на «S&P 500», он завернет<div class="basic-quote">и<h1 class="name">в.

Теперь мы проходимclassС помощью меток известно точное расположение необходимых данных.

Написать код

Теперь, когда мы знаем, где находятся данные, мы можем написать поисковый робот. Теперь откройте текстовый редактор.

Во-первых, нам нужно импортировать все библиотеки, которые нам нужно использовать.

# import libraries
import urllib2
from bs4 import BeautifulSoup

Затем объявите переменную ссылки URL.

# specify the url
quote_page = ‘http://www.bloomberg.com/quote/SPX:IND'

Затем используйте Python urllib2 для запроса HTML-страницы, на которую указывает объявленный URL-адрес.

# query the website and return the html to the variable ‘page’
page = urllib2.urlopen(quote_page)

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

# parse the html using beautiful soup and store in variable `soup`
soup = BeautifulSoup(page, ‘html.parser’)

Теперь у нас есть переменнаяsoup, который содержит HTML-контент страницы. Здесь мы можем написать код для обхода данных.

Помните уникальную иерархическую структуру данных? Красивый супfind()Методы могут помочь нам найти эти иерархии, а затем извлечь содержимое. В этом примере, поскольку имя класса этого HTML уникально, все, что мы можем легко найти<div class="name">.

# Take out the <div> of name and get its value
name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})

Мы можем получить данные, получив свойство text метки.

name = name_box.text.strip() # strip() is used to remove starting and trailing
print name

Точно так же мы можем получить цены.

# get the index price
price_box = soup.find(‘div’, attrs={‘class’:’price’})
price = price_box.text
print price

Когда вы запускаете эту программу, вы можете видеть, что текущая цена S&P 500 напечатана.

Экспорт в Excel CSV

Теперь, когда у нас есть данные, пришло время их сохранить. Формат Excel csv — хороший выбор. Его можно открыть с помощью Excel, поэтому вы можете легко открывать данные и работать с ними.

Но сначала нам нужно импортировать модуль Python csv, а также импортировать модуль datetime, чтобы получить даты записей. В разделе импорта добавьте следующие строки кода.

import csv
from datetime import datetime

В нижней части кода добавьте код для сохранения данных в CSV-файл.

# open a csv file with append, so old data will not be erased
with open(‘index.csv’, ‘a’) as csv_file:
 writer = csv.writer(csv_file)
 writer.writerow([name, price, datetime.now()])

Если вы запустите свою программу сейчас, вы сможете экспортировать файл index.csv, который затем можно будет открыть в Excel и увидеть в нем ряд данных.

Если вы запускаете эту программу каждый день, вы можете легко получить доступ к S&P 500 без необходимости многократного поиска в Интернете.

Расширенное использование (расширенное приложение)

несколько индексов
Для вас недостаточно просто получить индекс, верно? Мы можем извлечь несколько индексов одновременно.

Во-первых, поставитьquote_pageПеременная как массив URL.

quote_page = [‘http://www.bloomberg.com/quote/SPX:IND', ‘http://www.bloomberg.com/quote/CCMP:IND']

Затем мы превращаем код извлечения данных вforцикл, чтобы вы могли обрабатывать URL-адреса один за другим и хранить все данные в кортежеdataсередина.

# for loop
data = []
for pg in quote_page:
 # query the website and return the html to the variable ‘page’
 page = urllib2.urlopen(pg)

# parse the html using beautiful soap and store in variable `soup`
 soup = BeautifulSoup(page, ‘html.parser’)

# Take out the <div> of name and get its value
 name_box = soup.find(‘h1’, attrs={‘class’: ‘name’})
 name = name_box.text.strip() # strip() is used to remove starting and trailing

# get the index price
 price_box = soup.find(‘div’, attrs={‘class’:’price’})
 price = price_box.text

# save the data in tuple
 data.append((name, price))

Затем измените код «раздела сохранения», чтобы сохранить данные построчно.

# open a csv file with append, so old data will not be erased
with open(‘index.csv’, ‘a’) as csv_file:
 writer = csv.writer(csv_file)
 # The for loop
 for name, price in data:
 writer.writerow([name, price, datetime.now()])

Повторно запустите код, и вы сможете извлечь оба индекса одновременно.

Усовершенствованная технология сканирования

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

  1. Scrapy, мощный фреймворк сканера Python
  2. Попробуйте интегрировать свой код с каким-нибудь общедоступным API. Эффективность поиска данных намного выше, чем у поискового робота. Например, посмотрите наFacebook Graph API, что может помочь вам получить скрытые данные, которые не отображаются на вашей странице в Facebook.
  3. Если очищенные данные слишком велики, рассмотрите возможность использования серверной базы данных для хранения ваших данных, напримерMySQL.

Используйте СУХОЙ подход

DRY (Don't Repeat Yourself) означает «Не повторяйся», попытайтесь автоматизировать свою повседневную работу, напримерэтот человексделай это. Некоторые интересные проекты, которые следует рассмотреть, могут включать отслеживание активности ваших друзей в Facebook (требуется их согласие) или получение списка разговоров на форумах и попытка обработки естественного языка (что сейчас является горячей темой в области искусственного интеллекта)!

Если у вас есть какие-либо вопросы, не стесняйтесь оставлять комментарии ниже.

Ссылаться на:

Эта статья была первоначально опубликована вAltitude LabsизблогНа, автор наш инженер-программистLeonard Mok.Altitude Labsэто компания, специализирующаяся наReactПользовательские программные агенты для разработки мобильных приложений.

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсАнглийская совместная статья. Содержание покрытияAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.