scrapy 爬虫 返回的 response 没有下一页这个属性。

2018-03-05 17:29:10 +08:00
 data2world

如题。

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

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

print response.body

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

4553 次点击
所在节点    Python
11 条回复
welkinzh
2018-03-05 18:09:17 +08:00
网页源代码里确实没有这个属性,应该是 js 加载的
locoz
2018-03-05 18:18:51 +08:00
那个下一页按钮是 js 加载的,可以用这里的 pageCount 判断
data2world
2018-03-05 18:44:24 +08:00
@locoz maxpage 我倒是能获取到,总的 urls 我也能拼。就是 scrapy 的 yield 是不按顺序返回的,而我需要 1 页爬了,再爬第二页。部分代码是这样的:
```python
max_page = int(response.xpath('//*[@id="bbstopic_set"]/@data-maxpage').extract()[0])

if max_page > 1:
for page_num in range(2, max_page + 1):
next_page_url = 'https://bbs.hupu.com/{}-{}.html'.format(response.meta["short_url"], page_num)
print "****", next_page_url, "****"
yield scrapy.Request(next_page_url, callback=self.parse_content, headers=self.headers,
cookies=self.cookies,
meta={"item": item})
else:
yield item

def parse_content(self, response):
pass
```
flyxl
2018-03-05 19:07:30 +08:00
为什么一定要按页爬呢?是增量爬取还是数据库记录要有序?如果是数据库记录的问题,入库的时候记录一下当前是第几页
data2world
2018-03-05 19:20:46 +08:00
@flyxl 因为我需要爬所有的分页页面爬完之后合并成一个 list,在赋给父 item。但是 yield 是异步的,所以不能以 for 循环的执行次数判断是否爬取完了。
zhijiansha
2018-03-05 19:30:17 +08:00
你可以每一页抓取完了再 yield 下一页,这样就按顺序来了
Zzde
2018-03-05 23:28:01 +08:00
随便点几页规则就出来了

21593789-{page}
locoz
2018-03-05 23:47:12 +08:00
@data2world 你要顺序的就别一次性生成所有页数的 url 啊,每次爬完判断一下有没有下一页,有的话当前页数+1 不就 ok 了😶
data2world
2018-03-06 08:58:02 +08:00
@Zzde。。。。你都没看懂我的问题,
data2world
2018-03-06 08:59:56 +08:00
@locoz js 找不到下一页,而且+1 的话并不是顺序的,因为没有阻塞,他可能回爬取后面的之后,再爬取前面的。
locoz
2018-03-06 09:57:58 +08:00
@data2world 所以说你不要一次性生成所有页的 url 丢进去不就完事了 你没给它丢后面页面的任务它怎么会爬后面的。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/435032

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX