轉(zhuǎn)自丘壑博客
前言
只要是用WordPress的人或多或少都會裝幾個插件,可以用來豐富擴展WordPress的各種功能份企。圍繞WordPress平臺的插件和主題已經(jīng)建立了一個獨特的經(jīng)濟生態(tài)圈和開發(fā)者社區(qū)蛆楞,養(yǎng)活了眾多的WordPress相關(guān)的開發(fā)公司和開發(fā)者。各種強大的WordPress插件也層出不窮,有的甚至可以做出功能完善的網(wǎng)站终佛,比如招聘網(wǎng)站安接、分類信息網(wǎng)站翔忽、電商網(wǎng)站、點評網(wǎng)站盏檐、培訓(xùn)網(wǎng)站等等歇式,令我贊嘆不已。
最近一直沉迷于研究 WordPress胡野,仿佛事隔多年與初戀情人再續(xù)前緣一般陷入熱戀材失。這幾天突發(fā)奇想把WordPress上這么多眼花繚亂的插件都爬下來,看看能不能分析出一點有意思的東西來硫豆。
總體思路
官網(wǎng)插件的頁面?https://wordpress.org/plugins/?上列出了一共有 54,520 個插件龙巨。記得以前在官網(wǎng)上可以按各種分類瀏覽的,現(xiàn)在只有推薦的插件熊响、收藏的插件旨别、流行的插件幾大類顯示出來,其他的好像只能靠人肉搜索了汗茄。其實挺不方便的昼榛。
那么首先第一步我們要知道取哪里可以找到所有的WordPress插件列表,搜了一圈發(fā)現(xiàn)WordPress的svn上有這個完整的列表剔难,?http://plugins.svn.wordpress.org/?(這個網(wǎng)頁比較大胆屿,5M多,慎點)偶宫,比官網(wǎng)上的還要齊全非迹,一共7萬多個。有了完整列表就好辦了纯趋。
接下來就是要獲取的是插件的各種信息憎兽,比如作者、下載量吵冒、評分等等纯命。這個可以去哪里獲取呢?當(dāng)然最傻的辦法就是根據(jù)上面列表中的插件地址痹栖,把每個插件的網(wǎng)頁down下來再提取亿汞,這也就是爬蟲干的事。不過?WordPress.org?網(wǎng)站自身的?WordPress.org API?已經(jīng)給開發(fā)者提供了非常方便強大的接口揪阿,可以獲取到幾乎所有 wordprss.org 上的主題疗我、插件咆畏、新聞等相關(guān)的信息,也支持各種參數(shù)和查詢吴裤。注意旧找,這個和WordPress的REST API是兩回事÷笪基本上你可以理解成 Apple.com 的 API 和 iOS 的 API 之間的區(qū)別(雖然apple.com并沒有什么API钮蛛。。剖膳。)
比如本次需要插件的一些數(shù)據(jù)愿卒,那就可以使用關(guān)于插件描述的 API,?https://api.wordpress.org/plugins/info/1.0/{slug}.json潮秘,slug也就是每個插件唯一的地址琼开,這個在剛才svn上已經(jīng)可以獲取到了。用這個 API 可以返回關(guān)于插件的 json 格式的各種詳細(xì)信息枕荞,很全面柜候,如下:
有了列表,有了返回格式躏精,接下來就是要把這些信息給扒下來渣刷,其實就是重復(fù)遍歷一遍就可以了,要么用著名 Python 的?Requests庫?循環(huán)一圈矗烛,要么使用 Python 的爬蟲框架?Scrapy, 都是可以的 辅柴。在存儲爬取數(shù)據(jù)存儲方面,本來打算用scrapy并且存入 mongodb 的瞭吃,但是遇到的一個坑是API返回的json對象里version有的key是帶小數(shù)點的碌嘀,比如”0.1″這種是無法直接存入mongodb的,會報錯說key不能包含點.
"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止状,讀寫速度也很快。最后爬完所有數(shù)據(jù)的這個文件有341M之大攒霹。怯疤。。
最后催束,有了數(shù)據(jù)就可以做一些有意思的數(shù)據(jù)分析了集峦,這一步主要會用到的就是一些常見的 Python 的數(shù)據(jù)分析工具和圖表工具,pandas、numpy少梁、seaborn等。根據(jù)上面的返回信息可以看出矫付,能夠分析的維度也是很多的凯沪,比如哪些作者開發(fā)的插件最多、哪些插件的下載量最多买优、哪些類別的插件最多妨马、哪些國家的開發(fā)者最多、每年的插件增長量等等杀赢,甚至更進(jìn)一步可以把所有插件的zip文件下載下來用AI做一些深入的代碼分析等等烘跺,想想還是挺有意思的,本文的目標(biāo)也就是提供一種思路和方法脂崔,希望能拋磚引玉滤淳。
下面進(jìn)開始進(jìn)入代碼的世界吧
爬取數(shù)據(jù)
準(zhǔn)備工作
要爬數(shù)據(jù)一般第一步是要確認(rèn)爬蟲的入口網(wǎng)頁,也就是從哪里開始爬砌左,沿著入口網(wǎng)頁找到下一個URL脖咐,找-爬-找,不斷循環(huán)重復(fù)直到結(jié)束汇歹。一般來說入口網(wǎng)頁的分析都可以在scrapy內(nèi)部進(jìn)行處理屁擅,如果事先就已經(jīng)可以明確知道所有要請求的網(wǎng)頁地址,那么也可以直接把url列表扔進(jìn)scrpay里产弹,讓它順著列表一直爬爬爬就行了派歌。
本次為了說的清晰一點,爬蟲部分不用再次解釋痰哨,所以分步進(jìn)行胶果,先把要爬的所有url準(zhǔn)備好等下可以直接使用。之前說過了斤斧,WordPress所有的插件名稱列表在這里可以找到 http://plugins.svn.wordpress.org/ 稽物,這網(wǎng)頁是一個非常簡單的靜態(tài)網(wǎng)頁,就是一個巨大的ul列表折欠,每一個li就是一個插件名字:
plugins.svn.wordpress.org的網(wǎng)頁源代碼
這里的href就是插件的slug贝或,是wordpress.org用來確定插件的唯一標(biāo)示。解析這種html對Python來說簡直是小菜一碟锐秦,比如最常用的 BeautifulSoup 或者 lxmp咪奖,這次決定嘗試一個比較新的庫,Requests-HTML: HTML Parsing for Humans?,這也是開發(fā)出Requests庫的大神kennethreitz的又一力作酱床,用于解析 HTML 文檔的簡直不要太爽了羊赵。
slug得到后,按照API的url格式地址組合起來,全部寫入一個文件中就可以了昧捷。
python庫requests_html的用法
作為對比闲昭,可以看下用 BeautifulSoup 的方法:
python庫BeautifulSoup的用法
就這么一個簡單對比還是比較明顯的,簡單明了靡挥。最終序矩,這一步的輸出結(jié)果就是這個all_plugins_urls.txt文件了,總共有79223個插件跋破。
有了這個列表簸淀,其實下面的Scrapy步驟其實完全可以不用,直接拿wget都可以全部簡單粗暴的懟下來7萬個json文件:
wget -i all_plugins_urls.txt
或者用requests簡單的遍歷請求一下就完事了毒返,就可以得到所有插件的數(shù)據(jù)租幕,進(jìn)而可以直接進(jìn)入數(shù)據(jù)分析階段了。為了作為演示吧拧簸,也算作是一個簡單的scrapy的介紹劲绪,對于沒有接觸過scrapy的朋友來說,可以是一個很初步的入門介紹盆赤。
安裝 scrapy
這一步最簡單的方式就是pip安裝
pip install Scrapy
scarpy -V # 驗證一下
新建項目 (Project):新建一個新的爬蟲項目
scrapy 提供了完善的命令工具可以方便的進(jìn)行各種爬蟲相關(guān)的操作珠叔。一般來說,使用 scrapy 的第一件事就是創(chuàng)建你的Scrapy項目弟劲。我的習(xí)慣是首先新建一個文件夾(用要爬的網(wǎng)站來命名,這樣可以方便的區(qū)分不同網(wǎng)站的爬蟲項目)作為總的工作區(qū), 然后進(jìn)入這個文件夾里新建一個 scrapy 的項目祷安,項目的名字叫做 scrap_wp_plugins,可以改成你想要的名字
mkdir ~/workplace/wordpress.org-spider
cd ~/workplace/wordpress.org-spider
scrapy startproject? scrap_wp_plugins
這樣就會自動創(chuàng)建好類似如下的文件結(jié)構(gòu):
├── 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 是要使用的爬蟲的模板米间,默認(rèn)的就是用最基本的一個。
name 就是爬蟲的名字膘侮,這個可以隨便取屈糊,等下要開始爬的時候會用到這個名字。好比給你的小蜘蛛取名叫“春十三”琼了,那么在召喚它的時候你就可以大喊一聲:“上吧逻锐!我的春十三!”
domain 是爬蟲運行時允許的域名,好比說:“上吧昧诱!我的春十三晓淀!只沿著這條路線上!”
所以執(zhí)行如下命令即可:
cd scrap_wp_plugins
scrapy genspider plugins_spider wordpress.org
這樣就會在spiders文件夾下生出一個叫plugins_spider.py的爬蟲文件盏档,也就是在這里面可以填充一些爬取邏輯和內(nèi)容解析凶掰。
制作爬蟲(Spider):制作爬蟲開始爬取網(wǎng)頁
首先我們打開scrap_wp_plugins/plugins_spider.py看下里面的內(nèi)容:
Created spider ‘plugins_spider’ using template ‘basic’ in module: scrap_wp_plugins.spiders.plugins_spider
可以看出這就是一個最簡單scrapy的Spider的類而已,自動填入了上一步用來創(chuàng)建爬蟲時的一些參數(shù)妆丘。
name:爬蟲的識別名锄俄,它必須是唯一的局劲,在不同的爬蟲中你必須定義不同的名字勺拣,就是上一步的命令行里寫的plugins_spider.
start_urls:爬蟲開始爬的一個URL列表。爬蟲從這里開始抓取數(shù)據(jù)鱼填,所以药有,第一次下載的數(shù)據(jù)將會從這些URLS開始。其他URL將會從這些起始URL中繼承性生成苹丸。具體來說愤惰,在準(zhǔn)備工作那一部分,我們已經(jīng)得到了一個urls的列表文件all_plugins_urls.txt赘理,現(xiàn)在只需要把這個文件讀取進(jìn)來就好了宦言。
parse():爬蟲的方法,調(diào)用時候傳入從每一個URL傳回的Response對象作為參數(shù)商模,response將會是parse方法的唯一的一個參數(shù),
這個方法負(fù)責(zé)解析返回的數(shù)據(jù)奠旺、匹配抓取的數(shù)據(jù)(解析為item)并跟蹤更多的URL。在本項目中施流,因為返回的是json响疚,不需要解析任何html,這里為了省事我就直接把json整個存儲起來已備后面數(shù)據(jù)分析的時候再選擇需要的字段瞪醋,當(dāng)然你也可以根據(jù)需要選擇過濾掉不需要的json字段忿晕。
所以,我們的第一個爬蟲就呼之欲出了银受!請看代碼践盼,麻雀雖小五臟俱全
a simple spider will crawl all plugins from wordpress.org
運行爬蟲
改完上面的爬蟲代碼,現(xiàn)在就可以讓爬蟲跑起來了宾巍,“上吧宏侍!比卡丘!”
scrapy crawl plugins_spider
哦嚯蜀漆。谅河。。
Forbidden by robots.txt
意外發(fā)生了。绷耍。吐限。啥也沒爬下來?褂始?Don’t Panic?诸典!別慌,仔細(xì)看下報錯信息崎苗,原來是?https://api.wordpress.org/robots.txt?規(guī)定了不允許爬蟲狐粱,而scrapy默認(rèn)設(shè)置里是遵守robot協(xié)議的,所以簡單繞過就行了胆数,打開 setttings.py, 找到下面這行肌蜻,把True改為False,意思是:“愛咋咋地必尼,老子不屌你的robots.txt ”
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
再次運行現(xiàn)在就可以愉快的爬取了蒋搜。還有一點溫馨提示,如果爬取網(wǎng)址數(shù)量比較多判莉,不想中途因為斷網(wǎng)或者其他什么鬼知道的意外中斷豆挽,導(dǎo)致下次又要重新來過,可以加上scrapy的執(zhí)行日志來保存爬蟲狀態(tài)券盅,下次就會從中斷處開始繼續(xù)爬取
scrapy crawl plugins_spider -s JOBDIR=spiderlog? --logfile? log.out? &
這樣就可以安心的去睡個覺帮哈,一早起來就能看到熱呼呼新鮮出路的WordPress所有的插件信息了。
未完待續(xù)
本想放在一篇寫的锰镀,沒想到光爬信息這點東西寫了這么多寫到這么晚娘侍。。互站。私蕾。可能東拉西扯廢話太多了胡桃,下一篇繼續(xù)再寫關(guān)于數(shù)據(jù)分析的科普文吧踩叭。
原文鏈接:https://bestscreenshot.com/scrap-all-plugins-from-wordpress-org/