Python中Scrapy爬虫返回的response没有下一页属性怎么办?

如题。

举个例子:这个网站无法返回下一页。 https://bbs.hupu.com/21593789.html

scrapy shell "https://bbs.hupu.com/21593789.html"

print response.body

body中没有next page属性 。什么原因啊?怎么解决?


Python中Scrapy爬虫返回的response没有下一页属性怎么办?

11 回复

网页源代码里确实没有这个属性,应该是 js 加载的


这种情况通常是因为目标网站的翻页逻辑不是通过response的某个属性直接暴露的。你需要自己分析网页结构来提取下一页的URL。

最常见的方法是检查分页区域的HTML。比如,很多网站会有一个“下一页”的链接,或者用rel="next"属性标识。你可以用XPath或CSS选择器来定位它。

这里给你一个典型的处理示例:

import scrapy

class MySpider(scrapy.Spider):
    name = 'example'
    start_urls = ['http://example.com/page1']

    def parse(self, response):
        # 1. 先抓取当前页你需要的数据
        for item in response.css('div.product'):
            yield {
                'title': item.css('h2::text').get(),
                # ... 其他字段
            }

        # 2. 关键:寻找并跟进下一页链接
        # 方法A: 通过CSS选择器找包含"下一页"文本的链接
        next_page = response.css('a:contains("下一页")::attr(href)').get()
        # 方法B: 找带有next类或id的链接 (常见模式)
        # next_page = response.css('a.next::attr(href)').get()
        # 方法C: 使用XPath寻找rel="next"的链接 (语义化更好)
        # next_page = response.xpath('//link[@rel="next"]/@href').get()

        if next_page:
            # 构建绝对URL并请求下一页
            yield response.follow(next_page, callback=self.parse)
        # 如果网站是POST请求或需要表单,可能需要使用scrapy.FormRequest

核心思路:

  1. 手动解析:用浏览器的开发者工具(F12)查看“下一页”按钮对应的HTML代码。
  2. 多种选择器尝试:优先尝试rel="next"、包含特定文本(如“下一页”)、或具有特定CSS类(如.next)的链接。
  3. 相对路径处理response.follow()会自动处理相对URL,比手动拼接更安全。
  4. 无明确链接:如果网站是滚动加载或通过JavaScript翻页,就需要分析其API接口,改用scrapy.Request模拟请求。

总结:自己用选择器把下一页链接抠出来。

那个下一页按钮是 js 加载的,可以用这里的 pageCount 判断

maxpage 我倒是能获取到,总的 urls 我也能拼。就是 scrapy 的 yield 是不按顺序返回的,而我需要 1 页爬了,再爬第二页。部分代码是这样的:
python<br> max_page = int(response.xpath('//*[id="bbstopic_set"]/data-maxpage').extract()[0])<br><br> if max_page &gt; 1:<br> for page_num in range(2, max_page + 1):<br> next_page_url = '<a target="_blank" href="https://bbs.hupu.com/" rel="nofollow noopener">https://bbs.hupu.com/</a>{}-{}.html'.format(response.meta["short_url"], page_num)<br> print "****", next_page_url, "****"<br> yield scrapy.Request(next_page_url, callback=self.parse_content, headers=self.headers,<br> cookies=self.cookies,<br> meta={"item": item})<br> else:<br> yield item<br><br>def parse_content(self, response):<br> pass<br>

为什么一定要按页爬呢?是增量爬取还是数据库记录要有序?如果是数据库记录的问题,入库的时候记录一下当前是第几页

因为我需要爬所有的分页页面爬完之后合并成一个 list,在赋给父 item。但是 yield 是异步的,所以不能以 for 循环的执行次数判断是否爬取完了。

你可以每一页抓取完了再 yield 下一页,这样就按顺序来了

随便点几页规则就出来了

21593789-{page}

你要顺序的就别一次性生成所有页数的 url 啊,每次爬完判断一下有没有下一页,有的话当前页数+1 不就 ok 了😶

js 找不到下一页,而且+1 的话并不是顺序的,因为没有阻塞,他可能回爬取后面的之后,再爬取前面的。

所以说你不要一次性生成所有页的 url 丢进去不就完事了 你没给它丢后面页面的任务它怎么会爬后面的。。

回到顶部