2016-07-18 13 views
-1

Ich versuche, meine Spinne über eine Liste zu gehen und alle URLs zu kratzen, die sie finden können, nachdem sie einige Daten gekratzt haben, und zurück zum nächsten ungeschnittenen Link, wenn ich die Spinne laufen lasse kann sehen, dass es auf die Startseite zurückkehrt, aber versucht die gleiche Seite erneut zu scrappen und beendet danach alle Codevorschläge, die für Python ziemlich neu sind.Scrapy Python Schleife zum nächsten unbeschriebenen Link

import scrapy 
import re 
from production.items import ProductionItem, ListResidentialItem 

class productionSpider(scrapy.Spider): 
    name = "production" 
    allowed_domains = ["domain.com"] 
    start_urls = [ 
     "http://domain.com/list" 
    ] 

    def parse(self, response): 
     for sel in response.xpath('//html/body'): 
      item = ProductionItem() 
      item['listurl'] = sel.xpath('//a[@id="link101"]/@href').extract()[0] 

      request = scrapy.Request(item['listurl'], callback=self.parseBasicListingInfo) 
      yield request 

    def parseBasicListingInfo(item, response): 
     item = ListResidentialItem() 
     item['title'] = response.xpath('//span[@class="detail"]/text()').extract() 
     return item 

zu klären: i vorbei bin [0] so dauert es nur das erste Glied der Liste , aber ich will es mit dem nächsten ungeschälter Link

ausgegeben, nachdem die Spinne weiterzulaufen:

2016-07-18 12:11:20 [scrapy] DEBUG: Crawled (200) <GET http://www.domain.com/robots.txt> (referer: None) 
2016-07-18 12:11:20 [scrapy] DEBUG: Crawled (200) <GET http://www.domain.com/list> (referer: None) 
2016-07-18 12:11:21 [scrapy] DEBUG: Crawled (200) <GET http://www.domain.com/link1> (referer: http://www.domain.com/list) 
2016-07-18 12:11:21 [scrapy] DEBUG: Scraped from <200 http://www.domain.com/link1> 
{'title': [u'\rlink1\r']} 

Antwort

1

Dies sollte gut funktionieren. Ändern Sie die Domäne und XPath und sehen

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

    class ProdItems(scrapy.Item): 
     listurl = scrapy.Field() 
     title = scrapy.Field() 

    class productionSpider(scrapy.Spider): 
     name = "production" 
     allowed_domains = ["domain.com"] 
     start_urls = [ 
      "http://domain.com/list" 
     ] 

     def parse(self, response): 
      for sel in response.xpath('//html/body'): 
       item = ProductionItem() 
       list_urls = sel.xpath('//a[@id="link101"]/@href').extract() 
       for url in list_urls: 
        item['listurl'] = url 
        yield scrapy.Request(url, callback=self.parseBasicListingInfo, meta={'item': item}) 

     def parseBasicListingInfo(item, response): 
      item = response.request.meta['item'] 
      item['title'] = response.xpath('//span[@class="detail"]/text()').extract() 
      yield item 
+0

der Code ausgeführt, aber so meins das Problem des Schleifens über die geschabten Links bleibt immer noch – user1443063

+0

@ user1443063 'http: // domain.com/list' gibt mir 404 ist dies die Seite, die Sie versuchen zu kratzen? –

+0

oh nein, das ist nicht die genaue Website Ich habe die meisten der persönlichen Scraping-Informationen geändert, ich schaue nur, wie man über alle Links, die es findet – user1443063

1

Das ist die Linie, die Ihr Problem verursacht:

item['listurl'] = sel.xpath('//a[@id="link101"]/@href').extract()[0] 

Die „//“ bedeutet „vom Anfang des Dokuments“, was bedeutet, dass es scannt aus das allererste Tag und findet immer den gleichen ersten Link. Was Sie tun müssen, ist die Suche relativ zum Anfang des aktuellen Tags mit ".//", was "ab diesem Tag" bedeutet. Auch Ihre aktuelle for-Schleife besucht jedes Tag im Dokument, das nicht benötigt wird. Versuchen Sie folgendes:

def parse(self, response): 
    for href in response.xpath('//a[@id="link101"]/@href').extract(): 
     item = ProductionItem() 
     item['listurl'] = href 

     yield scrapy.Request(href,callback=self.parseBasicListingInfo, meta={'item': item}) 

XPath zieht die hrefs aus den Links und gibt sie als Liste, die Sie durchlaufen können.

+0

Also habe ich versucht, das Code-Beispiel, das Sie gaben und versucht zu übergeben: response.xpath ('// a [@ id = "link101"]/@ href'). Extract(): sowie response.xpath (' .// a [@ id = "link101"]/@ href '). extract(): aber es gibt immernoch nur den ersten gefundenen Link aus – user1443063

+0

Haben Sie versucht, scrapy mit --loglevel = DEBUG zu starten? Das sollte jede URL anzeigen, die von dem Anforderungsanruf in Warteschlange gestellt wird. Versuchen Sie auch den xpath mit etwas wie Firebug für Firefox. Probieren Sie auch "scrapy shell". Und wie @Nikhil Parmar darauf hinweist domain.com/list bekommt einen 404 Fehler. – Steve

+0

hinzugefügt die Konsolenausgabe, die es nur nach dem ersten Link zum Stillstand kommt – user1443063

Verwandte Themen