2016-07-14 26 views
0

Ich versuche Scrapy zu lernen, indem ich den Titel der Einträge auf einer Immobilienwebsite mit Paginierung abruft. Ich kann die Einträge von den in der Liste rules definierten Seiten 'Weiter' nicht abrufen.Problem beim Versuch, paginierte Links mit Scrapy zu bereinigen

Code:

from scrapy import Spider 
from scrapy.selector import Selector 
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import Rule, CrawlSpider 
from property.items import PropertyItem 
import re 

class VivastreetSpider(CrawlSpider): 
    name = 'viva' 
    allowed_domains = ['http://chennai.vivastreet.co.in/'] 
    start_urls = ['http://chennai.vivastreet.co.in/rent+chennai/'] 
    rules = [ 
     Rule(LinkExtractor(restrict_xpaths = ('//*[text()[contains(., "Next")]]')), callback = 'parse_item', follow = True) 
     ] 

    def parse_item(self, response): 
     a = Selector(response).xpath('//a[contains(@id, "vs-detail-link")]/text()').extract() 
     i = 1 
     for b in a: 
      print('testtttttttttttttt ' + str(i) + '\n' + str(b)) 
      i += 1 
     item = PropertyItem() 
     item['title'] = a[0] 
     yield item 

Bearbeiten- ersetzt Parse-Methode mit parse_item und kann jetzt nichts kratzen.

Ignorieren Sie den Objektcode am Ende, ich beabsichtige, es durch einen Rückruf zu einer anderen Methode zu ersetzen, die mehr Details von der URL jedes Eintrags abruft.

Ich werde das Protokoll bei Bedarf veröffentlichen.

Edit # 2- Ich habe die URLs von den paginierten Seiten abgerufen und dann eine Anfrage an eine andere Methode, die schließlich Details von jeder Seite des Eintrags holt. Die parse_start_url() Methode funktioniert, aber die parse_item method() wird nicht aufgerufen.

Code:

from scrapy import Request 
from scrapy.selector import Selector 
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import Rule, CrawlSpider 
from property.items import PropertyItem 
import sys 

reload(sys) 
sys.setdefaultencoding('utf8') #To prevent UnicodeDecodeError, UnicodeEncodeError. 

class VivastreetSpider(CrawlSpider): 
    name = 'viva' 
    allowed_domains = ['chennai.vivastreet.co.in'] 
    start_urls = ['http://chennai.vivastreet.co.in/rent+chennai/'] 
    rules = [ 
     Rule(LinkExtractor(restrict_xpaths = '//*[text()[contains(., "Next")]]'), callback = 'parse_start_url', follow = True) 
     ] 

    def parse_start_url(self, response): 
     urls = Selector(response).xpath('//a[contains(@id, "vs-detail-link")][@href]').extract()  
     print('test0000000000000000000' + str(urls[0])) 
     for url in urls: 
      yield Request(url = url, callback = self.parse_item) 

    def parse_item(self, response): 
     #item = PropertyItem() 
     a = Selector(response).xpath('//*h1[@class = "kiwii-font-xlarge kiwii-margin-none"').extract() 
     print('test tttttttttttttttttt ' + str(a)) 

Antwort

0

Es gibt nur wenige Dinge, die mit Ihrer Spinne falsch sind.

  1. Ihre allowed_domains gebrochen ist, wenn Sie Ihre Spinne überprüfen Sie wahrscheinlich eine Menge herausgefiltert Anfragen bekommen.

  2. Sie missverstehen CrawlSpider ein bisschen hier. Zuerst, wenn CrawlSpider startet, lädt es jede URL in start_urls und ruft parse_start_url.

So sollte Ihre Spinne in etwa so aussehen:

class VivastreetSpider(CrawlSpider): 
    name = 'test' 
    allowed_domains = ['chennai.vivastreet.co.in'] 
    start_urls = ['http://chennai.vivastreet.co.in/rent+chennai/'] 
    rules = [ 
    Rule(
     LinkExtractor(
     restrict_xpaths='//*[text()[contains(., "Next")]]'), 
     callback='parse_start_url' 
    ) 
    ] 

    def parse_start_url(self, response): 
     a = Selector(response).xpath('//a[contains(@id, "vs-detail-link")]/text()').extract() 
     return {'test': len(a)} 
+0

Vielen Dank für Ihre Hilfe. Ich habe diesen Teil funktioniert, aber ich rufe eine andere Methode auf, um Details von URLs zu lesen, die von dieser Seite abgerufen werden, was nicht zu funktionieren scheint. Was mache ich falsch? Bearbeitete die Frage. –