【问题标题】:Scrapy Pagination FailsScrapy分页失败
【发布时间】:2017-01-17 14:33:05
【问题描述】:

你好,这是我第一次发帖,

所以我正在尝试制作一个网络蜘蛛,它将跟随 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中,当我测试按钮是否出现并且条件一切正常时,但是当我启动蜘蛛时它只抓取第一页。

这是我的第一个蜘蛛,提前感谢。

还有错误日志Error Log1Error Log

【问题讨论】:

  • 请分享日志,你得到了什么错误?
  • @eLRuLL 如果你想检查它们,我发布了错误日志
  • @Granitosaurus 你检查了代码吗?

标签: ajax web-scraping scrapy


【解决方案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)

【讨论】:

  • 我又遇到了同样的问题。它只进入第一页。
  • 我仍然有同样的问题。它在你身边运行吗?
  • @Kostas 是的,它对我有用。请参阅我的编辑以了解完整的工作蜘蛛。
  • 好的,它停在第 3 页,所以我猜是因为 ajax 问题?我尝试启用 AJAX Crawl 或设置更高的延迟。不过感谢您的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
相关资源
最近更新 更多