2016-07-10 10 views
1

Ich versuche, einen Code zu schreiben, um die Website eines britischen Hausbauers zu verschrotten, um eine Liste von Häusern zum Verkauf aufzunehmen.Scrapy Python-Code zur Liste der URLs scheint nicht zu funktionieren, wie erhofft

Ich beginne auf der Seite http://www.persimmonhomes.com/sitemap und ich habe einen Teil des Codes geschrieben alle Entwicklungen die URLs der Housebuilder aufzulisten und dann der zweite Teil des Codes von jedem der Urls Schrottpreise aufzeichnen usw.

Ich weiß, dass der zweite Teil funktioniert und ich weiß, dass der erste Teil alle URLs auflistet. Aber aus irgendeinem Grund scheinen die im ersten Teil aufgeführten URLs den zweiten Teil des Codes nicht auszulösen.

Der Code dieses ersten Teils ist:

def parse(self, response): 
    for href in response.xpath('//*[@class="contacts-item"]/ul/li/a/@href'): 
     url = urlparse.urljoin('http://www.persimmonhomes.com/',href.extract()) 
     yield scrapy.Request(url, callback=self.parse_dir_contents) 

Nun, ich weiß, das die URLs auflistet ich will (wenn ich in der Zeile „URL print“ setzen dann alles, was sie aufgelistet zu bekommen), und ich kann manuell Liste fügen Sie sie dem Code hinzu, um den zweiten Teil zu laufen, alles ok, wenn ich wollte. Obwohl die URLs erstellt werden, scheinen sie den zweiten Teil des Codes nicht zu verwerfen.

und der gesamte Code ist unten:

import scrapy 
import urlparse 

from Persimmon.items import PersimmonItem 

class persimmonSpider(scrapy.Spider): 
    name = "persimmon" 
    allowed_domains = ["http://www.persimmonhomes.com/"] 
    start_urls = [ 
     "http://www.persimmonhomes.com/sitemap",   
    ] 

def parse(self, response): 
    for href in response.xpath('//*[@class="contacts-item"]/ul/li/a/@href'): 
     url = urlparse.urljoin('http://www.persimmonhomes.com/',href.extract()) 
     yield scrapy.Request(url, callback=self.parse_dir_contents) 

def parse_dir_contents(self, response): 
    for sel in response.xpath('//*[@id="aspnetForm"]/div[4]'): 
     item = PersimmonItem() 
     item['name'] = sel.xpath('//*[@id="aspnetForm"]/div[4]/div[1]/div[1]/div/div[2]/span/text()').extract() 
     item['address'] = sel.xpath('//*[@id="XplodePage_ctl12_dsDetailsSnippet_pDetailsContainer"]/div/*[@itemprop="postalCode"]/text()').extract() 
     plotnames = sel.xpath('//div[@class="housetype js-filter-housetype"]/div[@class="housetype__col-2"]/div[@class="housetype__plots"]/div[not(contains(@data-status,"Sold"))]/div[@class="plot__name"]/a/text()').extract() 
     plotnames = [plotname.strip() for plotname in plotnames] 
     plotids = sel.xpath('//div[@class="housetype js-filter-housetype"]/div[@class="housetype__col-2"]/div[@class="housetype__plots"]/div[not(contains(@data-status,"Sold"))]/div[@class="plot__name"]/a/@href').extract() 
     plotids = [plotid.strip() for plotid in plotids] 
     plotprices = sel.xpath('//div[@class="housetype js-filter-housetype"]/div[@class="housetype__col-2"]/div[@class="housetype__plots"]/div[not(contains(@data-status,"Sold"))]/div[@class="plot__price"]/text()').extract() 
     plotprices = [plotprice.strip() for plotprice in plotprices] 
     result = zip(plotnames, plotids, plotprices) 
     for plotname, plotid, plotprices in result: 
      item['plotname'] = plotname 
      item['plotid'] = plotid 
      item['plotprice'] = plotprice 
      yield item 

keine Ansichten, warum der erste Teil des Codes die URLs erzeugt, aber der zweite Teil nicht durchschleift sie?

Antwort

1

Sie müssen nur Ihre allowed_domains Eigenschaft beheben:

allowed_domains = ["persimmonhomes.com"] 

(getestet - für mich gearbeitet).

+0

danke - das hat perfekt funktioniert – nevster