用Python爬取WordPress官網(wǎng)所有插件

轉(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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翠胰,隨后出現(xiàn)的幾起案子容贝,更是在濱河造成了極大的恐慌,老刑警劉巖之景,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斤富,死亡現(xiàn)場離奇詭異,居然都是意外死亡锻狗,警方通過查閱死者的電腦和手機满力,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門焕参,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人油额,你說我怎么就攤上這事叠纷。” “怎么了潦嘶?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵涩嚣,是天一觀的道長。 經(jīng)常有香客問我掂僵,道長航厚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任锰蓬,我火速辦了婚禮幔睬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘互妓。我一直安慰自己溪窒,他們只是感情好坤塞,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布冯勉。 她就那樣靜靜地躺著,像睡著了一般摹芙。 火紅的嫁衣襯著肌膚如雪灼狰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天浮禾,我揣著相機與錄音交胚,去河邊找鬼。 笑死盈电,一個胖子當(dāng)著我的面吹牛蝴簇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匆帚,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼熬词,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吸重?” 一聲冷哼從身側(cè)響起互拾,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚎幸,沒想到半個月后颜矿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡嫉晶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年骑疆,在試婚紗的時候發(fā)現(xiàn)自己被綠了田篇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡箍铭,死狀恐怖斯辰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坡疼,我是刑警寧澤彬呻,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站柄瑰,受9級特大地震影響闸氮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜教沾,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一蒲跨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧授翻,春花似錦或悲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淮菠,卻和暖如春男公,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背合陵。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工枢赔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拥知。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓踏拜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親低剔。 傳聞我的和親對象是個殘疾皇子速梗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下載即可。 安裝...
    慫恿的大腦閱讀 1,246評論 0 7
  • 本文承接上一篇爬蟲開篇的說明----上一篇已經(jīng)很好的用到了reqquests,Beautifulsoup等庫户侥,以及...
    strive魚閱讀 1,973評論 0 4
  • 事實上是我們好多人都不知道珍惜镀琉。世上有很多我們值的去珍惜的事情。諸如健康青春蕊唐,情感屋摔,以及那一方藍(lán)天,那一絲快樂替梨。失...
    怡悅詩茵閱讀 136評論 1 1
  • 簡介及游戲規(guī)則 親愛的簡書钓试,其他人都是這樣開頭的嗎装黑?我正在努力逃亡,希望不會被捉到…… 等等弓熏,我感到有股視線在偷窺...
    季候鳥閱讀 550評論 2 0
  • 我不知道茶館對于成都來講恋谭,意味著什么? 王笛在《茶館:成都的公共生活和微觀世界 1900---1950》中的研究對...
    Andylee閱讀 1,108評論 0 4