Sådan skrabes websteder med Python og BeautifulSoup

Der er flere oplysninger på Internettet, end noget menneske kan absorbere i livet. Det, du har brug for, er ikke adgang til disse oplysninger, men en skalerbar måde at indsamle, organisere og analysere dem på.

Du har brug for webskrabning.

Webskrabning udtrækker automatisk data og præsenterer dem i et format, som du let kan forstå. I denne vejledning fokuserer vi på dets applikationer på det finansielle marked, men webskrabning kan bruges i en lang række situationer.

Hvis du er en ivrig investor, kan det være en smerte, at få lukkekurser hver dag, især når de oplysninger, du har brug for, findes på flere websider. Vi gør dataudvindingen nemmere ved at opbygge en webskraber, der automatisk henter aktieindekser fra Internettet.

Kom godt i gang

Vi skal bruge Python som vores skrabningssprog sammen med et simpelt og kraftfuldt bibliotek, BeautifulSoup.

  • For Mac-brugere er Python forudinstalleret i OS X. Åbn Terminal og skriv python --version. Du skal se din python-version er 2.7.x.
  • For Windows-brugere skal du installere Python via det officielle websted.

Dernæst skal vi få BeautifulSoup-biblioteket ved hjælp af pipet pakkehåndteringsværktøj til Python.

Skriv i terminalen:

easy_install pip pip install BeautifulSoup4

Bemærk : Hvis du ikke udfører ovenstående kommandolinje, skal du prøve at tilføje sudoforan hver linje.

Det grundlæggende

Før vi begynder at springe ind i koden, lad os forstå det grundlæggende i HTML og nogle regler for skrabning.

HTML-tags

Hvis du allerede forstår HTML-tags, er du velkommen til at springe denne del over.

First Scraping

Hello World

Dette er den grundlæggende syntaks på en HTML-webside. Hver tjener en blok inde på websiden:

1 .: HTML-dokumenter skal starte med en typedeklaration.

2. HTML-dokumentet findes mellem og .

3. Meta- og script-erklæringen for HTML-dokumentet er mellem og .

4. Den synlige del af HTML-dokumentet er mellem og tags.

5. Titeloverskrifter defineres med

igennem

tags.

6. Stk. Defineres med

Other useful tags include for hyperlinks,

for tables, for table rows, and
til tabelkolonner.

HTML-tags kommer også nogle gange med ideller classattributter. Den idattribut angiver et entydigt id til en HTML-tag, og værdien skal være entydigt i HTML-dokumentet. Den classattribut bruges til at definere lige stilarter for HTML-tags med den samme klasse. Vi kan bruge disse id'er og klasser til at hjælpe os med at finde de data, vi ønsker.

For mere information om HTML-tags, id og klasse henvises til W3Schools Tutorials.

Skrabningsregler

  1. Du bør kontrollere et websteds vilkår og betingelser, før du skraber det. Vær omhyggelig med at læse udsagnene om lovlig brug af data. Normalt skal de data, du skraber, ikke bruges til kommercielle formål.
  2. Bed ikke om data fra webstedet for aggressivt med dit program (også kendt som spamming), da dette kan bryde hjemmesiden. Sørg for, at dit program opfører sig på en rimelig måde (dvs. fungerer som et menneske). En anmodning om en webside pr. Sekund er god praksis.
  3. Layoutet på et websted kan ændre sig fra tid til anden, så sørg for at besøge webstedet igen og omskrive din kode efter behov

Inspektion af siden

Lad os tage en side fra Bloomberg Quote-webstedet som et eksempel.

Som en person, der følger aktiemarkedet, vil vi gerne få indeksnavnet (S&P 500) og dets pris fra denne side. Højreklik først og åbn din browsers inspektør for at inspicere websiden.

Prøv at holde markøren over prisen, og du skal kunne se en blå boks omkring den. Hvis du klikker på den, vælges den relaterede HTML i browserkonsollen.

Fra resultatet kan vi se, at prisen ligger inden for et par niveauer af HTML-tags, hvilket er .

Tilsvarende, hvis du holder markøren og klikker på navnet “S&P 500 Index”, er det indeni og

.

Nu kender vi den unikke placering af vores data ved hjælp af classtags.

Hop ind i koden

Nu hvor vi ved, hvor vores data er, kan vi begynde at kode vores webskraber. Åbn din teksteditor nu!

Først skal vi importere alle de biblioteker, vi skal bruge.

# import libraries import urllib2 from bs4 import BeautifulSoup

Derefter erklæres en variabel for sidens url.

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

Brug derefter Python urllib2 for at få HTML-siden for url erklæret.

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

Til sidst skal du parse siden i BeautifulSoup-format, så vi kan bruge BeautifulSoup til at arbejde på den.

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

Nu har vi en variabel soup, der indeholder sidens HTML. Her kan vi begynde at kode den del, der udtrækker dataene.

Husk de unikke lag af vores data? BeautifulSoup kan hjælpe os med at komme ind i disse lag og udtrække indholdet med find(). I dette tilfælde, da HTML-klassen nameer unik på denne side, kan vi bare spørge .

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

Når vi har tagget, kan vi hente dataene ved at hente dem text.

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

På samme måde kan vi også få prisen.

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

Når du kører programmet, skal du kunne se, at det udskriver den aktuelle pris på S&P 500-indekset.

Eksporter til Excel CSV

Nu hvor vi har dataene, er det tid til at gemme dem. Excel Comma Separated Format er et godt valg. Det kan åbnes i Excel, så du kan se dataene og behandle dem let.

Men først skal vi importere Python csv-modulet og datetime-modulet for at få registreringsdatoen. Indsæt disse linjer i din kode i afsnittet import.

import csv from datetime import datetime

I bunden af ​​din kode skal du tilføje koden til at skrive data til en csv-fil.

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

Hvis du nu kører dit program, skal du kunne eksportere en index.csvfil, som du derefter kan åbne med Excel, hvor du skal se en datalinje.

Så hvis du kører dette program hver dag, vil du være i stand til nemt at få S&P 500-indeksprisen uden at rodfæste gennem hjemmesiden!

Gå videre (avancerede anvendelser)

Flere indekser

Så skrabning af et indeks er ikke nok for dig, ikke? Vi kan prøve at udtrække flere indeks på samme tid.

Først skal du ændre den quote_pagei en række URL'er.

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

Derefter ændrer vi dataekstraktionskoden til en forsløjfe, som behandler URL'erne en efter en og gemmer alle data i en variabel datai tupler.

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

Du skal også ændre lagringsafsnittet for at gemme data række for række.

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

Kør programmet igen, og du skal være i stand til at udtrække to indekser på samme tid!

Avancerede skrabeteknikker

BeautifulSoup er enkel og fantastisk til småskrabning på nettet. Men hvis du er interesseret i at skrabe data i større skala, bør du overveje at bruge disse andre alternativer:

  1. Scrapy, en stærk python-skrabningsramme
  2. Prøv at integrere din kode med nogle offentlige API'er. Effektiviteten ved datahentning er meget højere end at skrabe websider. Se for eksempel på Facebook Graph API, som kan hjælpe dig med at få skjulte data, som ikke vises på Facebook-websider.
  3. Overvej at bruge en database-backend som MySQL til at gemme dine data, når de bliver for store.

Vedtag DRY-metoden

DRY står for “Don't Repeat Yourself”, prøv at automatisere dine daglige opgaver som denne person. Nogle andre sjove projekter, du kan overveje, kan være at holde styr på dine Facebook-venners aktive tid (med deres samtykke selvfølgelig) eller tage en liste over emner i et forum og afprøve naturlig sprogbehandling (hvilket er et varmt emne for kunstig intelligens lige nu)!

Hvis du har spørgsmål, er du velkommen til at efterlade en kommentar nedenfor.

Referencer

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

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

Denne artikel blev oprindeligt offentliggjort på Altitude Labs 'blog og blev skrevet af vores softwareingeniør, Leonard Mok. Altitude Labs er et softwarebureau, der specialiserer sig i personaliserede, mobil-første React-apps.