Skrap

Webskrabning med Python Scrapy-modul

Webskrabning med Python Scrapy-modul
Færdigheden ved webskrabning er blevet gylden i dag, så lad os lære, hvordan vi kan få nødvendige data fra websider. I denne artikel taler vi om Scrapy Python-biblioteket, hvad det kan gøre, og hvordan man bruger det. Lad os komme igang.

Hvorfor skrap?

Scrapy er et robust webskrabebibliotek, der giver mulighed for at downloade websider, billeder og alle data, du kan tænke på med lynets hastighed. Hastighed er meget vigtig i beregningen, og Scrapy arbejder på dette ved at besøge websteder asynkront og udføre en masse baggrundsarbejde, der får hele opgaven til at se let ud.

Det skal siges, at Python har andre biblioteker, der kan bruges til at skrabe data fra websteder, men ingen kan sammenlignes med Scrapy, når det kommer til effektivitet.

Installation

Lad os se hurtigt på, hvordan dette kraftfulde bibliotek kan installeres på din maskine.

Som med de fleste Python-biblioteker kan du installere Scrapy ved hjælp af pip-modulet:

pip installere Scrapy

Du kan kontrollere, om installationen var vellykket ved at importere scrapy i Pythons interaktive shell.

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

Skriv “hjælp”, “ophavsret”, “kreditter” eller “licens” for at få flere oplysninger.

>>> import scrapy

Nu hvor vi er færdige med installationen, lad os komme ind i det tykke af ting.

Oprettelse af et webskrabningsprojekt

Under installationen blev det skrøbelige nøgleord føjet til stien, så vi kan bruge nøgleordet direkte fra kommandolinjen. Vi drager fordel af dette gennem vores brug af biblioteket.

Kør følgende kommando fra den valgte mappe:

scrapy startproject webscraper

Dette ville oprette en kaldet mappe webskraber i den aktuelle mappe og scrapy.CFG-fil. I webskraber  bibliotek ville have __i det__.py, genstande.py, mellemprodukter.py, rørledninger.py, indstillinger.py filer og en mappe kaldet edderkopper.

Vores edderkoppefiler i.e. scriptet, der udfører webscraping for os, gemmes i edderkopper vejviser.

Skriver vores edderkop

Før vi fortsætter med at skrive vores edderkop, forventes det, at vi allerede ved, hvilket websted vi vil skrabe. Med henblik på denne artikel skraber vi et eksempel på webscraping-websted: http: // eksempel.webscraping.com.

Dette websted har bare landsnavne og deres flag med forskellige sider, og vi vil skrotte tre af siderne. De tre sider, vi ville arbejde på, 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

Tilbage til vores edderkop skal vi oprette en sample_spider.py i edderkopbogen. Fra terminalen, en simpel tryk på sample_spider.py kommando ville hjælpe med at oprette en ny fil.

Efter oprettelsen af ​​filen udfylder vi den med følgende linjer med kode:

importere scrapy
 
klasse SampleSpider (scrapy.Edderkop):
navn = "prøve"
start_urls = [
"http: // eksempel.webscraping.com / steder / standard / indeks / 0 ",
"http: // eksempel.webscraping.com / steder / standard / indeks / 1 ",
"http: // eksempel.webscraping.com / steder / standard / indeks / 2 "
]
 
def parse (selv, respons):
page_number = svar.url.split ('/') [- 1]
file_name = "side .html ".format (sidetal)
med åben (filnavn, 'wb') som fil:
fil.skriv (svar.legeme)

Kør følgende kommando fra det øverste niveau i projektets katalog:

scrapy crawl prøve

Husk at vi gav vores SampleSpider klasse a navn attribut prøve.

Efter at have kørt kommandoen, vil du bemærke, at tre filer med navnet page0.html, side1.html, side2.html gemmes i biblioteket.

Lad os se på, hvad der sker med koden:

importere scrapy

Først importerer vi biblioteket til vores navneområde.

klasse SampleSpider (scrapy.Edderkop):
navn = "prøve"

Derefter opretter vi en edderkoppeklasse, som vi kalder SampleSpider. Vores edderkop arver fra skrap.edderkop. Alle vores edderkopper skal arve fra skrabende.edderkop. Efter at have oprettet klassen giver vi vores edderkop en navn attribut, dette navn attribut bruges til at tilkalde edderkoppen fra terminalen. Hvis du husker, kørte vi scrapy crawl prøve kommando til at køre vores kode.

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

Vi har også en liste over webadresser, som edderkoppen kan besøge. Listen skal kaldes start_urls. Hvis du vil give listen et andet navn, skal vi definere et start_anmodninger funktion, som giver os nogle flere muligheder. For at lære mere kan du tjekke den skrøbelige dokumentation.

Uanset hvad, glem ikke at medtage http: // eller https: // for dine links ellers ville du skulle håndtere en manglende skemafejl.

def parse (selv, respons):

Vi fortsætter derefter med at erklære en parsefunktion og give den en reaktionsparameter. Når koden køres, fremkaldes parsefunktionen, og der sendes svarobjekt, som indeholder al information om den besøgte webside.

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

Det, vi har gjort med denne kode, er at opdele strengen, der indeholder adressen, og gemme sidenummeret alene i en sidenummer variabel. Så opretter vi en filnavn variabel, der indsætter sidenummer i den streng, der ville være filnavnet på de filer, vi ville oprette.

med åben (filnavn, 'wb') som fil:
fil.skriv (svar.legeme)

Vi har nu oprettet filen, og vi skriver indholdet af websiden ind i filen ved hjælp af legeme attribut for respons objekt.

Vi kan gøre mere end bare at gemme websiden. BeautifulSoup-biblioteket kan bruges til at analysere legeme.respons. Du kan tjekke denne BeautiulSoup-tutorial, hvis du ikke er fortrolig med biblioteket.

Fra siden, der skal skrottes, er her et uddrag af html'en, der indeholder de data, vi har brug for:

Du vil bemærke, at alle de nødvendige data er indeholdt i div-tags, så vi vil omskrive koden for at analysere html.
Her er vores nye script:

importere scrapy
fra bs4 import BeautifulSoup
 
klasse SampleSpider (scrapy.Edderkop):
navn = "prøve"
 
start_urls = [
"http: // eksempel.webscraping.com / steder / standard / indeks / 0 ",
"http: // eksempel.webscraping.com / steder / standard / indeks / 1 ",
"http: // eksempel.webscraping.com / steder / standard / indeks / 2 "
]
 
def parse (selv, respons):
page_number = svar.url.split ('/') [- 1]
file_name = "side .txt ".format (sidetal)
med åben (filnavn, 'w') som fil:
html_content = BeautifulSoup (svar.krop, "lxml")
div_tags = html_indhold.find ("div", "id": "results")
country_tags = div_tags.find_all ("div")
country_name_position = zip (range (len (country_tags)), country_tags)
for position, landnavn i landnavn_position:
fil.skriv ("landnummer : \ n".format (position + 1, landnavn.tekst))

Koden er stort set den samme som den oprindelige, men jeg har tilføjet BeautifulSoup til vores navneområde, og jeg har ændret logikken i parsefunktionen.

Lad os se hurtigt på logikken.

def parse (selv, respons):

Her har vi defineret parsefunktionen og givet den en reaktionsparameter.

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

Dette gør det samme som diskuteret i den første kode, den eneste forskel er, at vi arbejder med en tekstfil i stedet for en html-fil. Vi gemmer de skrabede data i tekstfilen og ikke hele webindholdet i html som tidligere gjort.

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

Hvad vi har gjort i denne linje kode er at sende ind respons.legeme som et argument til BeautifulSoup-biblioteket og tildelte resultaterne til html_indhold variabel.

div_tags = html_indhold.find ("div", "id": "results")

Ved at tage html-indholdet analyserer vi det her ved at søge efter en div tag, der også har og id attribut med resultater som det er værdi, så kommer vi til at gemme det i en div_tags variabel.

country_tags = div_tags.find_all ("div")

Husk, at landene eksisterede i div tags så godt, nu får vi simpelthen alle de div tags og gemme dem som en liste i landemærker variabel.

country_name_position = zip (interval (len (country_tags)), country_tags)
 
for position, landnavn i landnavn_position:
fil.skriv ("land nummer : \ n".format (position + 1, landnavn.tekst))

Her gentages vi gennem landenes position blandt alle landemærkerne, så gemmer vi indholdet i en tekstfil.

Så i din tekstfil ville du have noget som:

land nummer 1: Afghanistan
land nummer 2: Aland Islands
land nummer 3: Albanien
..

Konklusion

Scrapy er utvivlsomt et af de mest magtfulde biblioteker derude, det er meget hurtigt og downloader grundlæggende websiden. Det giver dig derefter friheden til hvad du måtte ønske med webindholdet.

Vi skal bemærke, at Scrapy kan gøre meget mere, end vi har tjekket ud her. Du kan analysere data med Scrapy CSS eller Xpath-vælgere, hvis du ønsker det. Du kan læse dokumentationen op, hvis du har brug for at gøre noget mere komplekst.

Nyttige værktøjer til Linux-spillere
Hvis du kan lide at spille spil på Linux, er chancerne for, at du måske har brugt apps og hjælpeprogrammer som Wine, Lutris og OBS Studio for at forbe...
HD Remastered-spil til Linux, der aldrig tidligere havde haft en Linux-udgivelse
Mange spiludviklere og udgivere kommer med HD-remaster af gamle spil for at forlænge franchisens levetid. Venligst fans, der anmoder om kompatibilitet...
Sådan bruges AutoKey til at automatisere Linux-spil
AutoKey er et desktopautomatiseringsværktøj til Linux og X11, programmeret i Python 3, GTK og Qt. Ved hjælp af dets scripting og MACRO-funktionalitet ...