爬蟲是一件有趣的事情,讓你能夠經過爬蟲程序自動化的將網上的信息抓取下來,免去了不少人工操做。在一些優質爬蟲框架出來以前,開發者們仍是經過簡單的網絡請求+網頁解析器的方式來開發爬蟲程序,例如 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 作開發貢獻。