还在焦头烂额裸写 Scrapy?这个神器让你 90 秒内配好一个爬虫 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tikazyq
V2EX    程序员

还在焦头烂额裸写 Scrapy?这个神器让你 90 秒内配好一个爬虫

  •  3
     
  •   tikazyq
    tikazyq 2020-01-22 17:52:56 +08:00 5204 次点击
    这是一个创建于 2088 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    爬虫是一件有趣的事情,让你可以通过爬虫程序自动化的将网上的信息抓取下来,免去了很多人工操作。在一些优质爬虫框架出来之前,开发者们还是通过简单的网络请求+网页解析器的方式来开发爬虫程序,例如 Python 的 requests + BeautifulSoup,高级一点的爬虫程序还会加入数据储存的模块,例如 MySQL、MongoDB。这种方式开发效率低,稳定性不佳,要开发好一个完备的、生产可用的爬虫可能需要好几个小时。我将这种方式称作 非框架爬虫

    2011 年,基于 Twisted 编写的 Scrapy 爬虫框架横空出世,突然被大众熟知,成为了首屈一指的全能的高性能爬虫异步框架。Scrapy 抽象出了几个核心模块,让开发者将主要注意力放在爬虫抓取逻辑上,而不用管数据下载、页面解析、任务调度等比较繁琐的模块。开发好一个生产可用的 Scrapy 爬虫,简单的可能只需要十几分钟,复杂的可能需要 1 小时以上。当然,我们还有其他很多优秀框架,例如 PySpider、Colly 等。我将这种爬虫称作 框架爬虫。框架爬虫解放了生产力,现在很多企业将框架爬虫改造后应用在生产环境中,大规模抓取数据。

    然而,对于需要抓成百上千个网站的爬虫需求来说,框架爬虫可能就有些心有余而力不足了,编写爬虫成了体力活。例如,如果平均开发一个框架爬虫需要 20 分钟,如果一个全职爬虫开发工程师每天工作 8 个小时,那么开发 1000 个网站就需要 20000 分钟,333 个小时,42 个工作日,近 2 个月。当然,我们可以雇佣 10 个全职爬虫开发工程师,但这同样需要 4 个工作日才能完成(如下图)。

    这同样是比较低效的。为了克服这个效率问题,可配置爬虫 应运而生。

    可配置爬虫介绍

    可配置爬虫( Configurable Spider ) 正如其名字表示的,就是可以配置抓取规则的爬虫。可配置爬虫是一种高度抽象的爬虫程序,开发人员不用编写爬虫代码,只需要将需要抓取网页地址、字段、属性写在配置文件或数据库中,让特殊的爬虫程序根据配置去抓取数据。可配置爬虫将爬虫代码进一步抽象成了配置信息,简化了爬虫开发的流程。爬虫开发者只需要做相应的配置就可以完成爬虫的开发。因此,开发者可以通过可配置爬虫,大规模的编写爬虫程序(如下图)。

    这样的方式让抓取成百上千的网站成了可能,一个熟练的爬虫配置员一天可以配置 1000 个新闻网站的爬虫。这对于有舆情监控需求的企业来说非常重要,因为可配置爬虫提高了生产力,让单位工作时间成本降低,提升了开发效率,方便后续的舆情分析和人工智能产品开发。很多企业都是自己研发的可配置爬虫(可能叫法会有些不一样,但实质是一个东西),然后雇佣一些爬虫配置员专门负责配置爬虫。

    市面上免费开源的可配置爬虫框架并不多。比较早的有微软大神崔庆才开发的 Gerapy,属于一个爬虫管理平台,能够根据配置规则生成 Scrapy 项目文件。另一个比较新的可配置爬虫框架是 Crawlab(其实 Crawlab 不是可配置爬虫框架,而是一个灵活度很高的爬虫管理平台),在 v0.4.0 中发布了可配置爬虫。另外还有一个基于 Golang 的开源框架 Ferret ,很有意思,编写爬虫跟写 SQL 一样简单。其他还有一些商业产品,但据用户反馈后都觉得专业度不高,不能满足生产需求。

    可配置爬虫的诞生,主要是爬虫的模式比较单一,无非就是列表页+详情页的组合(如下图),或者仅仅列表页。当然还有稍微复杂一点的通用爬虫,这些也可以通过规则配置来完成。

    Crawlab 可配置爬虫

    我们今天主要介绍的是 Crawlab 的可配置爬虫。我们之前在 这篇文章 中有所介绍,但并没有深入讲解如何应用到实战中。今天,我们着重讲解一下。如果对 Crawlabb 的可配置爬虫比较陌生,请参考可配置爬虫的 文档

    可配置爬虫实战

    实战部分的所有案例是作者用 Crawlab官方 Demo 平台 通过可配置爬虫功能编写并完成抓取的,涵盖了新闻、金融、汽车、书籍、视频、搜索引擎、程序员社区等领域(见下图)。下面将介绍其中的几个,所有例子均在 官方 Demo 平台 上,均可以注册账号登录查看。

    百度(搜索 "Crawlab")

    爬虫地址http://crawlab.cn/demo#/spiders/5e27d055b8f9c90019f42a83

    爬虫配置

    Spiderfile

    version: 0.4.4 engine: scrapy start_url: http://www.baidu.com/s?wd=crawlab start_stage: list stages: - name: list is_list: true list_css: "" list_xpath: //*[contains(@class, "c-container")] page_css: "" page_xpath: //*[@id="page"]//a[@class="n"][last()] page_attr: href fields: - name: title css: "" xpath: .//h3/a attr: "" next_stage: "" remark: "" - name: url css: "" xpath: .//h3/a attr: href next_stage: "" remark: "" - name: abstract css: "" xpath: .//*[@class="c-abstract"] attr: "" next_stage: "" remark: "" settings: ROBOTSTXT_OBEY: "false" USER_AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 

    抓取结果

    SegmentFault (最新文章)

    爬虫地址http://crawlab.cn/demo#/spiders/5e27d116b8f9c90019f42a87

    爬虫配置

    Spiderfile

    version: 0.4.4 engine: scrapy start_url: https://segmentfault.com/newest start_stage: list stages: - name: list is_list: true list_css: .news-list > .news-item list_xpath: "" page_css: "" page_xpath: "" page_attr: "" fields: - name: title css: h4.news__item-title xpath: "" attr: "" next_stage: "" remark: "" - name: url css: .news-img xpath: "" attr: href next_stage: "" remark: "" - name: abstract css: .article-excerpt xpath: "" attr: "" next_stage: "" remark: "" settings: ROBOTSTXT_OBEY: "false" USER_AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 

    抓取结果

    亚马逊中国(搜索"手机")

    爬虫地址http://crawlab.cn/demo#/spiders/5e27e157b8f9c90019f42afb

    爬虫配置

    Spiderfile

    version: 0.4.4 engine: scrapy start_url: https://www.amazon.cn/s?k=%E6%89%8B%E6%9C%BA&__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&ref=nb_sb_noss_2 start_stage: list stages: - name: list is_list: true list_css: .s-result-item list_xpath: "" page_css: .a-last > a page_xpath: "" page_attr: href fields: - name: title css: span.a-text-normal xpath: "" attr: "" next_stage: "" remark: "" - name: url css: .a-link-normal xpath: "" attr: href next_stage: "" remark: "" - name: price css: "" xpath: .//*[@class="a-price-whole"] attr: "" next_stage: "" remark: "" - name: price_fraction css: "" xpath: .//*[@class="a-price-fraction"] attr: "" next_stage: "" remark: "" - name: img css: .s-image-square-aspect > img xpath: "" attr: src next_stage: "" remark: "" settings: ROBOTSTXT_OBEY: "false" USER_AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 

    抓取结果

    V2ex

    爬虫地址http://crawlab.cn/demo#/spiders/5e27dd67b8f9c90019f42ad9

    爬虫配置

    Spiderfile

    version: 0.4.4 engine: scrapy start_url: https://v2ex.com/ start_stage: list stages: - name: list is_list: true list_css: .cell.item list_xpath: "" page_css: "" page_xpath: "" page_attr: href fields: - name: title css: a.topic-link xpath: "" attr: "" next_stage: "" remark: "" - name: url css: a.topic-link xpath: "" attr: href next_stage: detail remark: "" - name: replies css: .count_livid xpath: "" attr: "" next_stage: "" remark: "" - name: detail is_list: false list_css: "" list_xpath: "" page_css: "" page_xpath: "" page_attr: "" fields: - name: content css: "" xpath: .//*[@class="markdown_body"] attr: "" next_stage: "" remark: "" settings: AUTOTHROTTLE_ENABLED: "true" ROBOTSTXT_OBEY: "false" USER_AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36 

    抓取结果

    36 氪

    爬虫地址http://crawlab.cn/demo#/spiders/5e27ec82b8f9c90019f42b59

    爬虫配置

    Spiderfile

    version: 0.4.4 engine: scrapy start_url: https://36kr.com/information/web_news start_stage: list stages: - name: list is_list: true list_css: .kr-flow-article-item list_xpath: "" page_css: "" page_xpath: "" page_attr: "" fields: - name: title css: .article-item-title xpath: "" attr: "" next_stage: "" remark: "" - name: url css: body xpath: "" attr: href next_stage: detail remark: "" - name: abstract css: body xpath: "" attr: "" next_stage: "" remark: "" - name: author css: .kr-flow-bar-author xpath: "" attr: "" next_stage: "" remark: "" - name: time css: .kr-flow-bar-time xpath: "" attr: "" next_stage: "" remark: "" - name: detail is_list: false list_css: "" list_xpath: "" page_css: "" page_xpath: "" page_attr: "" fields: - name: content css: "" xpath: .//*[@class="common-width content articleDetailContent kr-rich-text-wrapper"] attr: "" next_stage: "" remark: "" settings: ROBOTSTXT_OBEY: "false" USER_AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 

    抓取结果

    实战爬虫一览

    爬虫名称 | 爬虫类别 --- | --- 百度 | 列表页+分页 SegmentFault | 列表页 CSDN | 列表页+分页+详情页 V2ex | 列表页+详情页 纵横 | 列表页 亚马逊中国 | 列表页+分页 雪球网 | 列表页+详情页 汽车之家 | 列表页+分页 豆瓣读书 | 列表页 36 氪 | 列表页+详情页 腾讯视频 | 列表页

    总结

    Crawlab 的可配置爬虫非常方便,让程序员可以快速配置出自己需要的爬虫。配置上述 11 个爬虫总共花费了作者不到 40 分钟的时间(考虑到有反爬调试在里面),其中几个比较简单的爬虫在 1-2 分钟不到就配置完成了。而且作者一行代码也没有写,所有配置均在界面上完成。而且,Crawlab 可配置爬虫不仅支持在界面上的配置,同时还支持编写一个 Yaml 文件 Spiderfile 来完成配置(其实,所有的配置均可以映射到 Spiderfile 中)。Crawlab 可配置爬虫是基于 Scrapy 的,因此支持 Scrapy 绝大多数特性,可以通过 设置 来配置可配置爬虫的扩展属性,包括 USER_AGENTROBOTSTXT_OBEY 等等。为什么要用 Crawlab 作为可配置爬虫的首选呢?因为 Crawlab 可配置爬虫不仅能够配置爬虫,还能享受 Crawlab 爬虫管理平台的核心功能,包括任务调度、任务监控、定时任务、日志管理、消息通知等实用功能。而在后续开发中,Crawlab 开发组还将不断完善可配置爬虫,让其支持更多的功能,包括动态内容、更多的引擎、CrawlSpider 的实现等等。

    要注意的是,不遵守 robots.txt 可能会造成法律风险,本文的实战爬虫均为学习交流用,切勿作为生产环境,任何滥用者自行承担法律责任。

    参考

    如果您觉得 Crawlab 对您的日常开发或公司有帮助,请加作者微信 tikazyq1 并注明 "Crawlab",作者会将你拉入群。欢迎在 Github 上进行 star,以及,如果遇到任何问题,请随时在 Github 上提 issue。另外,欢迎您对 Crawlab 做开发贡献。

    第 1 条附言    2020-01-24 11:29:52 +08:00
    18 条回复    2020-01-25 14:17:02 +08:00
    AX5N
        1
    AX5N  
       2020-01-23 03:36:22 +08:00
    这种配置文件式的爬虫表达能力太弱,碰到复杂点的网站就搞不定了。
    tikazyq
        2
    tikazyq  
    OP
       2020-01-23 07:16:17 +08:00 via iPhone
    @AX5N 这是因为可配置爬虫还不够灵活,现在有些局限性,不过后面会不断发展,需求还是有的。对于复杂爬虫,可以采用 crawlab 的自定义爬虫
    optional
        3
    optional  
       2020-01-23 13:10:21 +08:00 via iPhone
    这种爬虫,火车头都可以直接用
    locoz
        4
    locoz  
       2020-01-23 14:40:49 +08:00
    @AX5N #1
    @optional #3
    这东西的可配置爬虫只是顺带的功能,核心其实是作为管理平台来使用。
    huruwo
        5
    huruwo  
       2020-01-23 16:30:58 +08:00
    像抖音 小红书这种软件的数据能爬取吗
    Canthony
        6
    Canthony  
       2020-01-23 18:02:02 +08:00
    弱弱问一句,图呢?
    JaneWang
        7
    JaneWang  
       2020-01-23 20:47:30 +08:00 via iPhone
    个人觉得爬虫管理需求不大。反而是登录,验证码,反爬等特性需求更大。
    tikazyq
        8
    tikazyq  
    OP
       2020-01-23 23:25:12 +08:00 via iPhone
    @optional 火车头是给小白用的,crawlab 是给专业人士用的
    tikazyq
        9
    tikazyq  
    OP
       2020-01-23 23:25:30 +08:00 via iPhone
    @locoz 大佬懂我
    tikazyq
        10
    tikazyq  
    OP
       2020-01-23 23:27:07 +08:00 via iPhone
    @huruwo 对于复杂的反爬措施,可配置爬虫暂时不能绕过,但后续可能会开发更复杂的可配置爬虫
    tikazyq
        11
    tikazyq  
    OP
       2020-01-23 23:28:13 +08:00 via iPhone
    tikazyq
        12
    tikazyq  
    OP
       2020-01-23 23:39:36 +08:00 via iPhone
    @JaneWang 反爬特性的爬虫可以用自定义爬虫,但爬虫管理是一个比较重要的功能,除非你的爬虫根本不成规模,或者处于 demo 阶段… 详情可以看我掘金上关于爬虫管理平台的文章
    huruwo
        13
    huruwo  
       2020-01-24 18:41:16 +08:00
    @tikazyq 我的需求可能是针对于手机上的数据爬取。类似几万个抖音账号需要快速查出每个账号的信息 作品 喜欢列表。该框架是只针对网页爬虫还是通用于手机爬虫
    tikazyq
        14
    tikazyq  
    OP
       2020-01-24 18:52:15 +08:00 via iPhone
    @huruwo crawlab 针对爬虫管理,可配置爬虫暂时仅限于 web,手机 app 爬虫还需要用自定义爬虫开发
    winglight2016
        15
    winglight2016  
       2020-01-25 10:50:32 +08:00
    建议 lz 打包个 docker 版,docker-compose 配置,方便使用外部 mongodb 和 redis。
    tikazyq
        16
    tikazyq  
    OP
       2020-01-25 12:20:01 +08:00 via iPhone
    @winglight2016 已经做了,请参照 github,docker-compose 是推荐部署方式
    Harlaus
        17
    Harlaus  
       2020-01-25 14:02:25 +08:00
    爬虫平台能不能不要局限在 scrapy 里
    tikazyq
        18
    tikazyq  
    OP
       2020-01-25 14:17:02 +08:00 via iPhone
    @Harlaus crawlab 可以运行任何语言,任何框架,不局限于 scrapy 哦
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3019 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 11:56 PVG 19:56 LAX 04:56 JFK 07:56
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86