Hvordan bygge en grunnleggende webcrawler for å hente informasjon fra et nettsted

Hvordan bygge en grunnleggende webcrawler for å hente informasjon fra et nettsted

Programmer som leser informasjon fra nettsteder eller webcrawlere, har alle slags nyttige applikasjoner. Du kan skrape etter lagerinformasjon, sportsresultater, tekst fra en Twitter -konto eller trekke priser fra shoppingnettsteder.





Å skrive disse web -gjennomsøkingsprogrammene er enklere enn du kanskje tror. Python har et flott bibliotek for å skrive skript som trekker ut informasjon fra nettsteder. La oss se på hvordan du lager en webcrawler ved hjelp av Scrapy.





Installere Scrapy

Skrapete er et Python -bibliotek som ble opprettet for å skrape nettet og bygge webcrawlere. Det er raskt, enkelt og kan navigere gjennom flere nettsider uten særlig innsats.





Scrapy er tilgjengelig gjennom Pip Installs Python (PIP) -biblioteket, her er en oppdatering hvordan du installerer PIP på Windows, Mac og Linux .

Det er foretrukket å bruke et virtuelt miljø i Python fordi det lar deg installere Scrapy i en virtuell katalog som lar systemfilene være i fred. Scrapys dokumentasjon anbefaler å gjøre dette for å få de beste resultatene.



Lag en katalog og initialiser et virtuelt miljø.

hva er en markert kommentar på youtube
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

Du kan nå installere Scrapy i den katalogen ved hjelp av en PIP -kommando.





pip install scrapy

En rask sjekk for å sikre at Scrapy er riktig installert

scrapy
# prints
Scrapy 1.4.0 - no active project
Usage:
scrapy [options] [args]
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
...

Hvordan bygge en webcrawler

Nå som miljøet er klart kan du begynne å bygge webcrawler. La oss skrape litt informasjon fra en Wikipedia -side om batterier: https://en.wikipedia.org/wiki/Battery_(electricity) .





Det første trinnet for å skrive en crawler er å definere en Python -klasse som strekker seg fra Skrapete edderkopp . Dette gir deg tilgang til alle funksjonene og funksjonene i Scrapy. La oss kalle denne klassen edderkopp1 .

En edderkoppklasse trenger noen få opplysninger:

  • til Navn for å identifisere edderkoppen
  • til start_urls variabel som inneholder en liste over nettadresser å gjennomsøke fra (Wikipedia -URL -en er eksemplet i denne opplæringen)
  • til analyse () metode som brukes til å behandle nettsiden for å trekke ut informasjon
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass

En rask test for å kontrollere at alt går som det skal.

scrapy runspider spider1.py
# prints
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats',
...

Slå av logging

Å kjøre Scrapy med denne klassen skriver ut logginformasjon som ikke hjelper deg akkurat nå. La oss gjøre det enkelt ved å fjerne denne overflødige logginformasjonen. Bruk en advarsel setning ved å legge til kode i begynnelsen av filen.

import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)

Når du kjører skriptet igjen, skrives ikke logginformasjonen ut.

Bruker Chrome Inspector

Alt på en webside lagres i HTML -elementer. Elementene er ordnet i Document Object Model (DOM). Å forstå DOM er avgjørende for å få mest mulig ut av web -søkeroboten din. En webcrawler søker gjennom alle HTML -elementene på en side for å finne informasjon, så det er viktig å vite hvordan de er arrangert.

Google Chrome har verktøy som hjelper deg med å finne HTML -elementer raskere. Du kan finne HTML -koden for alle elementene du ser på nettsiden ved hjelp av inspektøren.

  • Naviger til en side i Chrome
  • Plasser musen på elementet du vil se
  • Høyreklikk og velg Undersøke fra menyen

Disse trinnene åpner utviklerkonsollen med Elementer kategorien valgt. Nederst på konsollen ser du et tre av elementer. Dette treet er hvordan du får informasjon om skriptet ditt.

Trekker ut tittelen

La oss få skriptet til å gjøre noe arbeid for oss; En enkel gjennomgang for å få tittelteksten på nettsiden.

Start skriptet ved å legge til noen kode i analyse () metode som trekker ut tittelen.

...
def parse(self, response):
print response.css('h1#firstHeading::text').extract()
...

De respons argument støtter en metode som kalles CSS () som velger elementer fra siden ved å bruke plasseringen du oppgir.

I dette eksemplet er elementet h1.firstHeading . Legger til

::text

til skriptet er det som gir deg tekstinnholdet i elementet. Til slutt, ekstrakt() metoden returnerer det valgte elementet.

Når du kjører dette skriptet i Scrapy, skrives tittelen ut i tekstform.

[u'Battery (electricity)']

Finne beskrivelsen

Nå som vi har skrapt tittelteksten, la oss gjøre mer med skriptet. Crawler kommer til å finne det første avsnittet etter tittelen og trekke ut denne informasjonen.

Her er elementtreet i Chrome Developer Console:

toshiba ekstern harddisk blått lys
div#mw-content-text>div>p

Høyrepilen (>) indikerer et forhold mellom foreldre og barn mellom elementene.

Denne plasseringen vil returnere alle s elementene matchet, som inkluderer hele beskrivelsen. For å få den første s element kan du skrive denne koden:

response.css('div#mw-content-text>div>p')[0]

På samme måte som tittelen, legger du til CSS -ekstraktor

::text

for å få tekstinnholdet i elementet.

response.css('div#mw-content-text>div>p')[0].css('::text')

Det siste uttrykket bruker ekstrakt() for å returnere listen. Du kan bruke Python bli med() funksjon for å bli med på listen når all gjennomsøking er fullført.

def parse(self, response):
print ''.join(response.css('div#mw-content-text>div>p')[0].css('::text').extract())

Resultatet er tekstens første ledd!

An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is
...

Samle inn JSON -data

Scrapy kan trekke ut informasjon i tekstform, noe som er nyttig. Scrapy lar deg også se dataene JavaScript Object Notation (JSON). JSON er en fin måte å organisere informasjon på og er mye brukt i webutvikling. JSON fungerer ganske bra med Python også.

Når du trenger å samle inn data som JSON, kan du bruke utbytte uttalelse innebygd i Scrapy.

Her er en ny versjon av skriptet som bruker en avkastningserklæring. I stedet for å få det første p -elementet i tekstformat, tar dette tak i alle p -elementene og organiserer det i JSON -format.

hva er mail drop på iphone
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

Du kan nå kjøre edderkoppen ved å spesifisere en utdata JSON -fil:

scrapy runspider spider3.py -o joe.json

Skriptet vil nå skrive ut alle p -elementene.

[
{'para': 'An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term 'battery' specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]'},
{'para': 'Primary (single-use or 'disposable') batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple
...

Skraping av flere elementer

Så langt har webcrawler skrapt tittelen og en slags element fra siden. Scrapy kan også trekke ut informasjon fra forskjellige typer elementer i ett skript.

La oss trekke ut de beste IMDb Box Office -treffene i en helg. Denne informasjonen er hentet fra http://www.imdb.com/chart/boxoffice , i en tabell med rader for hver beregning.

De analyse () metoden kan trekke ut mer enn ett felt fra raden. Ved å bruke utviklerverktøyene for Chrome finner du elementene som er nestet inne i tabellen.

...
def parse(self, response):
for e in response.css('div#boxoffice>table>tbody>tr'):
yield {
'title': ''.join(e.css('td.titleColumn>a::text').extract()).strip(),
'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(),
'image': e.css('td.posterColumn img::attr(src)').extract_first(),
}
...

De bilde velgeren spesifiserer det img er en etterkommer av td.posterColumn . For å trekke ut det riktige attributtet, bruk uttrykket | _+_ |.

Å kjøre edderkoppen returnerer JSON:

::attr(src)

Flere webskrapere og roboter

Scrapy er et detaljert bibliotek som kan gjøre omtrent hvilken som helst nettsøking du ber den om. Når det gjelder å finne informasjon i HTML -elementer, kombinert med støtte fra Python, er det vanskelig å slå. Enten du bygger en webcrawler eller lærer om det grunnleggende om nettskraping, er den eneste grensen hvor mye du er villig til å lære.

Hvis du leter etter flere måter å bygge robotsøkeprogrammer eller roboter på, kan du prøve det bygge Twitter og Instagram bots ved hjelp av Python . Python kan bygge noen fantastiske ting innen webutvikling, så det er verdt å gå utover webcrawlere når du utforsker dette språket.

Dele Dele kvitring E -post 15 kommandoer i Windows -ledetekst (CMD) du må vite

Kommandoprompten er fremdeles et kraftig Windows -verktøy. Her er de mest nyttige CMD -kommandoene hver Windows -bruker trenger å vite.

Les neste
Relaterte temaer
  • Programmering
  • Verktøy for nettredaktører
  • Programmering
  • Python
  • Opplæringsprogrammer for koding
  • Webcrawlers
Om forfatteren Anthony Grant(40 artikler publisert)

Anthony Grant er frilansskribent som dekker programmering og programvare. Han er en datavitenskap som jobber med programmering, Excel, programvare og teknologi.

Mer fra Anthony Grant

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis ebøker og eksklusive tilbud!

Klikk her for å abonnere