Kaip nuskaityti svetaines naudojant „Python“ ir „BeautifulSoup“

Internete yra daugiau informacijos, nei bet kuris žmogus gali įsisavinti per gyvenimą. Jums reikia ne prieigos prie tos informacijos, o keičiamo būdo ją rinkti, tvarkyti ir analizuoti.

Jums reikia iškrapštyti žiniatinklį.

Žiniatinklio kasymas automatiškai išskiria duomenis ir pateikia juos tokiu formatu, kurį galite lengvai suprasti. Šioje pamokoje mes sutelksime dėmesį į jo taikymą finansų rinkoje, tačiau žiniatinklio grandymas gali būti naudojamas įvairiausiose situacijose.

Jei esate užsidegęs investuotojas, uždaryti kainas kiekvieną dieną gali būti skaudu, ypač kai reikalingos informacijos rasite keliuose tinklalapiuose. Mes palengvinsime duomenų gavybą sukūrę žiniatinklio grandiklį, kuris automatiškai nuskaitys akcijų indeksus iš interneto.

Darbo pradžia

Mes ketiname naudoti „Python“ kaip savo braižymo kalbą kartu su paprasta ir galinga biblioteka „BeautifulSoup“.

  • „Mac“ vartotojams „Python“ yra iš anksto įdiegta į OS X. Atidarykite terminalą ir įveskite python --version. Turėtumėte pamatyti, kad jūsų pitono versija yra 2.7.x.
  • „Windows“ vartotojams įdiekite „Python“ per oficialią svetainę.

Tada turime gauti „BeautifulSoup“ biblioteką naudodami pip„Python“ paketų valdymo įrankį.

Terminale įveskite:

easy_install pip pip install BeautifulSoup4

Pastaba : jei nepavyksta įvykdyti anksčiau nurodytos komandinės eilutės, pabandykite pridėti sudoprieš kiekvieną eilutę.

Pagrindai

Prieš pradėdami pereiti prie kodo, supraskime HTML pagrindus ir kai kurias braižymo taisykles.

HTML žymos

Jei jau suprantate HTML žymas, nedvejodami praleiskite šią dalį.

First Scraping

Hello World

Tai yra pagrindinė HTML tinklalapio sintaksė. Kiekvienas tinklalapio blokas:

1 .: HTML dokumentai turi prasidėti tipo deklaracija.

2. HTML dokumentas yra tarp ir .

3. HTML dokumento meta ir scenarijaus deklaracija yra tarp ir .

4. Matoma HTML dokumento dalis yra tarp ir žymių.

5. Pavadinimų antraštės apibrėžiamos

per

žymos.

6. Pastraipos apibrėžtos

Other useful tags include for hyperlinks,

for tables, for table rows, and
lentelės stulpeliams.

Be to, HTML žymes, kartais ateina su idarba classatributai. idAtributas nurodo unikalų identifikatorių HTML tegus ir vertė turi būti unikalus HTML dokumente. Šis classatributas naudojamas apibrėžti vienodus HTML žymų stilius su ta pačia klase. Mes galime pasinaudoti šiais ID ir klasėmis, kad padėtų mums rasti norimus duomenis.

Norėdami gauti daugiau informacijos apie HTML žymas, ID ir klasę, žr. „W3Schools“ mokymo programas.

Nubraukimo taisyklės

  1. Prieš nurašydami turėtumėte patikrinti svetainės taisykles ir nuostatas. Būkite atsargūs skaitydami pareiškimus apie teisėtą duomenų naudojimą. Paprastai jūsų nubraukti duomenys neturėtų būti naudojami komerciniais tikslais.
  2. Neprašykite duomenų iš svetainės per daug agresyviai naudodami savo programą (taip pat žinomą kaip šlamštas), nes tai gali sugadinti svetainę. Įsitikinkite, kad jūsų programa elgiasi pagrįstai (ty veikia kaip žmogus). Geros praktikos pavyzdžiai yra vienas vieno tinklalapio per sekundę prašymas.
  3. Svetainės išdėstymas laikas nuo laiko gali keistis, todėl būtinai peržiūrėkite svetainę ir, jei reikia, perrašykite kodą

Puslapio tikrinimas

Paimkime vieną pavyzdį iš „Bloomberg Quote“ svetainės.

Stebėdami akcijų rinką, norėtume iš šio puslapio gauti indekso pavadinimą (S&P 500) ir jo kainą. Pirmiausia dešiniuoju pelės mygtuku spustelėkite ir atidarykite naršyklės inspektorių, kad patikrintumėte tinklalapį.

Pabandykite užvesti žymeklį ant kainos ir turėtumėte matyti jį supantį mėlyną langelį. Spustelėjus jį, naršyklės konsolėje bus pasirinktas susijęs HTML.

Iš rezultato galime pamatyti, kad kaina yra kelių HTML žymių lygių viduje, o tai yra .

Panašiai, jei užveskite pelės žymeklį ir spustelėsite pavadinimą „S&P 500 Index“, jis bus viduje ir

.

Dabar classžymių pagalba mes žinome unikalią savo duomenų vietą .

Peršokti į Kodeksą

Dabar, kai žinome, kur yra mūsų duomenys, galime pradėti koduoti savo žiniatinklio grandiklį. Dabar atidarykite teksto redaktorių!

Pirmiausia turime importuoti visas bibliotekas, kuriomis ketiname naudotis.

# import libraries import urllib2 from bs4 import BeautifulSoup

Tada paskelbkite puslapio URL kintamąjį.

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

Tada pasinaudokite „Python urllib2“, kad gautumėte URL HTML puslapį.

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

Galiausiai analizuokite puslapį „BeautifulSoup“ formatu, kad galėtume jį naudoti naudodami „BeautifulSoup“.

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

Šis straipsnis iš pradžių buvo paskelbtas „Altitude Labs“ tinklaraštyje ir buvo parašytas mūsų programinės įrangos inžinieriaus Leonardo Mok. „Altitude Labs“ yra programinės įrangos agentūra, kuri specializuojasi individualizuotose, pirmiausia mobiliesiems skirtose „React“ programose.