用 scrapy,怎么保证抓取的内容顺序不变?

2015-03-12 00:04:13 +08:00
 zhkzyth
hi,all。因为公司业务问题,需要抓取一批静态网站的内容,要求是文章的图片、段落文字、视频都要原封不动的抓下来。

我看了下scrapy的selector,xpath和css好像都是按照元素类型来进行内容的筛选的,没办法表现每个元素之间的位置关系。比如我用`selector.css(p::text).extract()`抓取出来的是一个文字的list结构,通过`selector.css(img).xpath('@src').extract()`是能抓取所有的图片,但这两个列表的元素之间顺序关系,我无法确认。

不知道大家在爬网站的时候,是怎么做到保证原文内容顺序的呢?
5186 次点击
所在节点    Python
5 条回复
ZOwl
2015-03-12 00:14:18 +08:00
抓取父节点,再遍历不行吗
ljcarsenal
2015-03-12 00:15:57 +08:00
BeautifulSoup
pyquery
ericls
2015-03-12 00:20:50 +08:00
简单粗暴的办法
每探测到一个图片 就保存 并且在tree中替换为本地地址
再获取文字内容…

遍历nth-of-type也是可以的

但是用数据库去维护图片和文章的关系就没必要了
gkiwi
2015-03-12 00:40:13 +08:00
如果网站不太大,而且是静态网站的话,参考这个:
=============================================
wget -c -r -np -k -p http://vuejs.org/api/

其中
-c:继续下载已下载了一部份的档案
-r:表示循环下载
-np:不进入上层的目录(也就不会下载其他网站的js等等)
-k:将下载后的 HTML 的链结转换為本地档案(so smart)
-p:下载所有显示网页所需的档案,例如图片等
另外几个常用的参数:
-A jpg,png,gif 如此仅仅下载后缀为jpg,png,gif的文件
-I /static,/content 只下载/static,/content路径下的文件
-e robots=off 因为有时候robot有disallow规则,让你不能爬某些文件夹/文件,显然你可以忽略它!

再举个栗子:
wget -A png,jpg,gif,jpeg -I /static -e robots=off -c -r -np -k -p http://www.gzxzwk.cn/
=============================================END
当然具体还得看需求啦~~
我经常用它来扒拉文档做离线用~~
zhkzyth
2015-03-12 10:44:16 +08:00
@ZOwl 也想过这样做,先把要抓取的html整个解析成一个树,再用深度优先,遍历这棵树,遇到不同类型的节点,就做不同的处理,这样确实能保证顺序。但是不知道具体如何下手.=。=

@ljcarsenal pyquery没用过,我去了解下....

@ericls 是个好方法,哈哈~~

@gkiwi 原来wget也可以这么强大,不过还是选择用scrapy来写,以后扩展也方便点~~

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

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

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

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

© 2021 V2EX