還在焦頭爛額裸寫Scrapy?這個神器讓你90秒內配好一個爬蟲

背景

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

咱們今天主要介紹的是 Crawlab 的可配置爬蟲。咱們以前在 這篇文章 中有所介紹,但並無深刻講解如何應用到實戰中。今天,咱們着重講解一下。若是對 Crawlabb 的可配置爬蟲比較陌生,請參考可配置爬蟲的 文檔微信

可配置爬蟲實戰

實戰部分的全部案例是做者用 Crawlab官方 Demo 平臺 經過可配置爬蟲功能編寫並完成抓取的,涵蓋了新聞、金融、汽車、書籍、視頻、搜索引擎、程序員社區等領域(見下圖)。下面將介紹其中的幾個,全部例子均在 官方 Demo 平臺 上,都可以註冊帳號登陸查看。markdown

百度(搜索 "Crawlab")

爬蟲地址http://crawlab.cn/demo#/spide...

爬蟲配置

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#/spide...

爬蟲配置

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#/spide...

爬蟲配置

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#/spide...

爬蟲配置

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#/spide...

爬蟲配置

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 作開發貢獻。

相關文章
相關標籤/搜索