Kuinka kaapata verkkosivustoja Pythonilla ja BeautifulSoupilla

Internetissä on enemmän tietoa kuin kukaan ihminen voi imeä elinaikanaan. Tarvitset ei pääsyä kyseisiin tietoihin, vaan skaalautuvaa tapaa kerätä, järjestää ja analysoida niitä.

Tarvitset kaavinta verkosta.

Verkon kaavinta poimii tiedot automaattisesti ja esittelee ne helposti ymmärrettävässä muodossa. Tässä opetusohjelmassa keskitymme sen sovelluksiin rahoitusmarkkinoilla, mutta verkon kaavinta voidaan käyttää monissa tilanteissa.

Jos olet innokas sijoittaja, sulkuhintojen saaminen päivittäin voi olla tuskaa, varsinkin kun tarvitsemasi tiedot löytyvät useilta verkkosivuilta. Teemme tietojen poiminnan helpommaksi rakentamalla verkkokaavin, jolla osakeindeksit noudetaan automaattisesti Internetistä.

Päästä alkuun

Aiomme käyttää Pythonia raaputuskielenä yhdessä yksinkertaisen ja tehokkaan kirjaston BeautifulSoupin kanssa.

  • Mac-käyttäjille Python on esiasennettu OS X: ään. Avaa Terminal ja kirjoita python --version. Sinun pitäisi nähdä, että python-versiosi on 2.7.x.
  • Windows-käyttäjille asenna Python virallisen verkkosivuston kautta.

Seuraavaksi meidän on hankittava BeautifulSoup-kirjasto käyttämällä pipPythonin paketinhallintatyökalua.

Kirjoita päätelaitteeseen:

easy_install pip pip install BeautifulSoup4

Huomaa : Jos et pysty suorittamaan yllä olevaa komentoriviä, yritä lisätä sudojokaisen rivin eteen.

Perusteet

Ennen kuin aloitamme hyppäämisen koodiin, ymmärretään HTML: n perusteet ja joitain kaavamissääntöjä.

HTML-tunnisteet

Jos ymmärrät jo HTML-tunnisteet, ohita tämä osa.

First Scraping

Hello World

Tämä on HTML-verkkosivun perussyntaksi. Jokainen palvelee lohkoa verkkosivun sisällä:

1 .: HTML-asiakirjojen on aloitettava tyypin ilmoituksella.

2. HTML-asiakirja on välillä ja .

3. HTML-asiakirjan meta- ja komentoselosteet ovat välillä ja .

4. näkyvä osa HTML-asiakirjan on välillä ja tunnisteita.

5. Otsikon otsikot määritellään

kautta

tunnisteet.

6. Kappaleet määritetään

Other useful tags include for hyperlinks,

for tables, for table rows, and
taulukon sarakkeille.

Myös HTML-tunnisteissa on joskus mukana idtai classmääritteitä. idMäärite yksilöivä HTML-tunnisteen ja arvon on oltava yksilöivä HTML-dokumentti. classMääritettä käytetään määrittelemään yhtäläinen tyylit HTML-tunnisteiden kanssa samaan luokkaan. Voimme käyttää näitä tunnuksia ja luokkia auttamaan meitä löytämään haluamasi tiedot.

Lisätietoja HTML-tunnisteista, tunnuksesta ja luokasta on W3Schools-oppaat.

Kaavintasäännöt

  1. Tarkista verkkosivuston käyttöehdot ennen kuin kaavailet sitä. Ole varovainen lukea lausunnot tietojen laillisesta käytöstä. Yleensä kaapimiasi tietoja ei tule käyttää kaupallisiin tarkoituksiin.
  2. Älä pyydä tietoja verkkosivustolta liian aggressiivisesti ohjelmasi kanssa (tunnetaan myös nimellä roskapostina), koska se voi rikkoa verkkosivuston. Varmista, että ohjelma käyttäytyy kohtuullisella tavalla (eli toimii kuin ihminen). Yksi pyyntö yhdelle verkkosivulle sekunnissa on hyvä käytäntö.
  3. Sivuston asettelu voi muuttua ajoittain, joten muista käydä sivustossa ja kirjoittaa koodi tarvittaessa uudelleen

Sivun tarkastaminen

Otetaan esimerkkinä yksi sivu Bloomberg Quote -sivustolta.

Osakemarkkinoiden seuraajana haluaisimme saada indeksinimen (S&P 500) ja sen hinnan tältä sivulta. Ensinnäkin napsauta hiiren kakkospainikkeella ja avaa selaimesi tarkastaja tarkastellaksesi verkkosivua.

Yritä viedä kohdistin hintaan, ja sinun pitäisi pystyä näkemään sitä ympäröivä sininen laatikko. Jos napsautat sitä, siihen liittyvä HTML-koodi valitaan selainkonsolissa.

Tuloksesta voimme nähdä, että hinta on muutaman HTML-tunnisteiden sisällä, mikä on .

Vastaavasti, jos viet hiiren osoittimen ja napsautat nimeä “S&P 500 Index”, se on sisällä ja

.

Nyt tiedämme tietojemme ainutlaatuisen sijainnin classtunnisteiden avulla.

Hyppää koodiin

Nyt kun tiedämme missä tietomme ovat, voimme alkaa koodata verkkokaavinta. Avaa tekstieditori nyt!

Ensinnäkin meidän on tuotava kaikki kirjastot, joita aiomme käyttää.

# import libraries import urllib2 from bs4 import BeautifulSoup

Ilmoita seuraavaksi sivun URL-osoitteen muuttuja.

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

Käytä sitten Python urllib2 -ohjelmaa saadaksesi URL-osoitteen HTML-sivun ilmoitetuksi.

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

Lopuksi jäsennä sivu BeautifulSoup-muotoon, jotta voimme käyttää BeautifulSoupia sen käsittelemiseen.

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

Tämä artikkeli julkaistiin alun perin Altitude Labsin blogissa ja sen kirjoitti ohjelmistosuunnittelijamme Leonard Mok. Altitude Labs on ohjelmistotoimisto, joka on erikoistunut räätälöityihin, ensin mobiililaitteisiin reagoiviin sovelluksiin.