只要是用WordPress的人或多或少都會裝幾個插件,能夠用來豐富擴展WordPress的各類功能。圍繞WordPress平臺的插件和主題已經創建了一個獨特的經濟生態圈和開發者社區,養活了衆多的WordPress相關的開發公司和開發者。各類強大的WordPress插件也層出不窮,有的甚至能夠作出功能完善的網站,好比招聘網站、分類信息網站、電商網站、點評網站、培訓網站等等,令我讚歎不已。html
最近一直沉迷於研究 WordPress,彷彿事隔多年與初戀情人再續前緣通常陷入熱戀。這幾天突發奇想把WordPress上這麼多眼花繚亂的插件都爬下來,看看能不能分析出一點有意思的東西來。python
官網插件的頁面 wordpress.org/plugins/ 上列出了一共有 54,520 個插件。記得之前在官網上能夠按各類分類瀏覽的,如今只有推薦的插件、收藏的插件、流行的插件幾大類顯示出來,其餘的好像只能靠人肉搜索了。其實挺不方便的。mongodb
那麼首先第一步咱們要知道取哪裏能夠找到全部的WordPress插件列表,搜了一圈發現WordPress的svn上有這個完整的列表, plugins.svn.wordpress.org/ (這個網頁比較大,5M多,慎點),比官網上的還要齊全,一共7萬多個。有了完整列表就好辦了。json
接下來就是要獲取的是插件的各類信息,好比做者、下載量、評分等等。這個能夠去哪裏獲取呢?固然最傻的辦法就是根據上面列表中的插件地址,把每一個插件的網頁down下來再提取,這也就是爬蟲乾的事。不過 WordPress.org 網站自身的 WordPress.org API 已經給開發者提供了很是方便強大的接口,能夠獲取到幾乎全部 wordprss.org 上的主題、插件、新聞等相關的信息,也支持各類參數和查詢。注意,這個和WordPress的REST API是兩回事。基本上你能夠理解成 Apple.com 的 API 和 iOS 的 API 之間的區別(雖然apple.com並無什麼API。。。)api
好比本次須要插件的一些數據,那就可使用關於插件描述的 API, https://api.wordpress.org/plugins/info/1.0/{slug}.json
,slug也就是每一個插件惟一的地址,這個在剛纔svn上已經能夠獲取到了。用這個 API 能夠返回關於插件的 json 格式的各類詳細信息,很全面,以下:bash
有了列表,有了返回格式,接下來就是要把這些信息給扒下來,其實就是重複遍歷一遍就能夠了,要麼用著名 Python 的 Requests庫 循環一圈,要麼使用 Python 的爬蟲框架 Scrapy, 都是能夠的 。在存儲爬取數據存儲方面,原本打算用scrapy而且存入 mongodb 的,可是遇到的一個坑是API返回的json對象裏version有的key是帶小數點的,好比」0.1″這種是沒法直接存入mongodb的,會報錯說key不能包含點.
app
"versions": {
"0.1": "https://downloads.wordpress.org/plugin/0-errors.0.1.zip",
"0.2": "https://downloads.wordpress.org/plugin/0-errors.0.2.zip",
"trunk": "https://downloads.wordpress.org/plugin/0-errors.zip"
},
複製代碼
InvalidDocument: key must not contain ‘.’框架
不用就不用唄。。。改key才蛋疼了。因此這能夠祭出另一個厲害的python庫 jsonline了, 它能夠以jsonl文件的形式一行存儲一條json,讀寫速度也很快。最後爬完全部數據的這個文件有341M之大。。。dom
最後,有了數據就能夠作一些有意思的數據分析了,這一步主要會用到的就是一些常見的 Python 的數據分析工具和圖表工具,pandas、numpy、seaborn等。根據上面的返回信息能夠看出,可以分析的維度也是不少的,好比哪些做者開發的插件最多、哪些插件的下載量最多、哪些類別的插件最多、哪些國家的開發者最多、每一年的插件增加量等等,甚至更進一步能夠把全部插件的zip文件下載下來用AI作一些深刻的代碼分析等等,想一想仍是挺有意思的,本文的目標也就是提供一種思路和方法,但願能拋磚引玉。scrapy
下面進開始進入代碼的世界吧
要爬數據通常第一步是要確認爬蟲的入口網頁,也就是從哪裏開始爬,沿着入口網頁找到下一個URL,找-爬-找,不斷循環重複直到結束。通常來講入口網頁的分析均可以在scrapy內部進行處理,若是事先就已經能夠明確知道全部要請求的網頁地址,那麼也能夠直接把url列表扔進scrpay裏,讓它順着列表一直爬爬爬就好了。
本次爲了說的清晰一點,爬蟲部分不用再次解釋,因此分步進行,先把要爬的全部url準備好等下能夠直接使用。以前說過了,WordPress全部的插件名稱列表在這裏能夠找到 http://plugins.svn.wordpress.org/ ,這網頁是一個很是簡單的靜態網頁,就是一個巨大的ul列表,每個li就是一個插件名字:
這裏的href
就是插件的slug,是wordpress.org用來肯定插件的惟一標示。解析這種html對Python來講簡直是小菜一碟,好比最經常使用的 BeautifulSoup 或者 lxmp,此次決定嘗試一個比較新的庫,Requests-HTML: HTML Parsing for Humans ,這也是開發出Requests庫的大神kennethreitz的又一力做,用於解析 HTML 文檔的簡直不要太爽了。
slug獲得後,按照API的url格式地址組合起來,所有寫入一個文件中就能夠了。
做爲對比,能夠看下用 BeautifulSoup 的方法:
就這麼一個簡單對比仍是比較明顯的,簡單明瞭。最終,這一步的輸出結果就是這個all_plugins_urls.txt文件了,總共有79223個插件。
有了這個列表,其實下面的Scrapy步驟其實徹底能夠不用,直接拿wget均可以所有簡單粗暴的懟下來7萬個json文件:
wget -i all_plugins_urls.txt複製代碼
或者用requests簡單的遍歷請求一下就完事了,就能夠獲得全部插件的數據,進而能夠直接進入數據分析階段了。爲了做爲演示吧,也算做是一個簡單的scrapy的介紹,對於沒有接觸過scrapy的朋友來講,能夠是一個很初步的入門介紹。
這一步最簡單的方式就是pip安裝
pip install Scrapy
scarpy -V # 驗證一下複製代碼
scrapy 提供了完善的命令工具能夠方便的進行各類爬蟲相關的操做。通常來講,使用 scrapy 的第一件事就是建立你的Scrapy項目。個人習慣是首先新建一個文件夾(用要爬的網站來命名,這樣能夠方便的區分不一樣網站的爬蟲項目)做爲總的工做區, 而後進入這個文件夾裏新建一個 scrapy 的項目,項目的名字叫作 scrap_wp_plugins,能夠改爲你想要的名字
mkdir ~/workplace/wordpress.org-spider
cd ~/workplace/wordpress.org-spider
scrapy startproject scrap_wp_plugins複製代碼
這樣就會自動建立好相似以下的文件結構:
├── scrap_wp_plugins
│ ├── __init__.py
│ ├── __pycache__
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ ├── __init__.py
│ └── __pycache__
└── scrapy.cfg
4 directories, 7 files
複製代碼
對咱們這個需求來講,除了settings.py須要作一點點修改,其他文件都先不用管它,在這個簡單的不能再簡單的項目裏都用不到。
目前只是一個空架子,啥也幹不了,由於尚未爬蟲文件,你能夠徹底純手寫,也能夠用模板來生成一個。咱們就用scrapy的命令行自動生成一個爬蟲,語法格式是這樣:
Syntax: scrapy genspider [-t template] <name> <domain>
template 是要使用的爬蟲的模板,默認的就是用最基本的一個。
name 就是爬蟲的名字,這個能夠隨便取,等下要開始爬的時候會用到這個名字。比如給你的小蜘蛛取名叫「春十三」,那麼在召喚它的時候你就能夠大喊一聲:「上吧!個人春十三!」
domain 是爬蟲運行時容許的域名,比如說:「上吧!個人春十三!只沿着這條路線上!」
因此執行以下命令便可:
cd scrap_wp_plugins
scrapy genspider plugins_spider wordpress.org複製代碼
這樣就會在spiders
文件夾下生出一個叫plugins_spider.py
的爬蟲文件,也就是在這裏面能夠填充一些爬取邏輯和內容解析。
首先咱們打開scrap_wp_plugins/plugins_spider.py
看下里面的內容:
能夠看出這就是一個最簡單scrapy的Spider的類而已,自動填入了上一步用來建立爬蟲時的一些參數。
name:爬蟲的識別名,它必須是惟一的,在不一樣的爬蟲中你必須定義不一樣的名字,就是上一步的命令行裏寫的plugins_spider
.
start_urls:爬蟲開始爬的一個URL列表。爬蟲從這裏開始抓取數據,因此,第一次下載的數據將會從這些URLS開始。其餘URL將會從這些起始URL中繼承性生成。具體來講,在準備工做那一部分,咱們已經獲得了一個urls的列表文件all_plugins_urls.txt
,如今只須要把這個文件讀取進來就行了。
parse():爬蟲的方法,調用時候傳入從每個URL傳回的Response對象做爲參數,response將會是parse方法的惟一的一個參數,
這個方法負責解析返回的數據、匹配抓取的數據(解析爲item)並跟蹤更多的URL。在本項目中,由於返回的是json,不須要解析任何html,這裏爲了省事我就直接把json整個存儲起來已備後面數據分析的時候再選擇須要的字段,固然你也能夠根據須要選擇過濾掉不須要的json字段。
因此,咱們的第一個爬蟲就呼之欲出了!請看代碼,麻雀雖小五臟俱全
改完上面的爬蟲代碼,如今就可讓爬蟲跑起來了,「上吧!比卡丘!」
scrapy crawl plugins_spider複製代碼
哦嚯。。。
意外發生了。。。啥也沒爬下來??
# Obey robots.txt rules
ROBOTSTXT_OBEY = True複製代碼
再次運行如今就能夠愉快的爬取了。還有一點舒適提示,若是爬取網址數量比較多,不想中途由於斷網或者其餘什麼鬼知道的意外中斷,致使下次又要從新來過,能夠加上scrapy的執行日誌來保存爬蟲狀態,下次就會從中斷處開始繼續爬取
scrapy crawl plugins_spider -s JOBDIR=spiderlog --logfile log.out &複製代碼
這樣就能夠安心的去睡個覺,一早起來就能看到熱呼呼新鮮出路的WordPress全部的插件信息了。
本想放在一篇寫的,沒想到光爬信息這點東西寫了這麼多寫到這麼晚。。。。可能東拉西扯廢話太多了,下一篇繼續再寫關於數據分析的科普文吧。