Een eenvoudige webcrawler bouwen om informatie van een website te halen

Een eenvoudige webcrawler bouwen om informatie van een website te halen

Programma's die informatie van websites lezen, of webcrawlers, hebben allerlei handige toepassingen. U kunt zoeken naar aandeleninformatie, sportuitslagen, tekst van een Twitter-account of prijzen ophalen van winkelwebsites.





Het schrijven van deze webcrawlprogramma's is eenvoudiger dan u zou denken. Python heeft een geweldige bibliotheek voor het schrijven van scripts die informatie uit websites halen. Laten we eens kijken hoe we een webcrawler kunnen maken met Scrapy.





Scrapy installeren

Scrapy is een Python-bibliotheek die is gemaakt om het web te schrapen en webcrawlers te bouwen. Het is snel, eenvoudig en kan zonder veel moeite door meerdere webpagina's navigeren.





Scrapy is beschikbaar via de Pip Installs Python (PIP)-bibliotheek, hier volgt een opfriscursus hoe PIP te installeren op Windows, Mac en Linux .

Het gebruik van een virtuele Python-omgeving heeft de voorkeur omdat u hiermee Scrapy in een virtuele map kunt installeren die uw systeembestanden met rust laat. Scrapy's documentatie raadt aan om dit te doen om de beste resultaten te krijgen.



Maak een directory en initialiseer een virtuele omgeving.

hoe twee foto's te combineren tot één op iphone
mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

U kunt Scrapy nu in die map installeren met behulp van een PIP-opdracht.





pip install scrapy

Een snelle controle om te controleren of Scrapy correct is geïnstalleerd

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)
...

Een webcrawler bouwen

Nu de omgeving klaar is, kun je beginnen met het bouwen van de webcrawler. Laten we wat informatie van een Wikipedia-pagina over batterijen schrapen: https://en.wikipedia.org/wiki/Battery_(elektriciteit) .





De eerste stap om een ​​crawler te schrijven, is het definiëren van een Python-klasse die zich uitstrekt van Scrapy.Spider . Dit geeft je toegang tot alle functies en features in Scrapy. Laten we deze klas noemen spin1 .

Een spider-klasse heeft een paar stukjes informatie nodig:

  • tot naam voor het identificeren van de spin
  • tot start_urls variabele die een lijst met URL's bevat waaruit moet worden gecrawld (de URL van Wikipedia is het voorbeeld in deze zelfstudie)
  • tot ontleden() methode die wordt gebruikt om de webpagina te verwerken om informatie te extraheren
import scrapy
class spider1(scrapy.Spider):
name = 'Wikipedia'
start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']
def parse(self, response):
pass

Een snelle test om te controleren of alles naar behoren werkt.

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',
...

Logboekregistratie uitschakelen

Als u Scrapy met deze klasse uitvoert, drukt u logboekinformatie af die u nu niet helpt. Laten we het eenvoudig maken door deze overtollige loggegevens te verwijderen. Gebruik een waarschuwing statement door code toe te voegen aan het begin van het bestand.

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

Wanneer u het script nu opnieuw uitvoert, worden de loggegevens niet afgedrukt.

De Chrome Inspector gebruiken

Alles op een webpagina wordt opgeslagen in HTML-elementen. De elementen zijn gerangschikt in het Document Object Model (DOM). Het begrijpen van de DOM is van cruciaal belang om het meeste uit uw webcrawler te halen. Een webcrawler doorzoekt alle HTML-elementen op een pagina om informatie te vinden, dus het is belangrijk om te weten hoe ze zijn gerangschikt.

Google Chrome heeft tools waarmee u HTML-elementen sneller kunt vinden. U kunt de HTML vinden voor elk element dat u op de webpagina ziet met behulp van het infovenster.

  • Navigeer naar een pagina in Chrome
  • Plaats de muis op het element dat u wilt bekijken
  • Klik met de rechtermuisknop en selecteer Inspecteren uit het menu

Met deze stappen wordt de ontwikkelaarsconsole geopend met de elementen tabblad geselecteerd. Onderaan de console ziet u een boom met elementen. Deze boom is hoe u informatie voor uw script krijgt.

De titel extraheren

Laten we het script wat werk voor ons laten doen; Een eenvoudige crawl om de titeltekst van de webpagina te krijgen.

Start het script door wat code toe te voegen aan de ontleden() methode die de titel extraheert.

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

De antwoord argument ondersteunt een methode genaamd CSS() die elementen van de pagina selecteert met behulp van de locatie die u opgeeft.

In dit voorbeeld is het element h1.firstHeading . Toevoegen

::text

naar het script is wat u de tekstinhoud van het element geeft. eindelijk, de extract() methode retourneert het geselecteerde element.

Als u dit script in Scrapy uitvoert, wordt de titel in tekstvorm afgedrukt.

[u'Battery (electricity)']

De beschrijving vinden

Nu we de titeltekst hebben geschraapt, gaan we meer doen met het script. De crawler gaat de eerste alinea na de titel zoeken en deze informatie extraheren.

Dit is de elementstructuur in de Chrome Developer Console:

waarom zeggen sommige sms-berichten afgeleverd en andere niet?
div#mw-content-text>div>p

De rechterpijl (>) geeft een ouder-kindrelatie tussen de elementen aan.

Deze locatie retourneert alle P elementen overeenkomen, die de volledige beschrijving omvat. Om de eerste te krijgen P element kun je deze code schrijven:

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

Net als de titel, voeg je CSS-extractor toe

::text

om de tekstinhoud van het element te krijgen.

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

De laatste uitdrukking gebruikt extract() om de lijst terug te sturen. U kunt de Python . gebruiken meedoen() functie om lid te worden van de lijst zodra al het crawlen is voltooid.

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

Het resultaat is de eerste alinea van de tekst!

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

JSON-gegevens verzamelen

Scrapy kan informatie in tekstvorm extraheren, wat handig is. Met Scrapy kunt u ook de gegevens JavaScript Object Notation (JSON) bekijken. JSON is een handige manier om informatie te ordenen en wordt veel gebruikt bij webontwikkeling. JSON werkt best goed met Python ook.

Wanneer u gegevens als JSON moet verzamelen, kunt u de opbrengst verklaring ingebouwd in Scrapy.

Hier is een nieuwe versie van het script met een rendementsverklaring. In plaats van het eerste p-element in tekstformaat te krijgen, pakt dit alle p-elementen en organiseert het in JSON-formaat.

leuke dingen om te doen met een thuisserver
...
def parse(self, response):
for e in response.css('div#mw-content-text>div>p'):
yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

U kunt de spider nu uitvoeren door een JSON-uitvoerbestand op te geven:

scrapy runspider spider3.py -o joe.json

Het script zal nu alle p-elementen afdrukken.

[
{'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
...

Meerdere elementen schrapen

Tot nu toe heeft de webcrawler de titel en een soort element van de pagina geschraapt. Scrapy kan ook informatie extraheren uit verschillende soorten elementen in één script.

Laten we de beste IMDb Box Office-hits voor een weekend extraheren. Deze informatie is afkomstig van http://www.imdb.com/chart/boxoffice , in een tabel met rijen voor elke statistiek.

De ontleden() methode kan meer dan één veld uit de rij halen. Met behulp van de Chrome Developer Tools kunt u de elementen vinden die in de tabel zijn genest.

...
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 afbeelding selector geeft aan dat: img is een afstammeling van td.posterKolom . Gebruik de uitdrukking |_+_| om het juiste attribuut te extraheren.

Het uitvoeren van de spider retourneert JSON:

::attr(src)

Meer webschrapers en bots

Scrapy is een gedetailleerde bibliotheek die zowat elke vorm van webcrawl kan doen die u erom vraagt. Als het gaat om het vinden van informatie in HTML-elementen, gecombineerd met de ondersteuning van Python, is het moeilijk te verslaan. Of u nu een webcrawler bouwt of leert over de basisprincipes van webscraping, de enige limiet is hoeveel u bereid bent te leren.

Als je op zoek bent naar meer manieren om crawlers of bots te bouwen, kun je proberen: bouw Twitter- en Instagram-bots met Python . Python kan verbazingwekkende dingen bouwen in webontwikkeling, dus het is de moeite waard om verder te gaan dan webcrawlers bij het verkennen van deze taal.

Deel Deel Tweeten E-mail 15 Windows Command Prompt (CMD)-opdrachten die u moet kennen

De opdrachtprompt is nog steeds een krachtige Windows-tool. Hier zijn de handigste CMD-opdrachten die elke Windows-gebruiker moet kennen.

Lees volgende
Gerelateerde onderwerpen
  • Programmeren
  • Webmasterhulpprogramma's
  • Programmeren
  • Python
  • Codeerhandleidingen
  • Webcrawlers
Over de auteur Anthony Grant(40 artikelen gepubliceerd)

Anthony Grant is een freelance schrijver over programmering en software. Hij is een informatica-majoor die zich bezighoudt met programmeren, Excel, software en technologie.

Meer van Anthony Grant

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren