Как да изстържете уеб сайтове с Python и BeautifulSoup

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

Имате нужда от мрежово изстъргване.

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

Ако сте запален инвеститор, получаването на цени за затваряне всеки ден може да бъде болка, особено когато информацията, от която се нуждаете, се намира на няколко уеб страници. Ще улесним извличането на данни, като изградим уеб скрепер за автоматично извличане на индексите на запасите от Интернет.

Приготвяме се да започнем

Ще използваме Python като наш език за изстъргване, заедно с проста и мощна библиотека, BeautifulSoup.

  • За потребители на Mac Python е предварително инсталиран в OS X. Отворете терминала и въведете python --version. Трябва да видите, че вашата версия на python е 2.7.x.
  • За потребители на Windows, моля, инсталирайте Python през официалния уебсайт.

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

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

easy_install пип
пип инсталирайте BeautifulSoup4

Забележка: Ако не успеете да изпълните горния команден ред, опитайте да добавите sudo пред всеки ред.

Основите

Преди да започнем да скачаме в кода, нека разберем основите на HTML и някои правила за изстъргване.

HTML маркери
Ако вече разбирате HTML маркери, не пропускайте да пропуснете тази част.



    <Глава>
    
    <Тяло>
        

Първо изстъргване

        

Hello World

    <Тяло>

Това е основният синтаксис на HTML уеб страница. Всеки <етикет> обслужва блок вътре в уеб страницата:
1. : HTML документите трябва да започват с декларация за тип.
2. HTML документът се съдържа между и .
3. Декларацията за мета и скрипт на HTML документа е между и .
4. Видимата част на HTML документа е между и .
5. Заглавията на заглавията са дефинирани с маркерите

до

.
6. Параграфите се дефинират с

тага.

Други полезни маркери включват за хипервръзки,

за таблици, за редовете на таблицата и
за колоните на таблицата.

Също така понякога HTML таговете идват с атрибути id или class. Атрибутът id указва уникален идентификатор за HTML таг и стойността трябва да бъде уникална в HTML документа. Атрибутът клас се използва за определяне на равни стилове за HTML маркери с един и същи клас. Можем да използваме тези идентификатори и класове, за да ни помогне да намерим данните, които искаме.

За повече информация относно HTML тагове, id и клас, моля, вижте ръководствата за W3Schools.

Правила за остъргване

  1. Трябва да проверите Общите условия на уебсайта, преди да го изтриете. Внимавайте да прочетете изявленията за законно използване на данни. Обикновено данните, които изстъргвате, не трябва да се използват за комерсиални цели.
  2. Не изисквайте данни от уебсайта твърде агресивно с вашата програма (известна също като спам), тъй като това може да наруши уебсайта. Уверете се, че програмата ви се държи по разумен начин (т.е. действа като човек). Една заявка за една уеб страница в секунда е добра практика.
  3. Подредбата на уебсайта може да се променя от време на време, така че не забравяйте да го посетите отново и да пренапишете кода си, ако е необходимо

Проверка на страницата

Нека вземем една страница от уебсайта на Bloomberg Quote като пример.

Като някой, който следва борсата, бихме искали да получим името на индекса (S&P 500) и цената му от тази страница. Първо, щракнете с десния бутон на мишката и отворете инспектора на браузъра си, за да проверите уеб страницата.

Опитайте да задържите курсора си върху цената и трябва да можете да видите синьо поле около него. Ако щракнете върху него, в конзолата на браузъра ще бъде избран свързаният HTML.

От резултата можем да видим, че цената е вътре в няколко нива на HTML маркери, което е

.

По същия начин, ако задържите курсора и кликнете върху името „S&P 500 Index“, той е в

и

.

Сега знаем уникалното местоположение на нашите данни с помощта на класните тагове.

Направо в кода

Сега, когато знаем къде са нашите данни, можем да започнем да кодираме нашия уеб скрепер. Отворете текстовия си редактор сега!

Първо, трябва да импортираме всички библиотеки, които ще използваме.

# импортиране на библиотеки
импортиране на urllib2
от bs4 import BeautifulSoup

След това декларирайте променлива за URL адреса на страницата.

# посочете URL адреса
quote_page = 'http://www.bloomberg.com/quote/SPX:IND'

След това използвайте Python urllib2, за да получите HTML страницата на URL адреса.

# заявете уебсайта и върнете HTML в променливата „страница“
страница = urllib2.urlopen (quote_page)

И накрая, анализирайте страницата във BeautifulSoup формат, за да можем да използваме BeautifulSoup за работа върху нея.

# анализирайте html с помощта на красива супа и съхранявайте в променлива `супа`
супа = BeautifulSoup (страница, 'html.parser')

Сега имаме променлива, супа, съдържаща HTML на страницата. Ето къде можем да започнем да кодираме частта, която извлича данните.

Спомняте ли си уникалните слоеве на нашите данни? BeautifulSoup може да ни помогне да влезем в тези слоеве и да извлечем съдържанието с find (). В този случай, тъй като името на клас HTML е уникално на тази страница, можем просто да попитаме

.

# Извадете 
от името и вземете стойността му name_box = sou.find ('h1', attrs = {'class': 'name'})

След като имаме маркера, можем да получим данните, получавайки неговия текст.

name = name_box.text.strip () # strip () се използва за премахване на стартиране и заключване
име на печат

По подобен начин можем да получим и цената.

# вземете индексната цена
price_box = sou.find ('div', attrs = {'class': 'price'})
цена = цена_бокс.текст
цена за печат

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

Експорт в CSV за Excel

Сега, когато разполагаме с данните, е време да ги запишем. Отделеният формат на Excel запетая е приятен избор. Тя може да бъде отворена в Excel, за да можете да виждате данните и да ги обработвате лесно.

Но първо трябва да импортираме модула csv Python и модула datetime, за да получим датата на записа. Вмъкнете тези редове във вашия код в секцията за импортиране.

import csv
from datetime импортиране datetime

В долната част на кода добавете кода за записване на данни във csv файл.

# отворете csv файл с добавяне, така че старите данни няма да бъдат изтрити
с отворен („index.csv“, „a“) ​​като csv_file:
 писател = csv.writer (csv_file)
 write.writerow ([име, цена, датаtime.now ()])

Сега, ако стартирате вашата програма, би трябвало да можете да експортирате файл index.csv, който след това можете да отворите с Excel, където трябва да видите ред от данни.

Така че, ако стартирате тази програма всеки ден, лесно ще можете да получите цената на индекса S&P 500, без да ровите в уебсайта!

Продължаване (Разширено използване)

Множество индекси
Така че изстъргването на един индекс не е достатъчно за вас, нали? Можем да се опитаме да извлечем няколко индекса едновременно.

Първо, променете quo_page в масив от URL адреси.

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

След това променяме кода за извличане на данни в цикъл за, който ще обработва URL адресите един по един и ще съхранява всички данни в променлива информация в кортежи.

# за цикъл
данни = []
за pg в quo_page:
 # заявете уебсайта и върнете HTML в променливата „страница“
 страница = urllib2.urlopen (pg)
# анализирайте html с помощта на красив сапун и съхранявайте в променлива `супа`
 супа = BeautifulSoup (страница, 'html.parser')
# Извадете 
от името и вземете стойността му  name_box = sou.find ('h1', attrs = {'class': 'name'})  name = name_box.text.strip () # strip () се използва за премахване на стартиране и заключване
# вземете индексната цена
 price_box = sou.find ('div', attrs = {'class': 'price'})
 цена = цена_бокс.текст
# запишете данните в кортеж
 data.append ((име, цена))

Също така, променете секцията за запазване, за да запишете данни по ред.

# отворете csv файл с добавяне, така че старите данни няма да бъдат изтрити
с отворен („index.csv“, „a“) ​​като csv_file:
 писател = csv.writer (csv_file)
 # За цикъл
 за име, цена в данните:
 write.writerow ([име, цена, датаtime.now ()])

Повторно пуснете програмата и трябва да можете да извлечете два индекса едновременно!

Разширени техники за изстъргване

BeautifulSoup е прост и страхотен за дребно в малки мащаби. Но ако се интересувате от бракуване на данни в по-голям мащаб, трябва да помислите да използвате тези други алтернативи:

  1. Scrap, мощна рамка за изстъргване на питон
  2. Опитайте да интегрирате кода си с някои публични API. Ефективността на извличане на данни е много по-висока от бракуването на уеб страници. Например, разгледайте Facebook Graph API, който може да ви помогне да получите скрити данни, които не се показват на уеб страниците на Facebook.
  3. Помислете дали да използвате резервна база данни като MySQL, за да съхранявате данните си, когато стане твърде голяма.

Приемете метода на сушене

DRY означава „Не се повтаряйте“, опитайте се да автоматизирате ежедневните си задачи като този човек. Някои други забавни проекти, които трябва да обмислите, може да следят активното време на приятелите ви във Facebook (със съгласието им разбира се) или да вземете списък с теми във форум и да изпробвате обработката на естествен език (което е гореща тема за правото на изкуствения интелект сега)!

Ако имате някакви въпроси, моля не се колебайте да оставите коментар по-долу.

Препратки
http://www.gregreda.com/2013/03/03/web-scraping-101-with-python/
http://www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-beautiful-soup-python/

Тази статия първоначално е публикувана в блога на Altitude Labs и е написана от нашия софтуерен инженер Леонард Мок. Altitude Labs е софтуерна агенция, която е специализирана в персонализирани, мобилни първи React приложения.