使用scrapy跟踪分页链接不起作用

ev7lccsx  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(186)

我试图刮这个网站https://www.pararius.com/english获得租赁信息。我想刮这个网站上的所有页面。
我在stackoverflow上查看过类似的问题,但似乎没有一个能反映我的问题。
我的代码中的所有东西都能正常工作,除了我想跟随“next_page”链接的部分。我已经用完全相同的概念为另一个图书网站编写了另一个蜘蛛,它工作得很完美。我无法将next_page链接加入到起始网址,并让scrapy自动抓取下一页。
下面是我的代码:

import scrapy

from time import sleep

class ParariusScraper(scrapy.Spider):
    name = 'pararius'
    start_urls = ['https://www.pararius.com/apartments/amsterdam/']
    def parse(self, response):
        base_url = 'https://www.pararius.com/apartments/amsterdam'
        for section in response.css('section.listing-search-item'):
            yield {
                'Title': section.css('h2.listing-search-item__title > a::text').get().strip(),
                'Location': section.css('div.listing-search-item__sub-title::text').get().strip(),
                'Price': section.css('div.listing-search-item__price::text').get().strip(),
                'Size': section.css('li.illustrated-features__item::text').get().strip(),
                'Link':f"{base_url}{section.css('h2.listing-search-item__title a').attrib['href']}"
            }
            sleep(1)
            next_page = response.css('li.pagination__item a').attrib['href'].split('/')[-1]
            print(next_page)
            if next_page:
                yield response.follow(next_page, self.parse)

当我运行这段代码的时候,我疯狂地认为我的代码只抓取了第二页的结果,甚至没有抓取第一页,也就是我代码中看到的start_url。
我想知道我如何能解决这个问题,并有我的代码开始工作的预期。谢谢,我希望得到你的支持。

zy1mlcev

zy1mlcev1#

以下代码的分页不会引发任何异常

import scrapy

class ParariusScraper(scrapy.Spider):
    name = 'pararius'
    start_urls = ['https://www.pararius.com/apartments/amsterdam/']
    def parse(self, response):
        for section in response.css('section.listing-search-item'):
            yield {
                'Title': section.css('h2.listing-search-item__title > a::text').get().strip(),
                'Location': section.css('div.listing-search-item__sub-title::text').get().strip(),
                'Price': section.css('div.listing-search-item__price::text').get().strip(),
                'Size': section.css('li.illustrated-features__item::text').get().strip(),
                'Link':f"{self.start_urls[0]}{section.css('h2.listing-search-item__title a').attrib['href']}"
            }
        next_page = response.css('a:contains(Next)::attr(href)').get()
        if next_page:
            yield response.follow(next_page, callback=self.parse)
uxh89sit

uxh89sit2#

我使用下面的例子成功地让它工作起来。下一页的css选择器有一个问题,使用response.urljoin()进行相对链接比自己做所有的解析要容易得多。你还需要把下一页的请求放在for循环之外,否则你将为循环的每个迭代发送相同的请求。

import scrapy

class ParariusScraper(scrapy.Spider):
    name = 'pararius'
    start_urls = ['https://www.pararius.com/apartments/amsterdam/']
    def parse(self, response):
        for section in response.css('section.listing-search-item'):
            yield {
                'Title': section.css('h2.listing-search-item__title > a::text').get().strip(),
                'Location': section.css('div.listing-search-item__sub-title::text').get().strip(),
                'Price': section.css('div.listing-search-item__price::text').get().strip(),
                'Size': section.css('li.illustrated-features__item::text').get().strip(),
                'Link':f"{self.start_urls[0]}{section.css('h2.listing-search-item__title a').attrib['href']}"
            }
        next_page = response.css('.pagination__link.pagination__link--next')
        if next_page:
            yield response.follow(next_page.attrib['href'])

相关问题