V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tikazyq
V2EX  ›  程序员

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

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

    背景

    爬虫是一件有趣的事情,让你可以通过爬虫程序自动化的将网上的信息抓取下来,免去了很多人工操作。在一些优质爬虫框架出来之前,开发者们还是通过简单的网络请求+网页解析器的方式来开发爬虫程序,例如 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   ·   实用小工具   ·   1001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:19 · PVG 05:19 · LAX 13:19 · JFK 16:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.