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没有下一页属性怎么办?
网页源代码里确实没有这个属性,应该是 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
核心思路:
- 手动解析:用浏览器的开发者工具(F12)查看“下一页”按钮对应的HTML代码。
- 多种选择器尝试:优先尝试
rel="next"、包含特定文本(如“下一页”)、或具有特定CSS类(如.next)的链接。 - 相对路径处理:
response.follow()会自动处理相对URL,比手动拼接更安全。 - 无明确链接:如果网站是滚动加载或通过JavaScript翻页,就需要分析其API接口,改用
scrapy.Request模拟请求。
总结:自己用选择器把下一页链接抠出来。
maxpage 我倒是能获取到,总的 urls 我也能拼。就是 scrapy 的 yield 是不按顺序返回的,而我需要 1 页爬了,再爬第二页。部分代码是这样的:python<br> max_page = int(response.xpath('//*[id="bbstopic_set"]/data-maxpage').extract()[0])<br><br> if max_page > 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 丢进去不就完事了 你没给它丢后面页面的任务它怎么会爬后面的。。


