Scrapy Pagination失败

时间:2017-01-17 14:33:05

标签: ajax web-scraping scrapy

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

所以我想创建一个Web蜘蛛,它将跟随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。

在scrapy shell中,当我测试按钮是否出现以及条件一切正常但是当我启动蜘蛛时它只抓取第一页。

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

也是errol日志Error Log1 Error Log

1 个答案:

答案 0 :(得分:1)

您对“全局”y变量的使用不仅特殊,而且无法正常使用

您正在使用y来计算调用解析的次数。理想情况下,您不希望访问函数范围之外的任何内容,因此使用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)