Я пытаюсь получить основы Scrapy, и я читал некоторые учебные пособия.
Я пытаюсь собрать данные с https://www.immobiliare.it, итальянского веб-сайта о жилье. Я хотел бы перейти на домашнюю страницу (начальный URL) и оттуда сканировать веб-сайт, следуя странице
hompage -> провинция / город -> объявление -> уведомление о доме
Я придумал этот код, но он не работает, и я не понимаю, почему. Если я отлаживаю отдельные фрагменты кода, они работают правильно, но в целом паук не даст никаких результатов, так как останавливается на домашней странице. Может кто-нибудь намекнуть мне, где ошибка? Спасибо.
# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from immobiliare.items import ImmobiliareItem
class ScrimmoSpider(CrawlSpider):
name = 'scrimmo'
allowed_domains = ['www.immobiliare.it']
start_urls = ["https://www.immobiliare.it/"]
rules = (
Rule(LinkExtractor(allow=(), restrict_css=('#listing-pagination > ul.pull-right.pagination > li:nth-child(1) > a',)),
callback="parse_item",
follow=True),
)
def parse_homepage(self, response):
loc_links = response.css('.home-city-search__city--residenziale > a::attr(href)').extract()
for loc in loc_links:
yield scrapy.Request(loc, callback=self.parse_comuni)
self.log('\tProcessing location URL: ' + response.url)
def parse_comuni(self, response):
comuni_links = response.css('.comuni__comune-name::attr(href)').extract()
for comune in comuni_links:
yield scrapy.Request(comune, callback=self.parse_item)
print('\nProcessing comune URL: ' + response.url)
def parse_item(self, response):
item_links = response.css('.text-primary >a::attr(href)').extract()
for a in item_links:
yield scrapy.Request(a, callback=self.parse_detail_page)
print('\nProcessing... ' + response.url)
next_page_url = response.css('#listing-pagination > ul.pull-right.pagination > li:nth-child(1) > a')
next_page_url = response.urljoin(next_page_url)
def parse_detail_page(self, response):
localita = response.css('h1::text').extract()[0].split(",")[-1].strip()
prezzo = response.css('.features__price > span::text').extract()[0].strip("€").strip().replace(".","")
numero_locali = response.css('.features__list > li > div > span ::text').extract()[0].split(",")[0].replace(u'\xa0', u' ').strip()
superficie = response.css('.features__list > li > div > span ::text').extract()[1]
item = ImmobiliareItem()
item['localita'] = localita
item['prezzo'] = prezzo
item['numero_locali'] = numero_locali
item['superficie'] = superficie
yield item