2016-03-24 7 views
0

Code Quelle: http://mherman.org/blog/2012/11/08/recursively-scraping-web-pages-with-scrapy/#rules Ich bin neu in Python und Scrapy. Ich suchte nach rekursiver Spinne und fand das.Crappt Scrapy ALLE Links mit Regeln?

Ich habe ein paar Fragen:

Wie funktioniert die Folge Arbeit? Nimmt es nur href-Links von einer Seite und fügt es in die Anforderungswarteschlange ein?

Welchen Teil der Webseite scrapiert Crawl?

Löscht der folgende Code ALLE Links von einer Webseite?

Können sagen, ich will jede Datei von dieser Website http://downloads.trendnet.com/

den Weg kriechen und downloaden ich wahrscheinlich tun würde es jeden Link auf dieser Website zu kratzen und überprüfen URL Inhaltsheader und herunterladen, wenn es sich um eine Datei handelt. Ist das machbar?

Sorry, wenn es eine schlechte Frage ist ....

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from craigslist_sample.items import CraigslistSampleItem 

class MySpider(CrawlSpider): 
    name = "craigs" 
    allowed_domains = ["sfbay.craigslist.org"] 
    start_urls = ["http://sfbay.craigslist.org/search/npo"] 

    rules = (
     Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True), 
    ) 

    def parse_items(self, response): 
     hxs = HtmlXPathSelector(response) 
     titles = hxs.xpath('//span[@class="pl"]') 
     items = [] 
     for titles in titles: 
      item = CraigslistSampleItem() 
      item["title"] = titles.xpath("a/text()").extract() 
      item["link"] = titles.xpath("a/@href").extract() 
      items.append(item) 
     return(items) 

Antwort

0

Ich denke, RTFM hier wirklich wirklich anwendbar ist, aber man muss eine kurze Antwort geben:

In Bezug auf das Beispiel gegeben

rules = (
     Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True), 
    ) 

Sie fragte, was es kriecht. Es crawlt nur, was Sie unter Regeln einrichten. THat bedeutet, dass Ihr Bot jedes Mal nur die nächste Seite durchsucht. Für jede gefundene Seite gilt: callback = parse_items.

Was parse_items in diesem Fall tut, ist auf Einträge in einer Liste zu prüfen. Sie definieren die Liste über den X-Pfad (wie Sie oben mit titles = hxs.xpath('//span[@class="pl"]') sehen können). Für jeden Eintrag in der Liste (d. H. for titles in titles:) kopiert er den Text und den Link in ein Element. Es gibt dann die Elemente zurück (aka es ist getan).

Parse_items wird für jede Seite ausgeführt, die der Crawler findet, indem er der nächsten Schaltfläche folgt.

Unter Einstellungen können Sie DEPTH_LIMIT=3 einschließen. In diesem Fall crawlspider wird nur 3 tief crawlen.

In Bezug auf die Website, die Sie geschrieben:

Nein, Sie einen crawlspider nicht brauchen, da es keine mehrere Seiten sind. Eine normale Base-Spider ist ausreichend. Ein crawlspider kann jedoch funktionieren und ich werde einige Bits unten zeigen. Setze die Regeln auf restrict_xpath ('// a',) und es folgen alle Links auf der Seite.

Stellen Sie sicher, dass Ihre item.py alle erforderlichen Elemente enthält. Zum Beispiel bezieht sich darunter auf Artikel ["Link"]. Stellen Sie in Ihrer item.py-Datei sicher, dass ein Element mit dem Namen "link (Caps-sensitive)" enthalten ist, also stellen Sie sicher, dass die Zeile - link = Field() - vorhanden ist.

Unter parse_items, tun Sie etwas wie folgt aus:

def parse_items(self, response): 
     list = response.xpath('//a"') 
     items = [] 
     for titles in list: 
      item = [INSERT WHATEVER YOU CALLED YOUR ITEM] 
      item["title"] = titles.xpath("/text()").extract() 
      item["link"] = titles.xpath("/@href").extract() 
      if ".pdf" in item["link"]: 
       SEE COMMENT BELOW 
     return(items) 

Das letzte Bit Sie tun müssen, ist zu überprüfen, wie die Artikel-Pipeline funktioniert. Es verwendet file_urls usw. in Ihrem Artikel.

Verwandte Themen