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))
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. –