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
hippoboy
V2EX  ›  Python

请问使用 scrapy 的优势是什么?直接用 requests 不是很简单?

  •  1
     
  •   hippoboy · 2016-09-18 11:08:27 +08:00 · 23425 次点击
    这是一个创建于 2989 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从接触爬虫开始就一直使用 requests,每每和身边人说起来,得到的回答都是 requests 更好用,没必要使用 scrapy

    但是看了好多公司的招聘,上面还是有要求使用 scrapy,我觉得这个 scrapy 肯定有它的过人之处?

    求教各位朋友,能否让我豁然开朗一下?

    第 1 条附言  ·  2016-09-18 12:01:28 +08:00
    求个 scrapy 的例子在 github 上,我来学习下可好?
    58 条回复    2018-02-28 11:54:43 +08:00
    leavic
        1
    leavic  
       2016-09-18 11:12:01 +08:00   ❤️ 4
    你身边的人都是菜鸟, requests 是 polling 方式的,会被网络阻塞,你用 requests 去爬个 10 万个 item 的项目试试看。
    chy373180
        2
    chy373180  
       2016-09-18 11:18:55 +08:00   ❤️ 1
    scapy 底层是异步框架 twisted ,并发是最大优势
    9hills
        3
    9hills  
       2016-09-18 11:26:04 +08:00   ❤️ 1
    requests 和 scrapy 就是两个不同的东西,没有可比性

    scrapy 也能用 requests 去抓页面
    requests 也有异步版本
    prefere
        4
    prefere  
       2016-09-18 11:27:12 +08:00
    还是要看应用场景吧,后者可以让你少写些代码。
    prefere
        5
    prefere  
       2016-09-18 11:28:07 +08:00
    更正:后者 改为 Scrapy 。
    menc
        6
    menc  
       2016-09-18 11:30:00 +08:00
    requests 是一个 lib ,
    Scrapy 是一个框架。

    你要 log ,你要并发,你要存储,你要监控,后者都能做,前者不能做,要自己写代码。
    whwq2012
        7
    whwq2012  
       2016-09-18 12:15:51 +08:00 via Android
    我也觉得要看应用场景,比如你爬 bilibili 的视频播放量,那么只用 requests 要快得多,毕竟 b 站视频网址都是 avxxxxxx 。再比如你要爬百度贴吧所有吧的所有帖子,那么用 scrapy 就很有优势了,因为 scrapy 就是为了这类场景而生的。它可以设置 rule ,爬取指定规则的网址,还可以根据规则过滤不需要的,最重要的是这货还会自动翻页!在这种情况下如果要用 requests ,代码不知道要复杂多少倍啊!!
    tscat
        8
    tscat  
       2016-09-18 12:18:22 +08:00 via iPhone
    想看 Demo ,可以去伯乐在线 Python 看看,挺多的。我不是广告不是广告
    kohnv
        9
    kohnv  
       2016-09-18 12:24:01 +08:00
    scrapy 是异步的, 吞吐量很高. requests 爬完一个再爬一个, 一分钟爬不了几个页面. 当然你也可以自己用异步的方式去使用 requests, 那就是自己写了一个类似 scrapy 的东西了, 代码量和简单的使用 requests 就不是一个量级了.
    ooh
        10
    ooh  
       2016-09-18 12:24:47 +08:00
    很简单 Scrapy 有很多个轮子, requests 不过就是一个加强版的 urllib 只有一个轮子,多线程都要自己去实现,不麻烦吗?就好像同样要爬取一个网站, Scrapy 是一整套最佳实践的合集, requests 却只能进行网络请求,其它部分代码还要自己去思考怎么组织。
    mrytsr
        11
    mrytsr  
       2016-09-18 12:33:17 +08:00 via Android
    gouchaoer
        12
    gouchaoer  
       2016-09-18 12:57:49 +08:00 via Android   ❤️ 1
    @leavic 你才是菜鸟。。。。用框架基本没法扩展, scrapy 的中间件写起来很爽?你斗 m 么?

    一般完成特定任务都需要定制很多爬虫特性,恕我直言, scrapy 和别的很多框架适合小白跑个简单任务
    leavic
        13
    leavic  
       2016-09-18 13:02:18 +08:00   ❤️ 2
    @gouchaoer 我第一次看到有人说 scrapy 不能扩展, pipeline 可以随意处理数据, middleware 可以随意处理网络层,我不知道你还要扩展啥。等你用 requests 扩展了一堆东西觉得实现了一个很伟大的工程时,才发现这 tm 只是 scrapy 的基本功能。
    shyling
        14
    shyling  
       2016-09-18 13:08:43 +08:00
    区别就是框架和库的差别。不是有东西谁能做谁不能做,而是如果有现成的解决方案要不要去用,是否满足需求,不满足的话扩展能力如何。
    就像很多 java 黑会说 python 里 helloworld 只要一句, java 里要 class 要 static method balabala...因为需求就是显示个 helloworld 而已,其他东西是我不 care 的。
    gouchaoer
        15
    gouchaoer  
       2016-09-18 13:12:15 +08:00 via Android   ❤️ 6
    爬虫本质是开一个 httpclient 取回 html 然后 dom 去抽数据这么一个简单的东西, py 的 httpclient 比较好用的就 requests , dom 就 bs4 嘛。。。问题是不用框架你需要自己写并发+监控(这块很简单,我推荐多进程同步方案,别用 twisted 因为 debug 复杂编码难,同步的完全够用;监控推荐 redis 来做),这一块 scrapy 封装好了所以小白就用 scrapy 了。。。。于是公司就觉得 scrapy 好。。。

    你要接入打码平台啊,灵活做代理 ip 方案啊,接入 phantomjs 啊,做缓存控制啊,多节点基于 redis 的并发处理啊。。。。这些你用 scrapy 都很难定制,因为它封装太厉害了。。。。简单的说, lz 你懂得思考,不像小白只知道用框架
    gouchaoer
        16
    gouchaoer  
       2016-09-18 13:14:29 +08:00 via Android
    @leavic 看个人需求吧,你觉得 scrapy 能完成你的任务那就用呗
    hippoboy
        17
    hippoboy  
    OP
       2016-09-18 13:49:50 +08:00
    @gouchaoer 确实用 requests 自己实现了好多东西之后反而 scrapy 更加简单的手到擒来....有感觉自己写的代码可能在变人眼里只是一坨....所以也想学学口口相传的 scrapy,可能代码量会少很多,更注重主要逻辑....反正慢慢学喽,感谢赐教.
    hippoboy
        18
    hippoboy  
    OP
       2016-09-18 13:52:41 +08:00
    @leavic 感同身受,自己写了很多东西之后把 requests 丰满之后,把代码给别人,就好像是把自己的"框架"(比较 low 的框架)给别人一样,可能有代码规范等一系列问题,再看看 scrapy 好简洁,这也应该是我想学习 scrapy 的主要目的吧,感谢赐教.
    est
        19
    est  
       2016-09-18 14:03:35 +08:00   ❤️ 1
    @gouchaoer 顶 支持。

    用 scrapy 的不仅是菜鸟,还是笨鸟。

    gevent + requests 秒杀你们 twisted 一个银河系没问题。上行带宽可以打满。服务器带宽也可以打满
    est
        20
    est  
       2016-09-18 14:06:55 +08:00
    scrapy 做分布式方案只有麻烦的份。

    scrapy 根本就是用来爬静态单站的。跟上个世纪的 Flashget 的批量下载、 httrack 之流没啥区别。提供一大堆没什么卵用的框架功能。根本没法应付跨站泛爬的情况。
    wibile
        21
    wibile  
       2016-09-18 14:15:22 +08:00
    @est 别这么自信啊。。。谁还不用个 gevent 啊,但是写大一点的爬虫,难不成又要自己去造轮子?用 scrapy 仅仅是因为方便,除非你写轮子比较快。。。
    makeapp
        22
    makeapp  
       2016-09-18 14:19:13 +08:00
    我通常都是用 requests 做测试, scrapy 做生产。不清楚 requests 上的高级用法,但 scrapy 的 pipeline , middleware 非常好用,比如数据存储,换 UA ,换 proxy , itemloader 。
    ericls
        23
    ericls  
       2016-09-18 14:19:21 +08:00   ❤️ 2
    最后我转向 elixir 了。。。。。。
    est
        24
    est  
       2016-09-18 14:19:55 +08:00
    @wibile 大一点的爬虫是多大。 scrapy 用什么机制保证了能够支撑这么「大」?

    scrapy 方便在哪里?
    makeapp
        25
    makeapp  
       2016-09-18 14:22:34 +08:00
    @est 方便在于,改下 xpath ,改下数据库存储的格式,就可以抓取几百万的数据。
    est
        26
    est  
       2016-09-18 14:24:59 +08:00
    @makeapp -_- 😂 👍 高级。甘拜下风。好牛逼。
    julyclyde
        27
    julyclyde  
       2016-09-18 14:26:24 +08:00
    你用 requests 需要写很多东西,后来你把你自己写的很多东西,单独打了个包,叫 scrapy2
    killerv
        28
    killerv  
       2016-09-18 14:35:51 +08:00
    scrapy 是个框架, requests 只能算是个类库,就好比你写项目为什么用框架一样,有很多代码你不用去写了, scrapy 会帮你完成。
    killerv
        29
    killerv  
       2016-09-18 14:36:21 +08:00
    当然你要是写个很小的项目,功能很少,自然用不上 scrapy
    gimp
        30
    gimp  
       2016-09-18 14:39:07 +08:00
    我觉得,爬虫难点在于如何获取大量稳定的代理,而这个问题是恰恰是花钱就能很好解决的。

    要求用 scrapy 最可能的原因是规范一点,对整体的流程限制一下,也方便会这个框架的人以后接手。
    gimp
        31
    gimp  
       2016-09-18 14:40:07 +08:00
    技术上没法去比较优劣,跟使用者的水平有直接关系。
    haogefeifei
        32
    haogefeifei  
       2016-09-18 16:52:50 +08:00
    最近 scrapy 的 log server 也换成了 twisted 里面的 log 了。。。
    chenkun0128
        33
    chenkun0128  
       2016-09-18 17:06:55 +08:00
    scrapy 是一套框架,你也可以在 scrapy 中用 requests 呀,正巧最近写了点实战的例子(点我头像):-)
    petelin
        34
    petelin  
       2016-09-18 17:17:54 +08:00 via Android
    @leavic requests 加 gevent 如何
    plantparknet
        35
    plantparknet  
       2016-09-18 18:00:53 +08:00
    https://github.com/plantpark/Crawler-Of-Lianjia 这是我用 scrapy 写得爬虫,上手非常简单~~
    yumenami
        36
    yumenami  
       2016-09-18 19:13:26 +08:00
    scrapy 的增量抓取有点麻烦,特别是历史页面有变更的情况。如果能完美解决这个问题就好了。
    dsg001
        37
    dsg001  
       2016-09-18 20:45:20 +08:00
    @petelin 再加上 lxml 、 sqlite ,大部分比上 scrapy 快,比较复杂的爬虫 scrapy
    petelin
        38
    petelin  
       2016-09-18 20:57:31 +08:00 via Android
    @dsg001 恩,不讲场景就是耍流氓,我觉得他主要是胜在生态,模块,集成扩展都简单方便,讲速度你不如手动写 C 语言然后人肉汇编
    mingyun
        39
    mingyun  
       2016-09-18 22:45:59 +08:00
    ericls
        40
    ericls  
       2016-09-19 01:32:42 +08:00
    @petelin 不一定吧 爬虫的运行速度主要取决于 并发性能 一般 和 计算性能 关系不大吧
    jackon
        41
    jackon  
       2016-09-19 01:56:36 +08:00 via iPhone   ❤️ 2
    新手讨论如何爬的更快。
    受过伤的都在研究怎么慢一点爬。

    单站,单线程不 sleep 都被封,
    不理解多线程的需求哪里来的。

    多站,一个进程负责一个站就好了。
    揉在一起搞个高并发框架,意义也不大。

    然后就发现, scrapy 能复用的代码,好像不多。
    自己 requests 库写,也没几行代码。

    然后,就用这么原始的技术写爬虫,
    接了几个小项目,赚了 6 位数。
    xuxiongrui
        42
    xuxiongrui  
       2016-09-19 02:01:16 +08:00
    @jackon
    ...
    ...
    接了几个小项目,赚了 6 位数。
    ====================================================
    大神求带,请问大神有没有微信号微信群之类的?
    Override
        43
    Override  
       2016-09-19 05:35:37 +08:00 via Android
    scrapy 是一套解决特定问题的方案,如果你的需求刚好是 scrapy 能解决的,那么 scrapy 就很方便了
    dsg001
        44
    dsg001  
       2016-09-19 07:15:10 +08:00
    @jackon 球带,能简单说下什么小项目?
    markx
        45
    markx  
       2016-09-19 07:51:26 +08:00
    楼上有人说的好, 二者区别就是 scrapy 是框架, requests 是库。
    crab
        46
    crab  
       2016-09-19 08:38:10 +08:00
    @leavic python 不支持多线程 requests 吗
    ytmsdy
        47
    ytmsdy  
       2016-09-19 09:27:40 +08:00
    自己手动实现一下多线程调度还有各种异常的处理就知道为什么要用 scrapy 了,话说当年我也是这么想的,直到接到一个非常 BT 的小项目才开始学习 scrapy
    Allianzcortex
        48
    Allianzcortex  
       2016-09-19 09:52:17 +08:00
    刚好都用过,,我来说一下⊙﹏⊙b : requests 是库, scrapy 是框架。 gevent 的 monkey_patch 是支持 requests 的,但每次写的时候都要控制 gevent 连接不是很烦嘛。。所以当然希望能封装一个出来,只要我定义好链接和规则以及一些参数,就能自动爬取多好,于是就有了 scrapy 。 scrapy 基于 twisted 异步, twisted 太扭曲了,没有用过, gevent 是用协程以同步的方式来避免阻塞。目前我知道的是有师兄在友盟,当时他们准备用 scrapy 来抓数据,所以 scrapy 真正用于工业级别的生产还是不少的。当时还准备自己写一个爬虫框架,自己抓取代理,提供 gevent 和多线程什么的: https://github.com/Allianzcortex/Seaeels ,一个 demo 已经完了,但目测要坑。。业余时间已经不是太想做爬虫这方面了
    est
        49
    est  
       2016-09-19 09:56:48 +08:00
    @jackon 顶。

    scrapy 才不是什么工业级的。就一个普通框架而已。
    leavic
        50
    leavic  
       2016-09-19 10:35:38 +08:00   ❤️ 1
    @crab 这种被 io 阻塞的东西,异步协程(本质是单线程,但 io 部分被抽离成多线程并发的效果)要比多线程好得多,多线程要考虑互斥量信号量这些东西,本身又是一个坑。

    twisted 内部其实就挺复杂了,就是把这个异步过程简单化了方便我们使用,自己用多线程造轮子吃力不讨好啊。
    brucedone
        51
    brucedone  
       2016-09-19 12:44:37 +08:00
    @est scrapy 不敢说工业级,不过已经被我拓展成公司级的, docker 打包 + 中间件 + 调度 + 监控,很方便出量。其实 scrapy 还是满容易拓展的。
    xiaket
        52
    xiaket  
       2016-09-19 12:48:32 +08:00
    scrapy 的 api 好丑...
    brucedone
        53
    brucedone  
       2016-09-19 12:49:01 +08:00
    mathgl
        54
    mathgl  
       2016-09-19 12:51:28 +08:00
    @brucedone 工业级是怎么定义的?我觉得能商用就可以算为“工业级”了。
    slysly759
        55
    slysly759  
       2016-09-19 12:58:00 +08:00
    @brucedone 嘿嘿活捉大鱼 大神~
    liko
        56
    liko  
       2016-09-20 10:02:01 +08:00
    requests + gevent
    newzy
        57
    newzy  
       2017-12-06 12:44:11 +08:00
    一群傻逼。。。。鉴定完毕,有空在这儿扯犊子,没时间去提升一下自己的技术!
    jakeyfly
        58
    jakeyfly  
       2018-02-28 11:54:43 +08:00 via iPhone
    @gouchaoer 这才是真的会爬虫的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2735 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:12 · PVG 23:12 · LAX 07:12 · JFK 10:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.