Как настроить Scrapy Spider для запуска на нескольких страницах - без кнопки следующей страницы - PullRequest
2 голосов
/ 28 апреля 2020

Я изо всех сил пытаюсь настроить scrap пробег по нескольким страницам от начала до конца полученных результатов. К сожалению, на сайте нет кнопки «Следующая страница», которая усложняет задачу. Вот результаты веб-сайта https://www.imot.bg/pcgi/imot.cgi?act=3&slink=5fuby1&f1=1.

import scrapy
import logging

class ApartmentsSpider(scrapy.Spider):
    name = 'apartments'
    allowed_domains = ["www.imot.bg"]
    start_urls = ["https://www.imot.bg/pcgi/imot.cgi?act=3&slink=5f8c9v&f1=1"
                , "https://www.imot.bg/pcgi/imot.cgi?act=3&slink=5f8c9v&f1=2"]

    def parse(self, response):
        # apartments = response.xpath("//div[@class='price']/text()").get()
        apartments = response.xpath("//a[@class='lnk1']")
        for apartment in apartments:
            apartment_type = apartment.xpath(".//text()").get()
            apartment_link = apartment.xpath(".//@href").get()

            yield response.follow(url = apartment_link, callback=self.parse_apartment, meta={"apartment_type":apartment_type,
                                                                                            "apartment_link" : apartment_link}) 

    def parse_apartment(self, response):
        apartment_type = response.request.meta["apartment_type"]
        apartment_address = response.xpath("//form/div[2]/span[1]/text()").get()
        apartment_price = response.xpath("//td/div[1]/strong[1]/text()").get()
        apartment_sqm = response.xpath("//ul[@class='imotData']/li[2]/text()").get()
        offered_by = response.xpath("//div/b[1]/text()").get()
        contact = response.xpath("//div[8]/span[1]/span[1]/text()").get()
        apartment_link = response.request.meta["apartment_link"]

        yield {
            "apartment_type" : apartment_type,
            "apartment_address" : apartment_address,
            "apartment_price" : apartment_price,
            "apartment_sqm" : apartment_sqm,
            "apartment_link" : apartment_link,
            "offer" : offered_by,
            "contact" : contact
        }

1 Ответ

0 голосов
/ 29 апреля 2020

Есть еще один способ сделать это. Если вы продолжите нажимать цифры и go, чтобы перейти на следующую страницу, вы можете посмотреть URL-адрес и посмотреть, как он есть. На этом веб-сайте переход к следующему изменению заключается в добавлении +1 к URL-адресу. Я надеюсь, что код имеет больше смысла. Добавьте эти 4 строки в ваш метод разбора. Я использовал номер 26, потому что это последняя страница для списков.

  def parse(self, response):
        # apartments = response.xpath("//div[@class='price']/text()").get()
        apartments = response.xpath("//a[@class='lnk1']")
        for apartment in apartments:
            apartment_type = apartment.xpath(".//text()").get()
            apartment_link = apartment.xpath(".//@href").get()

            yield response.follow(url = apartment_link, callback=self.parse_apartment, meta={"apartment_type":apartment_type,
                                                                                            "apartment_link" : apartment_link})

        next_page = self.base_url + str(self.num)
        if self.num <= 26:
            self.num += 1
            yield response.follow(next_page, callback=self.parse)
...