Nettskraping med Python Scrapy Module

Nettskraping med Python Scrapy Module
Ferdigheten til skraping av nettet har blitt gylden i dag, så la oss lære hvordan vi kan få nødvendige data fra websider. I denne artikkelen ville vi snakke om Scrapy Python -biblioteket, hva det kan gjøre og hvordan du bruker det. La oss komme i gang.

Hvorfor skrape?

Scrapy er et robust skrapingsbibliotek for nettet, som gir muligheten til å laste ned websider, bilder og alle data du kan tenke på i lynets hastighet. Hastighet er av stor betydning i beregning, og Scrapy fungerer på dette ved å besøke nettsteder asynkront og gjøre mye bakgrunnsarbeid, slik at hele oppgaven ser enkel.

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

Installasjon

La oss se raskt på hvordan dette kraftige biblioteket kan installeres på maskinen din.

Som med flertallet av Python -bibliotekene, kan du installere Scrapy ved hjelp av PIP -modulen:

Pip installer skrape

Du kan sjekke om installasjonen var vellykket ved å importere Scrapy 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 "hjelp", "copyright", "studiepoeng" eller "lisens" for mer informasjon.

>>> Importer skrap

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

Opprette et nettskrapingsprosjekt

Under installasjonen ble det skrape nøkkelordet lagt til banen slik at vi kan bruke nøkkelordet direkte fra kommandolinjen. Vi vil dra nytte av dette, gjennom hele vår bruk av biblioteket.

Fra Directory of Your Choice kjør følgende kommando:

Scrapy StartProject WebScraper

Dette vil lage en katalog som heter WebScraper I gjeldende katalog og skrapi.CFG -fil. I WebScraper Katalogen ville ha __i det__.py, gjenstander.PY, Middlewares.PY, rørledninger.py, innstillinger.py filer og en katalog som heter edderkopper.

Vår edderkopp filer i.e. Skriptet som gjør webskraping for oss, vil bli lagret i edderkopper katalog.

Skrive vår edderkopp

Før vi går videre for å skrive vår edderkopp, forventes det at vi allerede vet hvilket nettsted vi vil skrape. For formålet med denne artikkelen skraper vi et eksempel på webscraping nettsted: http: // eksempel.webskraping.com.

Dette nettstedet har bare landsnavn og flaggene deres, med forskjellige sider, og vi kommer til å skrape tre av sidene. De tre sidene vi ville jobbe med er:

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

Tilbake til vår edderkopp, skal vi opprette en Sample_Spider.py i edderkoppkatalogen. Fra terminalen, en enkel Touch Sample_Spider.py Kommandoen vil bidra til å opprette en ny fil.

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

Importer skrap
Klassesamplespider (Scrapy.Edderkopp):
name = "prøve"
start_urls = [
"http: // eksempel.webskraping.com/steder/standard/indeks/0 ",
"http: // eksempel.webskraping.com/steder/standard/indeks/1 ",
"http: // eksempel.webskraping.com/steder/standard/indeks/2 "
]
def parse (selv, respons):
side_number = svar.URL.split ('/') [-1]
file_name = "side .html ".Format (side_number)
Med Open (File_Name, 'WB') som fil:
fil.Skriv (svar.kropp)

Fra toppnivået i prosjektets katalog, kjør følgende kommando:

Scrapy Crawl -prø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 er lagret i katalogen.

La oss se på hva som skjer med koden:

Importer skrap

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

Klassesamplespider (Scrapy.Edderkopp):
name = "prøve"

Så lager vi en edderkoppklasse som vi kaller Samplespider. Vår edderkopp arver fra Scrapy.Edderkopp. Alle edderkoppene våre må arve fra skrape.Edderkopp. Etter å ha opprettet klassen, gir vi vår edderkopp en Navn attributt, dette Navn attributt brukes til å tilkalle edderkoppen fra terminalen. Hvis du husker det, kjørte vi Scrapy Crawl -prøve Kommando for å kjøre koden vår.

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

Vi har også en liste over nettadresser for edderkoppen å besøke. Listen må kalles start_urls. Hvis du vil gi listen et annet navn, må vi definere en start_requests funksjon som gir oss noen flere evner. For å lære mer kan du sjekke ut skrapedokumentasjonen.

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

def parse (selv, respons):

Vi fortsetter deretter med å erklære en analysefunksjon og gi den en responsparameter. Når koden kjøres, fremkalles parsefunksjonen og svarobjektet sendes som inneholder all informasjonen til den besøkte websiden.

side_number = svar.URL.split ('/') [-1]
file_name = "side .html ".Format (side_number)

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

Med Open (File_Name, 'WB') som fil:
fil.Skriv (svar.kropp)

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

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

Fra siden for å bli skrotet, her er et utdrag av HTML som inneholder dataene vi trenger:






..
..

Afghanistan

Alandøyene

Du vil legge merke til at alle nødvendige data er vedlagt i DIV -tagger, så vi kommer til å omskrive koden for å analysere HTML.
Her er vårt nye manus:

Importer skrap
fra BS4 import BeautifulSoup
Klassesamplespider (Scrapy.Edderkopp):
name = "prøve"
start_urls = [
"http: // eksempel.webskraping.com/steder/standard/indeks/0 ",
"http: // eksempel.webskraping.com/steder/standard/indeks/1 ",
"http: // eksempel.webskraping.com/steder/standard/indeks/2 "
]
def parse (selv, respons):
side_number = svar.URL.split ('/') [-1]
file_name = "side .tekst".Format (side_number)
Med Open (File_Name, 'W') som fil:
html_content = BeautifulSoup (svar.kropp, "lxml")
div_tags = html_content.finn ("div", "id": "resultater")
country_tags = div_tags.find_all ("Div")
country_name_position = zip (rekkevidde (len (country_tags)), country_tags)
For posisjon, country_name in country_name_position:
fil.Skriv ("Landsnummer : \ n".Format (posisjon + 1, country_name.tekst))

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

La oss se raskt på logikken.

def parse (selv, respons):

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

side_number = svar.URL.split ('/') [-1]
file_name = "side .tekst".Format (side_number)
Med Open (File_Name, 'W') som fil:

Dette gjør det samme som omtalt i Intial Code, den eneste forskjellen er at vi jobber med en tekstfil i stedet for en HTML -fil. Vi vil lagre de skrapte dataene i tekstfilen, og ikke hele nettinnholdet 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_content variabel.

div_tags = html_content.finn ("div", "id": "resultater")

Når vi tar 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 tagger og lagrer dem som en liste i country_tags variabel.

country_name_position = zip (rekkevidde (len (country_tags)), country_tags)
For posisjon, country_name in country_name_position:
fil.Skriv ("Landsnummer : \ n".Format (posisjon + 1, country_name.tekst))

Her itererer vi gjennom landets plassering blant alle lands tagger, 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: Aland Islands
Landsnummer 3: Albania
..

Konklusjon

Scrapy er utvilsomt et av de kraftigste bibliotekene der ute, det er veldig raskt og laster i utgangspunktet på websiden. Det gir deg friheten til hva du ønsker med nettinnholdet.

Vi må merke oss at Scrapy kan gjøre mye mer enn vi har sjekket ut her. Du kan analysere data med skrapende CSS eller XPath -velgere hvis du ønsker. Du kan lese opp dokumentasjonen hvis du trenger å gjøre noe mer sammensatt.