Så här bygger du en grundläggande webbrobot för att dra information från en webbplats

Så här bygger du en grundläggande webbrobot för att dra information från en webbplats / Programmering

Har du någonsin velat programvara fånga specifik information från en webbplats för vidare bearbetning? Säg något som sportresultat, aktiemarknadstrender eller det senaste fadet, bitcoin och andra kryptoprispriser? Om den information du behöver är tillgänglig på en webbplats kan du skriva en sökrobot (även känd som en skrapa eller en spindel) för att navigera på webbplatsen och extrahera precis vad du behöver. Låt oss ta reda på hur man gör det i python.

Observera att flera webbplatser avskräcker från att använda en sökrobot för att få tillgång till information som webbplatsen tillhandahåller. Så kolla in användarvillkoren för webbplatsen innan du implementerar en sökrobot på vilken webbplats som helst.

Installera Scrapy

Vi använder en pythonmodul som heter Scrapy för att hantera den aktuella krypningen. Det är snabbt, enkelt och kan navigera flera webbsidor precis som du kan med en webbläsare.

Observera dock att scrapy inte har några möjligheter att bearbeta javascript när du navigerar på webbplatsen. Så de webbplatser och appar som använder javascript för att manipulera användargränssnittet kan inte genomsökas korrekt med detta tillvägagångssätt.

Låt oss nu installera scrapy. Vi använder virtualenv Lär dig hur du använder Python Virtual Environment Lär dig hur du använder Python Virtual Environment Oavsett om du är en erfaren Python-utvecklare, eller om du bara är igång, lär du dig hur du installerar en virtuell miljö är viktigt för alla Python-projekt. Läs mer för att installera scrapy. Detta gör det möjligt för oss att installera scrapy i en katalog utan att påverka andra systeminstallerade moduler.

Skapa en katalog och initiera en virtuell miljö i den katalogen.

mkdir crawler cd crawler virtualenv venv. venv / bin / activate 

Du kan nu installera scrapy i den här katalogen.

pip installera scrapy 

Kontrollera att scrapy är korrekt installerad.

scrapy # utskrifter Scrapy 1.4.0 - inget aktivt projekt Användning: scrapy  [alternativ] [args] Tillgängliga kommandon: bänk Kör snabb benchmark test hämta Hämta en URL med Scrapy Downloader Genspider Generera ny spindel med fördefinierade mallar Runspider Kör en fristående spindel (utan att skapa ett projekt) ... 

Bygga en webbplats Crawler (kallas också en Spider)

Låt oss nu skriva en sökrobot för att ladda lite information. Vi börjar med att skrapa lite information från en Wikipedia-sida på ett batteri från https://en.wikipedia.org/wiki/Battery_(electricity).

Det första steget att skriva en sökrobot är att definiera en pythonklass som sträcker sig från scrapy.Spider. Låt oss ringa den här klassen spider1.

Som ett minimum krävs en spindelklass för följande:

  • en namn för att identifiera spindeln, “Wikipedia” I detta fall.
  • en start_urls variabel som innehåller en lista med webbadresser för att börja krypa från. Vi använder Wikipedia-webbadressen som visas ovan för vår första genomsökning.
  • en parse () metod som - även om det inte är en uppgift för nu - används för att bearbeta webbsidan för att extrahera det vi vill ha.
importera scrapy class spider1 (scrapy.Spider): name = 'Wikipedia' start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity' ') def parse (själv, svar): passera 

Vi kan nu köra denna spindel för att säkerställa att allt fungerar korrekt. Det körs enligt följande.

scrapy 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: Överförda 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änger av loggning

Som du kan se, genererar skrotande med vår minsta klass en massa utdata som inte ger oss stor mening. Låt oss ställa in loggningsnivån till varning och försök igen. Lägg till följande rader i början av filen.

importera loggning logging.getLogger ('scrapy'). setLevel (logging.WARNING) 

När spindeln körs igen bör vi se minst loggmeddelandena.

Använda Chrome Inspector

Att extrahera information från en webbsida består i att bestämma positionen för HTML-elementet från vilket vi vill ha information. Ett bra och enkelt sätt att hitta positionen för ett element Uträtta webbproblem med Chrome Developer Tools eller Firebug Utvärdera webbplatsproblem med Chrome Developer Tools eller Firebug Om du har följt mina jQuery-tutorials hittills har du kanske redan stött på några kodproblem och inte känt hur man fixar dem. När det gäller en icke-funktionell kodbit är det mycket ... Läs mer från Chrome Web Browser är att använda inspektören.

  • Navigera till rätt sida i Chrome.
  • Placera musen på det element som du vill ha informationen om.
  • Högerklicka för att dra upp snabbmenyn.
  • Välj Inspektera från menyn.

Det borde dyka upp utvecklarens konsol med element fliken vald. Ner under fliken bör du se statusfältet med läget för elementet som visas på följande sätt:

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

Som vi förklarar nedan behöver du några eller alla delar av denna position.

Utdragning av titeln

Låt oss nu lägga till en kod till parse () metod för att extrahera sidans titel.

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

De svar argument till metoden stöder en metod som kallas css () som väljer element från sidan med den angivna platsen. För vårt fall är elementet h1.firstHeading. Vi behöver textinnehållet i elementet så vi lägger till ::text till valet. Slutligen, den extrahera() Metoden returnerar det valda elementet.

Om vi ​​kör igen scrapy på denna klass får vi följande utdata:

[u'Batteri (el) '] 

Detta visar titeln har extraherats till en lista med unicode strängar.

Hur om beskrivningen?

För att visa några fler aspekter av att extrahera data från webbsidor, låt oss få det första stycket i beskrivningen från ovanstående Wikipedia-sida.

Vid inspektion med hjälp av Chrome Developer Console finner vi att elementets placering är (Den rätta vinkelbeslaget (>) indikerar ett förhållande mellan föräldrar och barn mellan elementen):

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

Den här platsen återgår Allt de p element som matchas, vilket inkluderar hela beskrivningen. Eftersom vi bara vill ha den första p element använder vi följande extraktor:

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

För att extrahera textinnehållet lägger vi till CSS-extraktor ::text:

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

Det slutliga uttrycket använder extrahera() som returnerar en lista med unicode-strängar. Vi använder pythonen Ansluta sig() funktion för att gå med i listan.

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

Utgången från att springa i skrot med denna klass är vad vi letar efter:

Ett elektriskt batteri är en apparat som består av en eller flera elektrokemiska celler med externa anslutningar till elnät som t.ex. ficklampor, smartphones och elbilar. [1] När ett batteri levererar el, är dess positiva terminal ... 

Samla in data med avkastning

Ovanstående kod skriver utdragen data till konsolen. När du behöver samla in data som JSON kan du använda avkastning påstående. Vägen avkastning arbeten är som följer - utför en funktion som innehåller en avkastning uttalandet returnerar det som kallas en generator till den som ringer. Generatorn är en funktion som den som ringer upprepade gånger kan utföra tills den slutar.

Här är kod som liknar ovanstående men som använder avkastning uttalande om att returnera listan över p element i HTML.

... svara ('svar'): för e i response.css ('div # mw-content-text> div> p'): yield 'para' ) .xtrakt ()). remsa () ... 

Du kan nu köra spindeln genom att ange en utmatad JSON-fil enligt följande:

scrapy runspider spider3.py -o joe.json 

Produktionen genereras som följer:

["para": "Ett elektriskt batteri är en apparat som består av en eller flera elektrokemiska celler med externa anslutningar som tillhandahålls till elektriska elektriska enheter som ficklampor, smartphones och elbilar. [1] När ett batteri levererar el, Positiv terminal är katoden och dess negativa terminal är anoden. [2] Terminalen märkt negativ är källan till elektroner som när den ansluts till en extern krets kommer att strömma och leverera energi till en extern enhet. När ett batteri är anslutet till en extern krets, elektrolyter kan flytta som joner inom, vilket gör att de kemiska reaktionerna kan slutföras på de separata terminalerna och så leverera energi till den externa kretsen. Det är rörelsen för dessa joner i batteriet vilket 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 som består av flera celler, men användningen har vidare utvecklats för att inkludera enheter som består av en synd gle-cell. [4] ", " para ":" Primär (engångsbruk eller \ "engångs \") batterier används en gång och kasseras; elektrodmaterialet förändras irreversibelt under urladdning. 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 gånger ... 

Bearbetning av flera bitar av information

Låt oss nu titta på att extrahera flera bitar relaterade till information. För det här exemplet kommer vi att extrahera de bästa IMDb Box Office-träffarna för den här helgen. Denna information finns tillgänglig på http://www.imdb.com/chart/boxoffice, i ett bord med en rad information för varje träff.

Vi tar ut olika fält i varje rad med följande parse () metod. Återigen bestämdes elementets CSS-platser med hjälp av Chrome Developer Console som förklaras ovan:

... definiera (själv, svar): för e i respons.css (div div # boxoffice> tabell> tbody> tr '): yield ' title ': " : text "). extrakt ()). strip ()," helg ":" gå med (e.css ('td.ratingColumn') [0] .css (':: text'). strip (), "gross": ".a join (e.css ('td.ratingColumn') [1] .css ('span.secondaryInfo :: text'). : ".a join (e.css ('td.weeksColumn :: text'). extrakt ()) strip (), 'bild': e.css ('td.posterColumn img :: attr (src)'). extract_first (), ... 

Observera att bild väljaren ovan anger det img är en efterkommer av td.posterColumn, och vi extraherar attributet som heter src använder uttrycket :: attr (src).

Kör spindeln returnerar nu följande JSON:

["brutto": "$ 93.8M", "veckor": "1", "helg": "$ 93.8M", "bild": "https://images-na.ssl-images-amazon.com/images /M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMtMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg "," title ":" Justice League ", " gross ":" $ 27.5M "," veckor ":" 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", "veckor": "3", "helg": "$ 21.7M", "bild": "https://images-na.ssl-images-amazon.com/ bilder / M / MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI @ ._ V1_UY67_CR0,0,45,67_AL_.jpg "," title ":" Thor: Ragnarok ", ...] 

Använda din sökrobot

Låt oss nu avsluta denna artikel med några viktiga punkter:

  • Att använda python med scrapy gör det enkelt att skriva webbplatsrobotar för att extrahera all information du behöver.
  • Chrome Developer Console (eller Firefox Firebug-verktyg) hjälper till att lokalisera elementlokaler för att extrahera.
  • Pythons avkastning uttalande hjälper till att extrahera upprepade dataelement.

Har du några specifika projekt i åtanke för skrapning av webbsidor? Och vilka problem har du haft för att försöka få det att gå? Vänligen meddela oss i kommentarerna nedan.

Bildkrediter: dxinerz / Depositphotos | Lulzmango / Wikimedia Commons

Utforska mer om: Programmering, Python, Verktyg för webbansvariga.