Slik bygger du en grunnleggende webleser for å trekke informasjon fra et nettsted

Slik bygger du en grunnleggende webleser for å trekke informasjon fra et nettsted / programmering

Har du noen gang ønsket å programmere fange spesifikk informasjon fra et nettsted for videre behandling? Si noe som sportspoeng, aksjemarkedstrender eller den nyeste fad, bitcoin og andre krypto-valuta priser? Hvis informasjonen du trenger er tilgjengelig på en nettside, kan du skrive en crawler (også kjent som en skrape eller en edderkopp) for å navigere på nettsiden og trekke ut akkurat det du trenger. La oss finne ut hvordan du gjør det i python.

Vær oppmerksom på at flere nettsteder fraråder å bruke en robotsøkeprogram for å få tilgang til informasjon som nettstedet gir. Så vennligst sjekk vilkårene for nettstedet før du distribuerer en robotsøkeprogram på et hvilket som helst nettsted.

Installere Skrapete

Vi bruker en pythonmodul kalt Scrapy for å håndtere den faktiske gjennomsøkingen. Det er raskt, enkelt og kan navigere flere websider akkurat som du kan med en nettleser.

Vær imidlertid oppmerksom på at scrapy ikke har noen anlegg for å behandle javascript når du navigerer på nettstedet. Så de nettstedene og appene som bruker javascript til å manipulere brukergrensesnittet, kan ikke gjennomsøkes riktig med denne tilnærmingen.

La oss nå installere skrapete. Vi bruker virtualenv Lær hvordan du bruker Python Virtual Environment Lær hvordan du bruker Python Virtual Environment Uansett om du er en erfaren Python-utvikler, eller hvis du nettopp har begynt, lærer du å sette opp et virtuelt miljø, er det viktig for et Python-prosjekt. Les mer for å installere scrapy. Dette gjør at vi kan installere scrapy i en katalog uten å påvirke andre systeminstallerte moduler.

Opprett en katalog og start et virtuelt miljø i den katalogen.

mkdir crawler cd crawler virtualenv venv. Venv / bin / deaktivere 

Du kan nå installere scrapy i denne katalogen.

pip installere skrapete 

Sjekk at scrapy er installert riktig.

scrapy # utskrifter Scrapy 1.4.0 - ingen aktivt prosjekt Bruk: scrapy  [alternativer] [args] Tilgjengelige kommandoer: benk Kjør hurtig benchmark test hente Hent en URL ved hjelp av Scrapy downloader genspider Generer ny edderkopp med bruk av forhåndsdefinerte maler runspider Kjør en selvstendig spider (uten å opprette et prosjekt) ... 

Å bygge en webleser Crawler (også kalt en Spider)

La oss nå skrive en robotsøkeprogram for å laste inn noen informasjon. Vi begynner med å skrape litt informasjon fra en Wikipedia-side på et batteri fra https://en.wikipedia.org/wiki/Battery_(electricity).

Det første trinnet i å skrive en crawler er å definere en python-klasse som strekker seg fra scrapy.Spider. La oss ringe denne klassen spider1.

Som et minimum krever en edderkoppklasse følgende:

  • en Navn for å identifisere edderkoppen, “Wikipedia” i dette tilfellet.
  • en start_urls variabel som inneholder en liste over nettadresser for å begynne å gjennomsøke fra. Vi bruker Wikipedia-URLen vist ovenfor for vår første gjennomgang.
  • en parse () Metode som - selv om det ikke er noe for øyeblikket - brukes til å behandle nettsiden for å trekke ut det vi ønsker.
importer scrapy class spider1 (scrapy.Spider): name = 'Wikipedia' start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity' ') def parse (selvrespons): pass 

Vi kan nå kjøre denne edderkoppen for å sikre at alt fungerer som det skal. Det kjøres som følger.

scrapy runspider spider1.py # utskrifter 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 startet (bot: scrapybot) 2017-11-23 09:09:21 [scrapy.utils .log] INFO: Overstyrte innstillinger: 'SPIDER_LOADER_WARN_ONLY': True 2017-11-23 09:09:21 [scrapy.middleware] INFO: Aktiverte utvidelser: ['scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions' .logstats.LogStats', ... 

Slå av logging

Som du kan se, genererer skrapete med vår minimale klasse en gjeng med utgang som ikke gir mye mening for oss. La oss sette innloggingsnivået til advarsel og prøv igjen. Legg til følgende linjer i begynnelsen av filen.

importer logg logging.getLogger ('scrapy'). setLevel (logging.WARNING) 

Når spindelen gjenopprettes, bør vi se minst loggmeldingene.

Bruke Chrome Inspector

Utdrag av informasjon fra en nettside består i å bestemme plasseringen av HTML-elementet som vi ønsker informasjon om. En fin og enkel måte å finne posisjonen til et element. Finn ut nettsideproblemer med Chrome Developer Tools eller Firebug. Finn ut nettsideproblemer med Chrome Developer Tools eller Firebug Hvis du har fulgt mine jQuery opplæringsprogrammer så langt, kan det hende du allerede har gått inn i noen kodeproblemer og ikke kjent hvordan du fikser dem. Når du møter en ikke-funksjonell bit av kode, er det veldig ... Les mer fra Chrome Web Browser er å bruke inspektøren.

  • Naviger til riktig side i Chrome.
  • Plasser musen på elementet som du vil ha informasjonen til.
  • Høyreklikk for å trekke opp kontekstmenyen.
  • Å velge Undersøke fra menyen.

Det burde dukke opp utviklerkonsollen med Elements fanen valgt. Nede under fanen, bør du se statuslinjen med plasseringen av elementet som vist på følgende måte:

html body div # content.mw-body h1 # firstHeading.firstHeading.

Som vi forklarer nedenfor, trenger du noen eller alle deler av denne stillingen.

Utdrag av tittelen

La oss nå legge til noen kode til parse () metode for å trekke ut tittelen på siden.

... def parse (selvrespons): print response.css ('h1 # firstHeading :: text'). Ekstrakt () ... 

De respons argument til metoden støtter en metode som kalles css () som velger elementer fra siden ved hjelp av den oppgitte plasseringen. For vårt tilfelle er elementet h1.firstHeading. Vi trenger tekstinnholdet til elementet slik vi legger til ::tekst til utvalget. Endelig, den ekstrakt() Metoden returnerer det valgte elementet.

Når vi kjører scrapy igjen på denne klassen, får vi følgende utgang:

[u'Batteri (strøm) '] 

Dette viser tittelen har blitt hentet ut i en liste over unicode strenger.

Hvordan om beskrivelsen?

For å demonstrere noen flere aspekter ved utvinning av data fra nettsider, la oss få det første avsnittet i beskrivelsen fra den ovennevnte Wikipedia-siden.

Ved inspeksjon ved hjelp av Chrome Developer Console finner vi at plasseringen av elementet er (Rettvinkelbeslaget (>) indikerer et forhold mellom foreldre og barn mellom elementene):

div # mw-innhold-tekst> div> p

Dette stedet returnerer alle de p elementer matchet, som inkluderer hele beskrivelsen. Siden vi bare vil ha den første p element, bruker vi følgende ekstraktor:

response.css ( 'div # mw-innhold-tekst> div> p') [0] 

For å trekke ut tekstinnholdet, legger vi til CSS-ekstraktor ::tekst:

response.css ( 'div # mw-innhold-tekst> div> p') [0] Css ( ':: tekst') 

Det endelige uttrykket bruker ekstrakt() som returnerer en liste over unicode strenger. Vi bruker pythonen bli med() funksjon for å bli med i listen.

 defarsjon (selvrespons): print ".join (response.css ('div # mw-content-text> div> p') [0] .css (':: text'). 

Utgangen fra å kjøre skrapete med denne klassen er det vi leter etter:

Et elektrisk batteri er en enhet som består av en eller flere elektrokjemiske celler med eksterne tilkoblinger til elektriske elektriske enheter som lommelykter, smarttelefoner og elektriske biler. [1] Når et batteri forsyner elektrisk strøm, er den positive terminalen ... 

Samle inn data ved hjelp av utbytte

Ovenstående kode skriver ut dataene til konsollen. Når du trenger å samle inn data som JSON, kan du bruke utbytte uttalelse. Veien utbytte arbeider er som følger - utfører en funksjon som inneholder a utbytte setning returnerer det som kalles en generator til den som ringer. Generatoren er en funksjon som den som ringer kan gjenta flere ganger til den avsluttes.

Her er kode lik den ovenfor, men som bruker utbytte uttalelse for å returnere listen over p elementer i HTML-koden.

... definisjon (selvrespons): for e i respons.css ('div # mw-content-text> div> p'): yield 'para': " ) .extract ()). strip () ... 

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

scrapy runspider spider3.py -o joe.json 

Produksjonen genereres som følger:

[["para": "Et elektrisk batteri er en enhet som består av en eller flere elektrokjemiske celler med eksterne tilkoblinger som leveres til elektriske elektriske enheter som lommelykter, smarttelefoner og elektriske biler. [1] Når et batteri forsyner elektrisk strøm, positiv terminal er katoden og den negative terminalen er anoden. [2] Terminalen merket negativ er kilden til elektroner som ved tilkobling til en ekstern krets vil strømme og levere energi til en ekstern enhet. Når et batteri er koblet til en ekstern krets, elektrolytter er i stand til å bevege seg som ioner innenfor, slik at de kjemiske reaksjonene blir fullført på de separate terminaler og dermed levere energi til den eksterne kretsen. Det er bevegelsen av disse ionene i batteriet som gjør det mulig å strømme ut av batteriet for å utføre arbeid. [3] Historisk referert begrepet \ "batteri \" spesifikt til en enhet som består av flere celler, men bruken har utviklet seg til å inkludere enheter som består av en synd gle-cellen. [4] ", " para ":" Primærbatterier (engangsbruk eller "engangsbruk") brukes en gang og kasseres; elektrodematerialene blir irreversibelt endret under utladning. Vanlige eksempler er det alkaliske batteriet som brukes til lommelykter og en rekke bærbare elektroniske enheter. Sekundære (oppladbare) batterier kan slipper ut og lades flere ganger ... 

Behandling av flere biter av informasjon

La oss nå se på å trekke ut flere biter relatert til informasjon. For dette eksempelet vil vi trekke ut topp IMDb Box Office-treff for denne helgen. Denne informasjonen er tilgjengelig på http://www.imdb.com/chart/boxoffice, i et bord med en rad med informasjon for hvert treff.

Vi trekker ut ulike felt i hver rad ved hjelp av følgende parse () metode. Igjen ble elementene CSS-stedene bestemt ved hjelp av Chrome Developer Console som forklart ovenfor:

... definisjon (selvrespons): for e i respons.css (div div # boxoffice> tabell> tbody> tr '): yield ' title ': " : tekst.). ekstrakt ()). strip (), 'helg': '. bli med (e.css (' td.ratingColumn ') [0] .css (' :: text '). strip (), 'brutto': '. bli med (e.css (' td.ratingColumn ') [1] .css (' span.secondaryInfo :: text '). : ". bli med (e.css ('td.weeksColumn :: text') .trekk ()) .strimmel (), 'bilde': e.css ('td.posterColumn img :: attr (src)'). extract_first (), ... 

Legg merke til at bilde velgeren ovenfor angir det img er en etterkommer av td.posterColumn, og vi trekker ut attributten som heter src bruker uttrykket :: attr (src).

Kjører edderkoppen returnerer nå følgende JSON:

["brutto": "$ 93.8M", "uker": "1", "helg": "$ 93.8M", "bilde": "https://images-na.ssl-images-amazon.com/images /M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMtMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg "," title ":" Justice League ", " brutto ":" $ 27.5M "," uker ":" 1 "," helg " $ 27.5M "," image ":" https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg "," title ":" Wonder " , "brutto": "$ 247.3M", "uker": "3", "helg": "$ 21.7M", "bilde": "https://images-na.ssl-images-amazon.com/ bilder / M / MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI @ ._ V1_UY67_CR0,0,45,67_AL_.jpg "," tittel ":" Thor: Ragnarok ", ...] 

Bruke Crawler

La oss nå konkludere denne artikkelen med noen få viktige punkter:

  • Ved å bruke python med scrapy, gjør det enkelt å skrive nettsøppeløftere for å trekke ut all informasjon du trenger.
  • Chrome Developer Console (eller Firefox Firebug-verktøy) hjelper til med å finne elementlokasjoner for å trekke ut.
  • Pythons utbytte setning hjelper til med å utvinne gjentatte dataelementer.

Har du noen spesifikke prosjekter i tankene for nettstedskraping? Og hvilke problemer har du møtt med å prøve å få det til å gå? Vennligst gi oss beskjed i kommentarene nedenfor.

Bildekreditt: dxinerz / Depositphotos | Lulzmango / Wikimedia Commons

Utforsk mer om: Programmering, Python, Verktøy for nettredaktører.