V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zhkzyth
V2EX  ›  Python

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

  •  
  •   zhkzyth · 2015-03-12 00:04:13 +08:00 · 5187 次点击
    这是一个创建于 3545 天前的主题,其中的信息可能已经有所发展或是发生改变。
    hi,all。因为公司业务问题,需要抓取一批静态网站的内容,要求是文章的图片、段落文字、视频都要原封不动的抓下来。

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

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

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

    但是用数据库去维护图片和文章的关系就没必要了
    gkiwi
        4
    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
        5
    zhkzyth  
    OP
       2015-03-12 10:44:16 +08:00
    @ZOwl 也想过这样做,先把要抓取的html整个解析成一个树,再用深度优先,遍历这棵树,遇到不同类型的节点,就做不同的处理,这样确实能保证顺序。但是不知道具体如何下手.=。=

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

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

    @gkiwi 原来wget也可以这么强大,不过还是选择用scrapy来写,以后扩展也方便点~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   961 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:50 · PVG 04:50 · LAX 12:50 · JFK 15:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.