Hur man bygger en grundläggande webbcrawler för att hämta information från en webbplats

Hur man bygger en grundläggande webbcrawler för att hämta information från en webbplats

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



Att skriva dessa webbcrawling -program ä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 du skapar en webbcrawler med Scrapy.





Installera Scrapy

Skrapigt ä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 är tillgängligt via Pip Installs Python (PIP) -biblioteket, här är en uppdatering hur man installerar PIP på Windows, Mac och Linux .

Att 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ö.

os x kunde inte installeras på din dator
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

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





pip install scrapy

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

scrapy
# prints
Scrapy 1.4.0 - no active project
Usage:
scrapy [options] [args]
Available commands:
bench Run quick benchmark test
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
runspider Run a self-contained spider (without creating a project)
...

Hur man bygger en webbcrawler

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





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

En spindelklass behöver lite information:

  • till namn för att identifiera spindeln
  • till start_urls variabel som innehåller en lista med webbadresser att genomsöka från (Wikipedia -URL: en är exemplet i den här självstudien)
  • till analys () metod som används för att bearbeta webbsidan för att extrahera information
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass

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

scrapy runspider spider1.py
# prints
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
'scrapy.extensions.logstats.LogStats',
...

Stänger av loggning

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

import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)

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

Använda Chrome Inspector

Allt på en webbsida lagras i HTML -element. Elementen är ordnade i Document Object Model (DOM). Att förstå DOM är avgörande för att få ut det mesta av din webbcrawler. En sökrobot söker igenom alla HTML -element på en sida för att hitta information, så det är viktigt att veta hur de är ordnade.

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

  • Navigera till en sida i Chrome
  • Placera musen på det element du vill titta på
  • 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 av element. I det här trädet får du information om ditt skript.

Extrahera titeln

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

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

...
def parse(self, response):
print response.css('h1#firstHeading::text').extract()
...

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

I det här exemplet är elementet h1.firstHeading . Lägger till

::text

till skriptet är det som ger dig textinnehållet i elementet. Slutligen, extrahera() metod returnerar det valda elementet.

Genom att köra detta skript i Scrapy skrivs titeln ut i textform.

[u'Battery (electricity)']

Hitta beskrivningen

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

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

hur spelar jag in ett telefonsamtal på min iphone
div#mw-content-text>div>p

Högerpilen (>) anger en relation mellan förälder och barn mellan elementen.

Den här platsen returnerar alla sid element matchade, vilket inkluderar hela beskrivningen. För att få det första sid element kan du 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 sista 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 all genomsökning är klar.

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

Resultatet är första stycket i texten!

An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is
...

Samlar in JSON -data

Scrapy kan extrahera information i textform, vilket är användbart. Med Scrapy kan du också se data JavaScript Object Notation (JSON). JSON är ett snyggt sätt att organisera information och används ofta i webbutveckling. JSON fungerar ganska bra med Python 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 en avkastningssats. Istä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.

vad ser mina vänner när jag inaktiverar facebook
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

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

scrapy runspider spider3.py -o joe.json

Skriptet kommer nu att skriva ut alla p -element.

[
{'para': 'An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term 'battery' specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]'},
{'para': 'Primary (single-use or 'disposable') batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple
...

Skrapa flera element

Hittills har webbsökaren skrapat titeln och ett slags 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 under en helg. Denna information hämtas från http://www.imdb.com/chart/boxoffice , i en tabell med rader för varje mätvärde.

De analys () metod kan extrahera mer än ett fält från raden. Med hjälp av Chrome -utvecklarverktygen kan du hitta elementen inbäddade i tabellen.

...
def parse(self, response):
for e in response.css('div#boxoffice>table>tbody>tr'):
yield {
'title': ''.join(e.css('td.titleColumn>a::text').extract()).strip(),
'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(),
'image': e.css('td.posterColumn img::attr(src)').extract_first(),
}
...

De bild väljaren anger att img är en ättling till td.posterColumn . För att extrahera rätt attribut, använd uttrycket | _+_ |.

Att köra spindeln returnerar JSON:

::attr(src)

Fler webbskrapor och robotar

Scrapy är ett detaljerat bibliotek som kan göra nästan vilken form av webbgenomsökning som du ber det till. 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 webcrawler eller lär dig mer om grunderna i webbskrapning är den enda gränsen hur mycket du är villig att lära dig.

Om du letar efter fler sätt att bygga sökrobotar eller robotar kan du försöka bygga Twitter och Instagram bots med Python . Python kan bygga några fantastiska saker inom webbutveckling, så det är värt att gå längre än webbsökare när du utforskar detta språk.

Dela med sig Dela med sig Tweet E-post 15 Windows -kommandotolks (CMD) kommandon du måste veta

Kommandotolken är fortfarande ett kraftfullt Windows -verktyg. Här är de mest användbara CMD -kommandon som alla Windows -användare behöver veta.

Läs Nästa
Relaterade ämnen
  • Programmering
  • Verktyg för webbansvariga
  • Programmering
  • Pytonorm
  • Handledning för kodning
  • Webbcrawlers
Om författaren Anthony Grant(40 artiklar publicerade)

Anthony Grant är frilansande skribent som täcker programmering och programvara. Han är en datavetenskap som sysslar med programmering, Excel, programvara och teknik.

Mer från Anthony Grant

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!

Klicka här för att prenumerera