Застрял в моем первом проекте Scrapy - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь получить основы 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
...