Skrapete

Web Skraping med Python Scrapy Module

Web Skraping med Python Scrapy Module
Ferdigheten med nettskraping har blitt gylden i dag, så la oss lære hvordan vi kan få nødvendige data fra nettsider. I denne artikkelen vil vi snakke om Scrapy Python-biblioteket, hva det kan gjøre og hvordan du bruker det. La oss komme i gang.

Hvorfor skrapete?

Scrapy er et robust nettskrapebibliotek som gir muligheten til å laste ned nettsider, bilder og all data du kan tenke deg lynraskt. Hastighet er av stor betydning i beregning, og Scrapy jobber med dette ved å besøke nettsteder asynkront og gjøre mye bakgrunnsarbeid som gjør at hele oppgaven ser lett ut.

Det skal sies at Python har andre biblioteker som kan brukes til å skrape data fra nettsteder, men ingen er sammenlignbare med Scrapy når det gjelder effektivitet.

Installasjon

La oss ta en rask titt på hvordan dette kraftige biblioteket kan installeres på maskinen din.

Som med de fleste Python-biblioteker, kan du installere Scrapy ved hjelp av pip-modulen:

pip installer Scrapy

Du kan sjekke om installasjonen var vellykket ved å importere skrapete i Pythons interaktive skall.

$ python
Python 3.5.2 (standard, 14. september 2017, 22:51:06)
[GCC 5.4.0 20160609] på linux

Skriv inn “help”, “copyright”, “credits” eller “lisens” for mer informasjon.

>>> importer skrapete

Nå som vi er ferdige med installasjonen, la oss komme inn i det tykke.

Opprette et web-skrapeprosjekt

Under installasjonen ble det skrapete nøkkelordet lagt til banen slik at vi kan bruke nøkkelordet direkte fra kommandolinjen. Vi vil dra nytte av dette gjennom hele bruken av biblioteket.

Kjør følgende kommando fra katalogen du ønsker:

skrap startprosjekt nettskraper

Dette vil opprette en katalog som heter nettskraper i gjeldende katalog og skrapete.CFG-fil. I nettskraper  katalog ville ha __i det__.py, gjenstander.py, mellomvare.py, rørledninger.py, innstillinger.py filer og en katalog som heter edderkopper.

Våre edderkoppfiler i.e. skriptet som gjør webscraping for oss, vil bli lagret i edderkopper katalog.

Skriver vår edderkopp

Før vi fortsetter å skrive edderkoppen, forventes det at vi allerede vet hvilket nettsted vi ønsker å skrape. For formålet med denne artikkelen skraper vi et eksempel på webscraping-nettsted: http: // eksempel.webscraping.com.

Dette nettstedet har bare landnavn og deres flagg, med forskjellige sider, og vi skal skrote tre av sidene. De tre sidene vi vil jobbe med er:

http: // eksempel.webscraping.com / steder / standard / indeks / 0
http: // eksempel.webscraping.com / steder / standard / indeks / 1
http: // eksempel.webscraping.com / steder / standard / indeks / 2

Tilbake til edderkoppen vår, skal vi lage en sample_spider.py i edderkoppkatalogen. Fra terminalen, en enkel berør sample_spider.py kommandoen vil bidra til å lage en ny fil.

Etter å ha opprettet filen, vil vi fylle den med følgende kodelinjer:

importer skrapete
 
klasse SampleSpider (skrapete.Edderkopp):
navn = "prøve"
start_urls = [
"http: // eksempel.webscraping.no / steder / standard / indeks / 0 ",
"http: // eksempel.webscraping.no / steder / standard / indeks / 1 ",
"http: // eksempel.webscraping.no / steder / standard / indeks / 2 "
]
 
def parse (selv, respons):
page_number = svar.url.split ('/') [- 1]
file_name = "side .html ".format (sidetall)
med åpen (filnavn, 'wb') som fil:
fil.skriv (svar.kropp)

Kjør følgende kommando fra det øverste nivået i prosjektets katalog:

skrapete gjennomsøkingsprøve

Husk at vi ga vår SampleSpider klasse a Navn Egenskap prøve.

Etter å ha kjørt den kommandoen, vil du legge merke til at tre filer som heter page0.html, side1.html, side2.html lagres i katalogen.

La oss ta en titt på hva som skjer med koden:

importer skrapete

Først importerer vi biblioteket til vårt navneområde.

klasse SampleSpider (skrapete.Edderkopp):
navn = "prøve"

Så lager vi en edderkoppklasse som vi kaller SampleSpider. Edderkoppen vår arver fra skrapete.Edderkopp. Alle edderkoppene våre må arve fra skrapete.Edderkopp. Etter å ha laget klassen, gir vi edderkoppen vår en Navn attributt, dette Navn attributt brukes til å tilkalle edderkoppen fra terminalen. Hvis du husker, kjørte vi skrapete gjennomsøkingsprøve kommando for å kjøre koden vår.

start_urls = [
 
"http: // eksempel.webscraping.no / steder / standard / indeks / 0 ",
"http: // eksempel.webscraping.no / steder / standard / indeks / 1 ",
"http: // eksempel.webscraping.no / steder / standard / indeks / 2 "
]

Vi har også en liste over nettadresser som edderkoppen kan besøke. Listen må ringes opp start_urls. Hvis du vil gi listen et annet navn, må vi definere et start_forespørsler funksjon som gir oss flere muligheter. For å lære mer kan du sjekke ut den skrapete dokumentasjonen.

Uansett, ikke glem å ta med http: // eller https: // for koblingene dine, ellers må du håndtere en manglende ordningsfeil.

def parse (selv, respons):

Vi fortsetter deretter med å erklære en analysefunksjon og gi den en responsparameter. Når koden kjøres, blir analysefunksjonen fremkalt og responsobjektet sendt som inneholder all informasjonen til den besøkte websiden.

page_number = svar.url.split ('/') [- 1]
file_name = "side .html ".format (sidetall)

Det vi har gjort med denne koden er å dele strengen som inneholder adressen og lagre sidetallet alene i en side nummer variabel. Så lager vi en filnavn variabel som setter inn side nummer i strengen som ville være filnavnet på filene vi skulle lage.

med åpen (filnavn, 'wb') som fil:
fil.skriv (svar.kropp)

Vi har nå opprettet filen, og vi skriver innholdet på websiden inn i filen ved hjelp av kropp attributt til respons gjenstand.

Vi kan gjøre mer enn bare å lagre websiden. BeautifulSoup-biblioteket kan brukes til å analysere kropp.respons. Du kan sjekke ut denne BeautiulSoup-opplæringen hvis du ikke er kjent med biblioteket.

Fra siden som skal utrangeres, her er et utdrag av html som inneholder dataene vi trenger:

Du vil legge merke til at alle nødvendige data ligger i div-koder, så vi kommer til å skrive om koden for å analysere html.
Her er vårt nye skript:

importer skrapete
fra bs4 import BeautifulSoup
 
klasse SampleSpider (skrapete.Edderkopp):
navn = "prøve"
 
start_urls = [
"http: // eksempel.webscraping.no / steder / standard / indeks / 0 ",
"http: // eksempel.webscraping.no / steder / standard / indeks / 1 ",
"http: // eksempel.webscraping.no / steder / standard / indeks / 2 "
]
 
def parse (selv, respons):
page_number = svar.url.split ('/') [- 1]
file_name = "side .tekst".format (sidetall)
med åpen (filnavn, 'w') som fil:
html_content = BeautifulSoup (svar.kropp, "lxml")
div_tags = html_innhold.finn ("div", "id": "results")
country_tags = div_tags.find_all ("div")
country_name_position = zip (range (len (country_tags)), country_tags)
for posisjon, landnavn i landnavnposisjon:
fil.skriv ("landnummer : \ n".format (posisjon + 1, landnavn.tekst))

Koden er stort sett den samme som den første, men jeg har lagt til BeautifulSoup i navneområdet vårt, og jeg har endret logikken i parsefunksjonen.

La oss ta en rask titt på logikken.

def parse (selv, respons):

Her har vi definert analysefunksjonen, og gitt den en responsparameter.

page_number = svar.url.split ('/') [- 1]
file_name = "side .tekst".format (sidetall)
med åpen (filnavn, 'w') som fil:

Dette gjør det samme som diskutert i den første koden, den eneste forskjellen er at vi jobber med en tekstfil i stedet for en html-fil. Vi lagrer skrapede data i tekstfilen, og ikke hele webinnholdet i html som gjort tidligere.

html_content = BeautifulSoup (svar.kropp, "lxml")

Det vi har gjort i denne kodelinjen er å sende inn respons.kropp som et argument til BeautifulSoup-biblioteket, og tildelte resultatene til html_innhold variabel.

div_tags = html_innhold.finn ("div", "id": "results")

Tar vi html-innholdet, analyserer vi det her ved å søke etter en div tag som også har og id attributt med resultater som det er verdi, så får vi lagre det i en div_tags variabel.

country_tags = div_tags.find_all ("div")

Husk at landene eksisterte i div tagger også, nå får vi ganske enkelt alle div og lagre dem som en liste i country_tags variabel.

country_name_position = zip (range (len (country_tags)), country_tags)
 
for posisjon, landnavn i landnavnposisjon:
fil.skriv ("landnummer : \ n".format (posisjon + 1, landnavn.tekst))

Her gjentas vi gjennom landenes posisjon blant alle landskodene, så lagrer vi innholdet i en tekstfil.

Så i tekstfilen din vil du ha noe sånt som:

land nummer 1: Afghanistan
land nummer 2: Ålandsøyene
land nummer 3: Albania
..

Konklusjon

Skrapete er utvilsomt et av de mektigste bibliotekene der ute, det er veldig raskt og laster i utgangspunktet ned nettsiden. Det gir deg da friheten til hva du måtte ønske med nettinnholdet.

Vi bør merke oss at Scrapy kan gjøre mye mer enn vi har sjekket ut her. Du kan analysere data med Scrapy CSS- eller Xpath-velgerne hvis du ønsker det. Du kan lese opp dokumentasjonen hvis du trenger å gjøre noe mer komplisert.

Mus Hvordan reversere rulle retning for mus og styreplater i Windows 10
Hvordan reversere rulle retning for mus og styreplater i Windows 10
Mus og Pekeplates gjør ikke bare databehandling enkelt, men mer effektivt og mindre tidkrevende. Vi kan ikke forestille oss et liv uten disse enhetene...
Mus Hvordan endre musepekeren og markørstørrelse, farge og skjema på Windows 10
Hvordan endre musepekeren og markørstørrelse, farge og skjema på Windows 10
Musepekeren og markøren i Windows 10 er veldig viktige aspekter ved operativsystemet. Dette kan sies også for andre operativsystemer, så i sannhet er ...
Gratis og åpen kildekode-spillmotorer for utvikling av Linux-spill
Denne artikkelen vil dekke en liste over gratis og open source-spillmotorer som kan brukes til å utvikle 2D- og 3D-spill på Linux. Det er mange slike ...