爬虫是一件有趣的事情,让你能够经过爬虫程序自动化的将网上的信息抓取下来,免去了不少人工操做。在一些优质爬虫框架出来以前,开发者们仍是经过简单的网络请求+网页解析器的方式来开发爬虫程序,例如 Python 的 requests + BeautifulSoup,高级一点的爬虫程序还会加入数据储存的模块,例如 MySQL、MongoDB。这种方式开发效率低,稳定性不佳,要开发好一个完备的、生产可用的爬虫可能须要好几个小时。我将这种方式称做 非框架爬虫。css
2011 年,基于 Twisted 编写的 Scrapy 爬虫框架横空出世,忽然被大众熟知,成为了数一数二的全能的高性能爬虫异步框架。Scrapy 抽象出了几个核心模块,让开发者将主要注意力放在爬虫抓取逻辑上,而不用管数据下载、页面解析、任务调度等比较繁琐的模块。开发好一个生产可用的 Scrapy 爬虫,简单的可能只须要十几分钟,复杂的可能须要 1 小时以上。固然,咱们还有其余不少优秀框架,例如 PySpider、Colly 等。我将这种爬虫称做 框架爬虫。框架爬虫解放了生产力,如今不少企业将框架爬虫改造后应用在生产环境中,大规模抓取数据。html
然而,对于须要抓成百上千个网站的爬虫需求来讲,框架爬虫可能就有些爱莫能助了,编写爬虫成了体力活。例如,若是平均开发一个框架爬虫须要 20 分钟,若是一个全职爬虫开发工程师天天工做 8 个小时,那么开发 1000 个网站就须要 20000 分钟,333 个小时,42 个工做日,近 2 个月。固然,咱们能够雇佣 10 个全职爬虫开发工程师,但这一样须要 4 个工做日才能完成(以下图)。git
这一样是比较低效的。为了克服这个效率问题,可配置爬虫 应运而生。程序员
可配置爬虫(Configurable Spider) 正如其名字表示的,就是能够配置抓取规则的爬虫。可配置爬虫是一种高度抽象的爬虫程序,开发人员不用编写爬虫代码,只须要将须要抓取网页地址、字段、属性写在配置文件或数据库中,让特殊的爬虫程序根据配置去抓取数据。可配置爬虫将爬虫代码进一步抽象成了配置信息,简化了爬虫开发的流程。爬虫开发者只须要作相应的配置就能够完成爬虫的开发。所以,开发者能够经过可配置爬虫,大规模的编写爬虫程序(以下图)。github
这样的方式让抓取成百上千的网站成了可能,一个熟练的爬虫配置员一天能够配置 1000 个新闻网站的爬虫。这对于有舆情监控需求的企业来讲很是重要,由于可配置爬虫提升了生产力,让单位工做时间成本下降,提高了开发效率,方便后续的舆情分析和人工智能产品开发。不少企业都是本身研发的可配置爬虫(可能叫法会有些不同,但实质是一个东西),而后雇佣一些爬虫配置员专门负责配置爬虫。web
市面上免费开源的可配置爬虫框架并很少。比较早的有微软大神崔庆才开发的 Gerapy,属于一个爬虫管理平台,可以根据配置规则生成 Scrapy 项目文件。另外一个比较新的可配置爬虫框架是 Crawlab(其实 Crawlab 不是可配置爬虫框架,而是一个灵活度很高的爬虫管理平台),在 v0.4.0 中发布了可配置爬虫。另外还有一个基于 Golang 的开源框架 Ferret ,颇有意思,编写爬虫跟写 SQL 同样简单。其余还有一些商业产品,但据用户反馈后都以为专业度不高,不能知足生产需求。数据库
可配置爬虫的诞生,主要是爬虫的模式比较单一,无非就是列表页+详情页的组合(以下图),或者仅仅列表页。固然还有稍微复杂一点的通用爬虫,这些也能够经过规则配置来完成。segmentfault
咱们今天主要介绍的是 Crawlab 的可配置爬虫。咱们以前在 这篇文章 中有所介绍,但并无深刻讲解如何应用到实战中。今天,咱们着重讲解一下。若是对 Crawlabb 的可配置爬虫比较陌生,请参考可配置爬虫的 文档。微信
实战部分的全部案例是做者用 Crawlab 的 官方 Demo 平台 经过可配置爬虫功能编写并完成抓取的,涵盖了新闻、金融、汽车、书籍、视频、搜索引擎、程序员社区等领域(见下图)。下面将介绍其中的几个,全部例子均在 官方 Demo 平台 上,都可以注册帐号登陆查看。markdown
爬虫地址:http://crawlab.cn/demo#/spide...
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
爬虫地址:http://crawlab.cn/demo#/spide...
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#/spide...
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
爬虫地址:http://crawlab.cn/demo#/spide...
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
爬虫地址:http://crawlab.cn/demo#/spide...
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_AGENT
、ROBOTSTXT_OBEY
等等。为何要用 Crawlab 做为可配置爬虫的首选呢?由于 Crawlab 可配置爬虫不只可以配置爬虫,还能享受 Crawlab 爬虫管理平台的核心功能,包括任务调度、任务监控、定时任务、日志管理、消息通知等实用功能。而在后续开发中,Crawlab 开发组还将不断完善可配置爬虫,让其支持更多的功能,包括动态内容、更多的引擎、CrawlSpider 的实现等等。
要注意的是,不遵照 robots.txt 可能会形成法律风险,本文的实战爬虫均为学习交流用,切勿做为生产环境,任何滥用者自行承担法律责任。
若是您以为 Crawlab 对您的平常开发或公司有帮助,请加做者微信 tikazyq1 并注明 "Crawlab",做者会将你拉入群。欢迎在 Github 上进行 star,以及,若是遇到任何问题,请随时在 Github 上提 issue。另外,欢迎您对 Crawlab 作开发贡献。