2016-09-29 3 views
0

Ich probiere die scrapy CrawlSpider Unterklasse zum ersten Mal aus. Ich habe die folgende Spinne stark von dem docs Beispiel bei https://doc.scrapy.org/en/latest/topics/spiders.html#crawlspider-example basierend erstellt:Einstellregeln mit scrapy crawlspider

class Test_Spider(CrawlSpider): 

    name = "test" 

    allowed_domains = ['http://www.dragonflieswellness.com'] 
    start_urls = ['http://www.dragonflieswellness.com/wp-content/uploads/2015/09/'] 

    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='.jpg'), callback='parse_item'), 
    ) 

    def parse_item(self, response): 
     self.logger.info('Hi, this is an item page! %s', response.url) 
     print(response.url) 

Ich versuche, die Spinne zu Loop-Start am prescibed Verzeichnis zu bekommen und dann extrahieren Sie alle ‚.jpg‘ Links in dem Verzeichnis, aber ich sehe:

2016-09-29 13:07:35 [scrapy] INFO: Spider opened 
2016-09-29 13:07:35 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2016-09-29 13:07:35 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2016-09-29 13:07:36 [scrapy] DEBUG: Crawled (200) <GET http://www.dragonflieswellness.com/wp-content/uploads/2015/09/> (referer: None) 
2016-09-29 13:07:36 [scrapy] INFO: Closing spider (finished) 

Wie kann ich das funktioniert?

Antwort

1

Der Zweck der Verwendung von Regeln besteht zunächst darin, nicht nur Verknüpfungen zu extrahieren, sondern vor allem, ihnen zu folgen. Wenn Sie nur Links extrahieren (und sie beispielsweise für später speichern möchten), müssen Sie keine Spider-Regeln angeben. Wenn Sie andererseits die Bilder herunterladen möchten, verwenden Sie eine pipeline.

Das heißt, der Grund, warum die Spinne die Links nicht folgen bei der Umsetzung der LinkExtractor verborgen ist:

# common file extensions that are not followed if they occur in links 
IGNORED_EXTENSIONS = [ 
    # images 
    'mng', 'pct', 'bmp', 'gif', 'jpg', 'jpeg', 'png', 'pst', 'psp', 'tif', 
    'tiff', 'ai', 'drw', 'dxf', 'eps', 'ps', 'svg', 

    # audio 
    'mp3', 'wma', 'ogg', 'wav', 'ra', 'aac', 'mid', 'au', 'aiff', 

    # video 
    '3gp', 'asf', 'asx', 'avi', 'mov', 'mp4', 'mpg', 'qt', 'rm', 'swf', 'wmv', 
'm4a', 

    # office suites 
    'xls', 'xlsx', 'ppt', 'pptx', 'pps', 'doc', 'docx', 'odt', 'ods', 'odg', 
'odp', 

    # other 
    'css', 'pdf', 'exe', 'bin', 'rss', 'zip', 'rar', 
] 

EDIT:

Um Bilder zum Download in diesem Beispiel mit ImagesPipeline:

Fügen Sie diese auf Einstellungen:

ITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1} 

IMAGES_STORE = '/home/user/some_directory' # use a correct path 

Erstellen Sie ein neues Element:

class MyImageItem(Item): 
    images = Field() 
    image_urls = Field() 

Ändern Sie bitte Ihre Spinne (ein Parse-Methode hinzufügen):

def parse(self, response): 
     loader = ItemLoader(item=MyImageItem(), response=response) 
     img_paths = response.xpath('//a[substring(@href, string-length(@href)-3)=".jpg"]/@href').extract() 
     loader.add_value('image_urls', [self.start_urls[0] + img_path for img_path in img_paths]) 
     return loader.load_item() 

XPath sucht nach allen hrefs, die mit ".jpg" zu beenden und dem Extrakt() -Methode erstellt eine Liste davon.

Ein Loader ist eine zusätzliche Funktion, die das Erstellen von Objekten vereinfacht, aber ohne sie auskommen könnte.

Beachten Sie, dass ich kein Experte bin und es könnte eine bessere, elegantere Lösung geben. Dieser funktioniert jedoch gut.

+0

Danke, das hilft, aber ich versuche immer noch zu verstehen, wie das funktioniert. Ich möchte die JPG-Dateien in diesem Fall herunterladen, also könnte ich nach einem Beispiel fragen, einschließlich der Pipeline-Funktion? – user61629

+0

Überprüfen Sie meine bearbeitete Antwort. – mihal277

+0

Danke, dass du dir die Zeit genommen hast. Ich bin daran interessiert, verschiedene Ansätze zu sehen, die Menschen nehmen. – user61629