Kuidas veebisaite kraapida Pythoni ja BeautifulSoupi abil

Internetis on rohkem teavet, kui ükski inimene suudab elu jooksul omastada. Vaja pole mitte juurdepääsu sellele teabele, vaid skaleeritavat viisi selle kogumiseks, korrastamiseks ja analüüsimiseks.

Teil on vaja veebi kraapida.

Veebi kraapimine eraldab andmed automaatselt ja esitab need vormingus, mida saate hõlpsasti mõista. Selles õpetuses keskendume selle rakendustele finantsturul, kuid veebi kraapimist saab kasutada väga erinevates olukordades.

Kui olete innukas investor, võib iga päev sulgemishindade hankimine olla piin, eriti kui vajaminevat teavet leidub mitmel veebilehel. Teeme andmete väljavõtmise lihtsamaks, ehitades veebikaabitsa, mis võimaldab aktsiaindekseid Internetist automaatselt hankida.

Alustamine

Kasutame oma kraapimiskeelena Pythoni koos lihtsa ja võimsa teegiga BeautifulSoup.

  • Maci kasutajate jaoks on Python eelinstallitud OS X-i. Avage terminal ja tippige python --version. Peaksite nägema, et teie pythoni versioon on 2.7.x.
  • Windowsi kasutajatele installige Python ametliku veebisaidi kaudu.

Järgmisena peame hankima BeautifulSoupi teegi, kasutades pipPythoni paketihaldustööriista.

Tippige terminali:

easy_install pip pip install BeautifulSoup4

Märkus . Kui ülaltoodud käsurida ei õnnestu käivitada, proovige lisada sudoiga rea ​​ette.

Põhitõed

Enne kui hakkame koodi sisse hüppama, mõistame HTML-i põhitõdesid ja mõningaid kraapimise reegleid.

HTML-märgendid

Kui HTML-märgenditest juba aru saate, jätke see osa julgelt vahele.

First Scraping

Hello World

See on HTML-veebilehe põhisüntaks. Igaüks teenindab blokeeringut veebilehel:

1 .: HTML-dokumendid peavad algama tüübideklaratsiooniga.

2. HTML-dokument on vahemikus ja .

3. HTML-dokumendi meta ja skripti deklaratsioon on vahemikus ja .

4. HTML-dokumendi nähtav osa asub siltide ja siltide vahel.

5. Pealkirjade pealkirjad on määratletud tähisega

läbi

sildid.

6. Lõigud on määratletud tähisega

Other useful tags include for hyperlinks,

for tables, for table rows, and
tabeliveergude jaoks.

Samuti on HTML-märgenditel mõnikord kaasas idvõi classatribuudid. idAtribuut määrab unikaalne ID HTML tag ja väärtus peab olema unikaalne HTML dokumendis. classAtribuuti kasutatakse, et määrata võrdne stiilid HTML sildid sama klassi. Saame neid ID-sid ja klasse kasutada, et aidata meil soovitud andmeid leida.

Lisateavet HTML-siltide, ID ja klassi kohta leiate W3Schoolsi õpetustest.

Kraapimisreeglid

  1. Enne selle kraapimist peaksite kontrollima veebisaidi tingimusi. Olge ettevaatlik, et lugeda avaldusi andmete seadusliku kasutamise kohta. Tavaliselt ei tohiks kraapitavaid andmeid kasutada ärilistel eesmärkidel.
  2. Ärge taotlege veebisaidilt andmeid oma programmiga liiga agressiivselt (tuntud ka kui rämpspost), kuna see võib veebisaiti rikkuda. Veenduge, et teie programm käituks mõistlikult (st käituks nagu inimene). Hea tava on üks taotlus ühe veebilehe kohta sekundis.
  3. Veebisaidi paigutus võib aeg-ajalt muutuda, nii et külastage seda saiti ja kirjutage oma kood vastavalt vajadusele üle

Lehe kontrollimine

Võtame näiteks ühe lehe Bloombergi tsitaadi veebisaidilt.

Börsi jälgijana sooviksime sellelt lehelt saada indeksinime (S&P 500) ja selle hinna. Kõigepealt paremklõpsake ja avage veebilehe kontrollimiseks brauseri inspektor.

Hõljutage kursorit hinna kohal ja peaksite nägema seda ümbritsevat sinist kasti. Kui klõpsate sellel, valitakse brauseri konsoolis seotud HTML.

Tulemusest näeme, et hind jääb HTML-märgendite mõne taseme sisse, mis on .

Samamoodi, kui hõljutate kursorit ja klõpsate nime „S&P 500 register”, on see sees ja

.

Nüüd teame classsiltide abil oma andmete ainulaadset asukohta .

Hüppa koodeksisse

Nüüd, kui teame, kus meie andmed asuvad, saame hakata veebikaabitsat kodeerima. Avage oma tekstiredaktor kohe!

Esiteks peame importima kõik teegid, mida kavatseme kasutada.

# import libraries import urllib2 from bs4 import BeautifulSoup

Järgmisena deklareerige lehe URL-i jaoks muutuja.

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

Seejärel kasutage URL-i HTML-lehe deklareerimiseks Pythoni urllib2-d.

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

Lõpuks sõeluge leht vormingusse BeautifulSoup, et saaksime selle kallal kasutada BeautifulSoupi.

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

Now we have a variable, soup, containing the HTML of the page. Here’s where we can start coding the part that extracts the data.

Remember the unique layers of our data? BeautifulSoup can help us get into these layers and extract the content with find(). In this case, since the HTML class name is unique on this page, we can simply query .

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

After we have the tag, we can get the data by getting its text.

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

Similarly, we can get the price too.

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

When you run the program, you should be able to see that it prints out the current price of the S&P 500 Index.

Export to Excel CSV

Now that we have the data, it is time to save it. The Excel Comma Separated Format is a nice choice. It can be opened in Excel so you can see the data and process it easily.

But first, we have to import the Python csv module and the datetime module to get the record date. Insert these lines to your code in the import section.

import csv from datetime import datetime

At the bottom of your code, add the code for writing data to a csv file.

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

Now if you run your program, you should able to export an index.csv file, which you can then open with Excel, where you should see a line of data.

So if you run this program everyday, you will be able to easily get the S&P 500 Index price without rummaging through the website!

Going Further (Advanced uses)

Multiple Indices

So scraping one index is not enough for you, right? We can try to extract multiple indices at the same time.

First, modify the quote_page into an array of URLs.

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

Then we change the data extraction code into a for loop, which will process the URLs one by one and store all the data into a variable data in tuples.

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

Also, modify the saving section to save data row by row.

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

Rerun the program and you should be able to extract two indices at the same time!

Advanced Scraping Techniques

BeautifulSoup is simple and great for small-scale web scraping. But if you are interested in scraping data at a larger scale, you should consider using these other alternatives:

  1. Scrapy, a powerful python scraping framework
  2. Try to integrate your code with some public APIs. The efficiency of data retrieval is much higher than scraping webpages. For example, take a look at Facebook Graph API, which can help you get hidden data which is not shown on Facebook webpages.
  3. Consider using a database backend like MySQL to store your data when it gets too large.

Adopt the DRY Method

DRY stands for “Don’t Repeat Yourself”, try to automate your everyday tasks like this person. Some other fun projects to consider might be keeping track of your Facebook friends’ active time (with their consent of course), or grabbing a list of topics in a forum and trying out natural language processing (which is a hot topic for Artificial Intelligence right now)!

If you have any questions, please feel free to leave a comment below.

References

//www.gregreda.com/2013/03/03/web-scraping-101-with-python/

//www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-beautiful-soup-python/

See artikkel avaldati algselt Altitude Labsi ajaveebis ja selle kirjutas meie tarkvarainsener Leonard Mok. Altitude Labs on tarkvarabüroo, mis on spetsialiseerunud isikupärastatud mobiilirakendustele React.