scrapy 如何采集分页数据?

2014-09-24 10:48:35 +08:00
 pc10201
比如这个网页
http://www.cs.com.cn/xwzx/hg/201409/t20140924_4521344.html

正文分成了好几个分页来显示,骗PV可耻啊

我想用scrapy把这个正文合并起来,看文档中没找到合并的办法

就想到一个思路,如果发现有分页,将网页内容合并起来,再用lxml和xpath提取
测试了一下,思路是可行的,我就想问一下,scrapy是否有自带的方法能更优雅的实现这一过程?

核心代码 片断
from lxml import html
import HTMLParser
import requests
import re

def innerHTML(node):
buildString = ''
for child in node:
buildString += html.tostring(child)
return HTMLParser.HTMLParser().unescape(buildString)

encoding = 'gbk'

source=response.body.decode(encoding,'ignore')

p=re.search(r'countPage = (.*?)/',response.body)
if p:
for i in xrange(1,int(p.group(1))):
url='%s_%d.html' %(response.url.replace('.html',''),i)
source =source+ requests.get(url,headers=headers).content.decode(encoding,'ignore')
content=html.fromstring(source).xpath('//div[@class="Dtext z_content"]')
content=innerHTML(content)
10677 次点击
所在节点    Python
7 条回复
aisensiy
2014-09-24 11:08:20 +08:00
我想是不可以的,需要你自己去实现
binux
2014-09-24 11:09:43 +08:00
这段代码和 scrapy 有什么关系。。
pc10201
2014-09-24 11:30:26 +08:00
@binux 我用scrapy获取到第一个网页的response,分页数据用requests来获取~
Melodic
2014-09-24 13:26:04 +08:00
scrapy不需要合并,只需要在第一页抓完之后,返回Request,参数中携带下一页的url和自己的分析函数的回调即可

def parse(self, response):
.
.
.
url = 下一页的url
yield scrapy.Request(url, callback=self.parse)

至于下一页的url是你for循环出来还是自己拼接的,就要具体分析了。
forever139
2014-09-24 13:54:31 +08:00
楼主的意思我懂,你这种做法其实也是可以的,官方是推荐都能通过自己的requests管理,如果有额外的参数,你可以通过request的meta属性来yield给下个request,然后在response中取出来,这样你就可以是一个item.不过你这种情况可能传递的内容比较多,效率比较低。
pc10201
2014-09-26 10:20:27 +08:00
@forever139 亲,能否给一段示例代码或相关网页?我就是不知道怎么将response.body合并~
forever139
2014-09-26 14:08:11 +08:00

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

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

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

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

© 2021 V2EX