如题。
举个例子:这个网站无法返回下一页。 https://bbs.hupu.com/21593789.html
scrapy shell "https://bbs.hupu.com/21593789.html"
print response.body
body中没有next page属性 。什么原因啊?怎么解决?
1
welkinzh 2018-03-05 18:09:17 +08:00
网页源代码里确实没有这个属性,应该是 js 加载的
|
2
locoz 2018-03-05 18:18:51 +08:00
|
3
data2world OP @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 ``` |
4
flyxl 2018-03-05 19:07:30 +08:00 via Android
为什么一定要按页爬呢?是增量爬取还是数据库记录要有序?如果是数据库记录的问题,入库的时候记录一下当前是第几页
|
5
data2world OP @flyxl 因为我需要爬所有的分页页面爬完之后合并成一个 list,在赋给父 item。但是 yield 是异步的,所以不能以 for 循环的执行次数判断是否爬取完了。
|
6
zhijiansha 2018-03-05 19:30:17 +08:00
你可以每一页抓取完了再 yield 下一页,这样就按顺序来了
|
7
Zzde 2018-03-05 23:28:01 +08:00
随便点几页规则就出来了
21593789-{page} |
8
locoz 2018-03-05 23:47:12 +08:00 via Android
@data2world 你要顺序的就别一次性生成所有页数的 url 啊,每次爬完判断一下有没有下一页,有的话当前页数+1 不就 ok 了😶
|
9
data2world OP @Zzde。。。。你都没看懂我的问题,
|
10
data2world OP @locoz js 找不到下一页,而且+1 的话并不是顺序的,因为没有阻塞,他可能回爬取后面的之后,再爬取前面的。
|
11
locoz 2018-03-06 09:57:58 +08:00
@data2world 所以说你不要一次性生成所有页的 url 丢进去不就完事了 你没给它丢后面页面的任务它怎么会爬后面的。。
|