de Justin Yek

Cum să răzuiești site-urile web cu Python și BeautifulSoup

Cum sa razuiesti site urile web cu Python si BeautifulSoup

Există mai multe informații pe Internet decât orice om poate absorbi într-o viață. Ceea ce aveți nevoie nu este accesul la aceste informații, ci un mod scalabil de a le colecta, organiza și analiza.

Aveți nevoie de răzuire web.

Scraping-ul web extrage automat datele și le prezintă într-un format pe care îl puteți cunoaște cu ușurință. În acest tutorial, ne vom concentra asupra aplicațiilor sale de pe piața financiară, dar web scraping poate fi utilizat într-o mare varietate de situații.

Dacă sunteți un investitor avid, obținerea prețurilor de închidere în fiecare zi poate fi o dificultate, mai ales atunci când informațiile de care aveți nevoie se găsesc în mai multe pagini web. Vom face mai ușoară extragerea datelor prin construirea unui răzuitor web pentru a prelua automat indicii stocului de pe Internet.

Cum sa razuiesti site urile web cu Python si BeautifulSoup

Noțiuni de bază

Vom folosi Python ca limbaj de răzuire, împreună cu o bibliotecă simplă și puternică, BeautifulSoup.

  • Pentru utilizatorii de Mac, Python este preinstalat în OS X. Deschideți Terminalul și tastați python --version. Ar trebui să vedeți că versiunea dvs. de python este 2.7.x.
  • Pentru utilizatorii de Windows, vă rugăm să instalați Python prin intermediul site oficial.

Apoi trebuie să folosim biblioteca BeautifulSoup pip, un instrument de gestionare a pachetelor pentru Python.

În terminal, tastați:

easy_install pip
pip install BeautifulSoup4

Notă: Dacă nu executați linia de comandă de mai sus, încercați să adăugați sudo în fața fiecărei linii.

Cele elementare

Înainte de a începe să intrăm în cod, să înțelegem elementele de bază ale HTML și câteva reguli de răzuire.

Etichete HTML
Dacă înțelegeți deja etichetele HTML, nu ezitați să ignorați această parte.

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

Aceasta este sintaxa de bază a unei pagini web HTML. Fiecare <tag> servește un bloc în interiorul paginii web:
1. <!DOCTYPE html>: Documentele HTML trebuie să înceapă cu o declarație de tip.
2. Documentul HTML este cuprins între <html> și </html>.
3. Declarația meta și script a documentului HTML este între <head>și </head>.
4. Partea vizibilă a documentului HTML este între <body> și </body>Etichete.
5. Titlurile titlurilor sunt definite cu <h1> prin <h6> Etichete.
6. Paragrafele sunt definite cu <p> etichetă.

Alte etichete utile includ <a> pentru hyperlinkuri, <table> pentru mese, <tr> pentru rândurile de masă și <td> pentru coloanele tabelului.

De asemenea, etichetele HTML vin uneori cu id sau class atribute. id atributul specifică un id unic pentru o etichetă HTML și valoarea trebuie să fie unică în cadrul documentului HTML. class atributul este folosit pentru a defini stiluri egale pentru etichetele HTML cu aceeași clasă. Putem folosi aceste ID-uri și clase pentru a ne ajuta să localizăm datele dorite.

Pentru mai multe informații despre HTML Etichete, id și clasă, vă rugăm să consultați W3Schools Tutoriale.

Reguli de răzuire

  1. Ar trebui să verificați Termenii și condițiile unui site web înainte de al răzuie. Aveți grijă să citiți declarațiile despre utilizarea legală a datelor. De obicei, datele pe care le scrapați nu trebuie utilizate în scopuri comerciale.
  2. Nu solicitați date de la site-ul web prea agresiv cu programul dvs. (cunoscut și sub denumirea de spam), deoarece acest lucru poate rupe site-ul web. Asigurați-vă că programul dvs. se comportă într-un mod rezonabil (adică acționează ca un om). O cerere pentru o pagină web pe secundă este o bună practică.
  3. Aspectul unui site web se poate schimba din când în când, deci asigurați-vă că revizitați site-ul și rescrieți codul după cum este necesar

Inspectarea paginii

Să luăm o pagină din Citat Bloomberg site-ul web ca exemplu.

Ca cineva care urmărește bursa, am dori să obținem numele indexului (S&P 500) și prețul acestuia de pe această pagină. Mai întâi, faceți clic dreapta și deschideți inspectorul browserului pentru a inspecta pagina web.

1611774848 252 Cum sa razuiesti site urile web cu Python si BeautifulSoup

Încercați să plasați cursorul pe preț și ar trebui să puteți vedea o casetă albastră care îl înconjoară. Dacă faceți clic pe acesta, HTML-ul aferent va fi selectat în consola browserului.

1611774848 616 Cum sa razuiesti site urile web cu Python si BeautifulSoup

Din rezultat, putem vedea că prețul se află în câteva niveluri de etichete HTML, adică <div class="basic-quote"><div class="price-container up"><div class="price">.

În mod similar, dacă plasați cursorul și faceți clic pe numele „Index S&P 500”, acesta se află în interior <div class="basic-quote"> și <h1 class="name">.

1611774848 859 Cum sa razuiesti site urile web cu Python si BeautifulSoup

Acum știm locația unică a datelor noastre cu ajutorul class Etichete.

Salt în Cod

Acum, că știm unde sunt datele noastre, putem începe să ne codificăm scraperul web. Deschideți editorul de text acum!

În primul rând, trebuie să importăm toate bibliotecile pe care le vom folosi.

# import libraries
import urllib2
from bs4 import BeautifulSoup

Apoi, declarați o variabilă pentru adresa URL a paginii.

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

Apoi, folosiți Python urllib2 pentru a obține pagina HTML a adresei URL.

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

În cele din urmă, analizați pagina în format BeautifulSoup, astfel încât să putem folosi BeautifulSoup pentru a lucra la ea.

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

Acum avem o variabilă, soup, care conține codul HTML al paginii. Iată de unde putem începe codificarea părții care extrage datele.

Vă amintiți straturile unice ale datelor noastre? BeautifulSoup ne poate ajuta să intrăm în aceste straturi și să extragem conținutul find(). În acest caz, din clasa HTML name este unic pe această pagină, putem pur și simplu interoga <div class="name">.

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

După ce avem eticheta, putem obține datele obținându-le text.

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

În mod similar, putem obține și prețul.

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

Când rulați programul, ar trebui să puteți vedea că acesta tipărește prețul actual al indexului S&P 500.

1611774848 907 Cum sa razuiesti site urile web cu Python si BeautifulSoup

Exportați în Excel CSV

Acum că avem datele, este timpul să le salvăm. Formatul Excel Comma Separated este o alegere frumoasă. Poate fi deschis în Excel, astfel încât să puteți vedea datele și să le prelucrați cu ușurință.

Dar mai întâi, trebuie să importăm modulul CSV Python și modulul datetime pentru a obține data înregistrării. Introduceți aceste linii în codul dvs. în secțiunea de import.

import csv
from datetime import datetime

În partea de jos a codului, adăugați codul pentru scrierea datelor într-un fișier 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()])

Acum, dacă rulați programul, ar trebui să puteți exporta un fișier index.csv fișier, pe care îl puteți deschide apoi cu Excel, unde ar trebui să vedeți o linie de date.

1611774849 577 Cum sa razuiesti site urile web cu Python si BeautifulSoup

Deci, dacă rulați acest program în fiecare zi, veți putea obține cu ușurință prețul indexului S&P 500 fără să scotociți site-ul web!

Mergând mai departe (utilizări avansate)

Indici multipli
Deci, răzuirea unui singur indice nu este suficientă pentru tine, nu? Putem încerca să extragem mai mulți indici în același timp.

Mai întâi, modificați fișierul quote_page într-o serie de adrese URL.

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

Apoi schimbăm codul de extragere a datelor într-un for buclă, care va procesa adresele URL unul câte unul și va stoca toate datele într-o variabilă data în tupluri.

# 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))

De asemenea, modificați secțiunea de salvare pentru a salva datele rând cu rând.

# 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()])

Executați din nou programul și ar trebui să puteți extrage doi indici în același timp!

Tehnici avansate de răzuire

BeautifulSoup este simplu și excelent pentru răzuirea pe scară mică a web-ului. Dar, dacă sunteți interesat de răzuirea datelor la o scară mai mare, ar trebui să luați în considerare utilizarea acestor alte alternative:

  1. Scrapy, un cadru puternic de răzuire de piton
  2. Încercați să vă integrați codul cu unele API-uri publice. Eficiența recuperării datelor este mult mai mare decât răzuirea paginilor web. De exemplu, aruncați o privire la API-ul Facebook Graph, care vă poate ajuta să obțineți date ascunse care nu sunt afișate pe paginile web Facebook.
  3. Luați în considerare utilizarea unui backend de bază de date ca MySQL pentru a vă stoca datele când devin prea mari.

Adoptați metoda DRY

1611774849 733 Cum sa razuiesti site urile web cu Python si BeautifulSoup

DRY înseamnă „Nu te repeta”, încearcă să îți automatizezi sarcinile de zi cu zi precum această persoană. Unele alte proiecte distractive de luat în considerare ar putea fi urmărirea timpului activ al prietenilor dvs. de pe Facebook (cu acordul lor, desigur) sau preluarea unei liste de subiecte într-un forum și încercarea procesării limbajului natural (care este un subiect fierbinte pentru inteligența artificială acum)!

Dacă aveți întrebări, nu ezitați să lăsați un comentariu mai jos.

Referințe
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/

Acest articol a fost publicat inițial pe Altitude Labs ‘ blog și a fost scris de inginerul nostru de software, Leonard Mok. Altitude Labs este o agenție de software specializată în aplicații React personalizate, primul mobil.