刮擦分页失败



你好,这是我的第一篇文章,

所以我正在尝试制作一个网络蜘蛛,它将按照 invia.cz 中的链接并从酒店复制所有标题。

import scrapy

y=0
class invia(scrapy.Spider):
    name = 'Kreta'
    start_urls = ['https://dovolena.invia.cz/?d_start_from=13.01.2017&sort=nl_sell&page=1']
    def parse(self, response):
        for x in range (1, 9):
            yield {
             'titles':response.css("#main > div > div > div > div.col.col-content > div.product-list > div > ul > li:nth-child(%d)>div.head>h2>a>span.name::text"%(x)).extract() ,
             }
        if (response.css('#main > div > div > div > div.col.col-content >   
                            div.product-list > div > p > 
                            a.next').extract_first()):
         y=y+1
         go = ["https://dovolena.invia.cz/d_start_from=13.01.2017&sort=nl_sell&page=%d" % y] 
         print go
         yield scrapy.Request(
                response.urljoin(go),
                callback=self.parse
         )

在这个网站中,页面使用 AJAX 加载,所以我手动更改 URL 的值,仅当页面中出现下一个按钮时才递增 1。

当我

测试按钮是否出现并且条件一切良好时,在刮擦的外壳中,但是当我启动蜘蛛时,它只会爬行第一页。

这是我的第一只蜘蛛,所以提前感谢。

还有 errol

日志错误日志 1 错误日志

您对"全局"y变量的使用不仅很奇怪,而且也不起作用

你正在使用y来计算调用 parse 的次数。理想情况下,您不想访问函数范围之外的任何内容,因此您可以使用 request.meta 属性来实现相同的目的:

def parse(self, response):
    y = response.meta.get('index', 1)  # default is page 1
    y += 1
    # ...
    #next page 
    url = 'http://example.com/?p={}'.format(y)
    yield Request(url, self.parse, meta={'index':y})

关于您的分页问题,您的下一页 url css 选择器不正确,因为您选择的<a>节点没有附加绝对的 href,这个问题也使您的y问题过时。要解决此问题,请尝试:

def parse(self, response):
    next_page = response.css("a.next::attr(data-page)").extract_first()
    # replace "page=1" part of the url with next number
    url = re.sub('page=d+', 'page=' + next_page, response.url)
    yield Request(url, self.parse, meta={'index':y})

编辑:这是整个工作蜘蛛:

import scrapy
import re

class InviaSpider(scrapy.Spider):
    name = 'invia'
    start_urls = ['https://dovolena.invia.cz/?d_start_from=13.01.2017&sort=nl_sell&page=1']
    def parse(self, response):
        names = response.css('span.name::text').extract()
        for name in names:
            yield {'name': name}
        # next page
        next_page = response.css("a.next::attr(data-page)").extract_first()
        url = re.sub('page=d+', 'page=' + next_page, response.url)
        yield scrapy.Request(url, self.parse)

最新更新