Annons

Program som läser information från webbplatser eller webbsökare har alla användbara applikationer. Du kan skrapa för lagerinformation, sportresultat, text från ett Twitter-konto eller dra priser från shoppingwebbplatser.

Att skriva dessa webbsökningsprogram är lättare än du kanske tror. Python har ett bra bibliotek för att skriva skript som extraherar information från webbplatser. Låt oss titta på hur man skapar en webcrawler med Scrapy.

Installera Scrapy

scrapy är ett Python-bibliotek som skapades för att skrapa webben och bygga webbsökare. Det är snabbt, enkelt och kan navigera genom flera webbsidor utan mycket ansträngning.

Scrapy finns tillgängligt via PIP-biblioteket Pip Installs Python, här är en uppdatering hur man installerar PIP på Windows, Mac och Linux Hur man installerar Python PIP på Windows, Mac och LinuxMånga Python-utvecklare förlitar sig på ett verktyg som heter PIP för Python för att effektivisera utvecklingen. Så här installerar du Python PIP. Läs mer .

Använda en virtuell Python-miljö

är att föredra eftersom det låter dig installera Scrapy i en virtuell katalog som lämnar dina systemfiler ensamma. Scrapys dokumentation rekommenderar att du gör detta för att få bästa resultat.

Skapa en katalog och initiera en virtuell miljö.

mkdir sökrobot. cd-sökrobot. virtualenv venv.. venv / bin / aktiverat. 

Du kan nu installera Scrapy i den katalogen med ett PIP-kommando.

pip installera skrapigt. 

En snabb kontroll för att se till att Scrapy är korrekt installerat

scrapy. # utskrifter. Scrapy 1.4.0 - inget aktivt projekt Användning: scrapy  [alternativ] [args] Tillgängliga kommandon: bänk Kör snabbteststesthämtning Hämta en URL med Scrapy-nedladdaren genspider Generera ny spindel med fördefinierade mallar runspider Kör en fristående spindel (utan att skapa en projekt)... 

Hur man bygger en webbrobot

Nu när miljön är klar kan du börja bygga webbsökaren. Låt oss skrapa lite information från en Wikipedia-sida om batterier: https://en.wikipedia.org/wiki/Battery_(electricity).

Det första steget att skriva en sökrobot är att definiera en Python-klass som sträcker sig från Scrapy. Spindel. Detta ger dig tillgång till alla funktioner och funktioner i Scrapy. Låt oss kalla den här klassen spider1.

En spindelklass behöver några information:

  • en namn för att identifiera spindeln
  • en start_urls variabel som innehåller en lista med webbadresser att genomsöka från (Wikipedia URL kommer att vara exemplet i denna självstudie)
  • en parse () metod som används för att bearbeta webbsidan för att extrahera information
importera scrapy klass spider1 (scrapy. Spider): name = 'Wikipedia' start_urls = [' https://en.wikipedia.org/wiki/Battery_(electricity)'] def parse (själv, svar): pass. 

Ett snabbtest för att se till att allt fungerar som det ska.

skrapad runspider spider1.py. # utskrifter. 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 startade (bot: scrapybot) 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Överröjda inställningar: {'SPIDER_LOADER_WARN_ONLY': True} 2017-11-23 09:09:21 [scrapy.middleware] INFO: Aktiverade tillägg: ['scrapy.extensions.memusage. MemoryUsage ',' scrapy.extensions.logstats. LogStats', ...

Stänga av loggning

Om du kör Scrapy med den här klassen skrivs ut logginformation som inte hjälper dig just nu. Låt oss göra det enkelt genom att ta bort denna överskott av logginformation. Använda en varning uttalande genom att lägga till kod i början av filen.

importloggning. logging.getLogger ('scrapy'). setLevel (logging. VARNING)

När du kör skriptet igen kommer inte logginformationen att skrivas ut.

Använd Chrome Inspector

Allt på en webbsida lagras i HTML-element. Elementen är arrangerade i Document Object Model (DOM). Att förstå DOM är avgörande JavaScript och webbutveckling: Använda dokumentobjektmodellenDen här artikeln kommer att presentera dokumentskelettet som JavaScript fungerar med. Med kunskap om detta abstrakta dokumentobjektmodell kan du skriva JavaScript som fungerar på vilken webbsida som helst. Läs mer för att få ut mesta möjliga av din webbrobot. En webcrawler söker igenom alla HTML-element på en sida för att hitta information, så att veta hur de är ordnade är viktigt.

Google Chrome har verktyg som hjälper dig att hitta HTML-element snabbare. Du kan hitta HTML för alla element du ser på webbsidan med inspektören.

  • Navigera till en sida i Chrome
  • Placera musen på det element du vill visa
  • Högerklicka och välj Inspektera från menyn

Dessa steg öppnar utvecklarkonsolen med element fliken vald. Längst ner på konsolen ser du ett träd med element. Detta träd är hur du får information om ditt skript.

Extrahera titeln

Låt oss få skriptet för att göra lite arbete för oss; En enkel genomsökning för att få titeltexten på webbsidan.

Starta skriptet genom att lägga till lite kod i parse () metod som extraherar titeln.

... def parse (själv, svar): print response.css ('h1 # firstHeading:: text'). extrakt ()... 

De svar argument stöder en metod som heter CSS () som väljer element från sidan med den plats du anger.

I det här exemplet är elementet h1.firstHeading. tillsats ::text till skriptet är det som ger dig textinnehållet i elementet. Slutligen, extrahera() metoden returnerar det valda elementet.

Att köra detta skript i Scrapy skriver ut titeln i textform.

[u'Battery (el) ']

Hitta beskrivningen

Nu när vi har skrapat titeltexten låter vi göra mer med skriptet. Sökaren kommer att hitta det första stycket efter titeln och extrahera denna information.

Här är elementträdet i Chrome Developer Console:

div # MW-innehålls text> div> p

Högerpilen (>) indikerar ett förälder-barn-förhållande mellan elementen.

Denna plats kommer att returnera alla p matchade element, som innehåller hela beskrivningen. För att få det första p element du kan skriva den här koden:

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

Precis som titeln lägger du till CSS-extraktor ::text för att få textinnehållet i elementet.

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

Det slutliga uttrycket använder extrahera() för att returnera listan. Du kan använda Python Ansluta sig() funktion för att gå med i listan när alla genomsökningar är slutförda.

 def parse (själv, svar): skriva ut '' .join (response.css ('div # mw-content-text> div> p') [0] .css (':: text'). extrakt ())

Resultatet är textens första stycke!

Ett elektriskt batteri är en anordning som består av en eller flera elektrokemiska celler med externa anslutningar för elektrisk ström enheter som ficklampor, smartphones och elbilar. [1] När ett batteri levererar elkraft är dess positiva terminal är... 

Insamling av JSON-data

Scrapy kan extrahera information i textform, vilket är användbart. Med Scrapy kan du också se JSON (Data Object Object Notation) för data. JSON är ett snyggt sätt att organisera information och används allmänt inom webbutveckling. JSON fungerar ganska bra med Python JSON Python Parsing: En enkel guideDet finns bibliotek och verktygssatser för att analysera och generera JSON från nästan alla språk och miljöer. Den här artikeln koncentrerar sig på metoder och problem som härrör från JSON python-parsing. Läs mer också.

När du behöver samla in data som JSON kan du använda avkastning uttalande inbyggt i Scrapy.

Här är en ny version av skriptet med ett avkastningsförklaring. I stället för att få det första p-elementet i textformat, kommer detta att ta tag i alla p-elementen och organisera det i JSON-format.

... def parse (själv, svar): för e in response.css ('div # mw-content-text> div> p'): ge {'para': '' .join (e.css (':: text') ) .extrakt ()). strip ()}... 

Du kan nu köra spindeln genom att ange en utgående JSON-fil:

skrapad runspider spider3.py -o joe.json. 

Skriptet kommer nu att skriva ut alla p-element.

[ {"para": "Ett elektriskt batteri är en enhet som består av en eller flera elektrokemiska celler med externa anslutningar tillhandahållna till elektriska apparater som t.ex. ficklampor, smartphones och elbilar. [1] När ett batteri levererar elektrisk kraft är dess positiva terminal katoden och dess negativa terminal är anod. [2] Terminalen markerad negativ är källan till elektroner som när de är anslutna till en extern krets kommer att flöda och leverera energi till en extern enhet. När ett batteri är anslutet till en extern krets kan elektrolyter röra sig som joner inuti, vilket tillåter de kemiska reaktionerna som ska slutföras vid de separata terminalerna och därmed leverera energi till det externa krets. Det är rörelsen hos dessa joner i batteriet som gör att strömmen kan strömma ut ur batteriet för att utföra arbete. [3] Historiskt hänvisade termen \ "batteri \" specifikt till en enhet sammansatt av flera celler har användningen emellertid utvecklats till att inkludera enheter som består av en enda cell. [4] "}, {" para ":" Primära batterier (engångsbruk eller \ "engångsbruk") används en gång och kasseras; elektrodmaterialen byts irreversibelt under urladdningen. Vanliga exempel är det alkaliska batteriet som används för ficklampor och en mängd bärbara elektroniska enheter. Sekundära (uppladdningsbara) batterier kan laddas ur och laddas flera ...

Skrapa flera element

Hittills har webbsökaren skrapat titeln och en typ av ett element från sidan. Scrapy kan också extrahera information från olika typer av element i ett skript.

Låt oss extrahera de bästa IMDb Box Office-träffarna för en helg. Denna information hämtas från http://www.imdb.com/chart/boxoffice, i en tabell med rader för varje statistik.

De parse () metoden kan extrahera mer än ett fält från raden. Med hjälp av Chrome Developer Tools kan du hitta elementen kapslade in i tabellen.

... def parse (själv, svar): för e in response.css ('div # boxoffice> tabell> tbody> tr'): ge {'title': '' .join (e.css ('td.titleColumn> a:: text '). extrakt ()). strip (),' weekend ':' '.join (e.css (' td.ratingColumn ') [0] .css (':: text '). extrakt ()). strip (), 'gross': '' .join (e.css ('td.ratingColumn') [1] .css ('span.secondaryInfo:: text'). extrakt ()). strip (), 'veckor': '' .join (e.css (' td.weeksColumn:: text '). extrakt ()). strip (),' image ': e.css ('td.posterColumn img:: attr (src)'). extra_first (),}... 

De bild väljaren anger det img är en ättling till td.posterColumn. Använd uttrycket för att extrahera rätt attribut :: attr (src).

Kör spindeln returnerar JSON:

[ {"gross": "$ 93.8M", "veckor": "1", "weekend": "$ 93.8M", "image": " https://images-na.ssl-images-amazon.com/images/M/MV5BYWVhZjZkYTIt[email protected]._V1_UY67_CR0,0,45,67_AL_.jpg", "title": "Justice League"}, {"gross": "$ 27,5M", "veckor": "1", "weekend": "$ 27,5M", "image": " https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgt[email protected]._V1_UX45_CR0,0,45,67_AL_.jpg", "title": "Wonder"}, {"gross": "$ 247.3M", "weeks": "3", "weekend": "$ 21.7M", "image": " https://images-na.ssl-images-amazon.com/images/M/[email protected]_V1_UY67_CR0,0,45,67_AL_.jpg", "title": "Thor: Ragnarok"},... ]

Fler skrapor och bots

Scrapy är ett detaljerat bibliotek som kan göra nästan alla typer av webbsökningar som du ber om det. När det gäller att hitta information i HTML-element, i kombination med stöd från Python, är det svårt att slå. Oavsett om du bygger en webbrobot eller lära sig om grunderna i webbskrapning den enda gränsen är hur mycket du är villig att lära dig.

Om du letar efter fler sätt att bygga sökrobotar eller bots kan du försöka bygg Twitter- och Instagrambots med Python Hur man bygger Twitter-, Instagram- och redditbots med PythonVill du bygga dina egna sociala mediebots? Så här skickar du automatiskt uppdateringar på Twitter, Instagram och Reddit med Python. Läs mer . Python kan bygga några fantastiska saker i webbutveckling, så det är värt att gå längre än webbsökare när du utforskar detta språk.

Anthony Grant är frilansande författare som täcker programmering och programvara. Han är en huvudvetenskap inom datavetenskap som driver med programmering, Excel, programvara och teknik.