2017-06-13 3 views
1

Also ich versuche CrawlSpider und zu verstehen, das folgende Beispiel in der Scrapy Docs zu verwenden: istScrapy - Verständnis CrawlSpider und LinkExtractor

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 

class MySpider(CrawlSpider): 
    name = 'example.com' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://www.example.com'] 

rules = (
    # Extract links matching 'category.php' (but not matching 'subsection.php') 
    # and follow links from them (since no callback means follow=True by default). 
    Rule(LinkExtractor(allow=('category\.php',), deny=('subsection\.php',))), 

    # Extract links matching 'item.php' and parse them with the spider's method parse_item 
    Rule(LinkExtractor(allow=('item\.php',)), callback='parse_item'), 
) 

def parse_item(self, response): 
    self.logger.info('Hi, this is an item page! %s', response.url) 
    item = scrapy.Item() 
    item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)') 
    item['name'] = response.xpath('//td[@id="item_name"]/text()').extract() 
    item['description'] = response.xpath('//td[@id="item_description"]/text()').extract() 
    return item 

Die Beschreibung dann gegeben:

würde Diese Spinne beginnen kriechen die Homepage von example.com, sammelt Kategorie- und Elementverknüpfungen und analysiert diese mit der Methode parse_item. Für jede Item-Antwort werden einige Daten mit XPath aus dem HTML-Code extrahiert, und ein Item wird damit gefüllt.

Ich verstehe, dass für die zweite Regel, extrahiert sie Verbindungen von item.php und extrahiert dann die Informationen, um die parse_item Methode. Was genau ist der Zweck der ersten Regel? Es sagt nur, dass es die Links "sammelt". Was bedeutet das und warum ist es nützlich, wenn sie keine Daten daraus extrahieren?

Antwort

3

CrawlSpider ist sehr nützlich beim Crawlen von Foren, die beispielsweise nach Posts suchen, oder bei der Suche nach Produktseiten nach Online-Shops.

Die Idee ist, dass Sie irgendwie in jede Kategorie gehen müssen, indem Sie nach Links suchen, die den Produkt-/Artikelinformationen entsprechen, die Sie extrahieren möchten. Diese Produktverknüpfungen sind diejenigen, die in der zweiten Regel dieses Beispiels angegeben sind (es gibt diejenigen an, die item.php in der URL haben).

Nun, wie sollte die Spinne Links besuchen, bis sie diejenigen finden, die item.php enthalten? das ist die erste Regel für. Es heißt, jeden Link zu besuchen, der category.php enthält, aber nicht subsection.php, was bedeutet, dass es kein "Objekt" aus diesen Links extrahiert, sondern den Pfad der Spinne definiert, um die echten Objekte zu finden.

Das ist, warum Sie sehen, es enthält keine callback Methode innerhalb der Regel, da es nicht diese Link-Antwort für Sie zu verarbeiten, weil es direkt folgen wird.

+0

Ah, ich sehe ... also würde diese Spinne Daten von Links wie 'example.com/category.php/item.php' extrahieren, aber nicht von irgendwelchen Links wie' example.com/subsection. php/item.php'? – ocean800

+1

Ja, wenn Sie meinen, dass zum Extrahieren von 'example.com/subsection.php/item.php' zuerst die Seite' example.com/subsection.php' aufgerufen werden muss. Nehmen wir an, Sie befinden sich auf 'example.com' (Startseite) und innerhalb dieser Seite hat sie nur zwei Links (innerhalb des Körpers):' example.com/category.php' und 'example.com/subsection.php', und Wenn Sie sie besuchen, finden Sie Produkt-URLs (mit 'item.php'). Dann wird die Spinne nur diejenigen in 'category.php' extrahieren, weil sie' subsection.php' NIE besucht hat. – eLRuLL

+0

Ich sehe ... danke! Wenn es also einen dritten Link gibt, example.com/third.php/item.php, aber ich hatte die gleiche Regel wie oben, würde es diese Links analysieren? Nur verwirrt über das Verhalten, weil 'third.php' weder in' allow =() 'noch' deny =() 'wäre. Müssen Sie alle möglichen zusätzlichen Links manuell ablehnen? – ocean800

Verwandte Themen