更新 7月16日18點(diǎn)
現(xiàn)在不會(huì)自己寫代碼調(diào)用API的同志們可以直接訪問(wèn)咯
地址 datastack.cc/design
更新一張預(yù)覽圖:
更新 7月16日12點(diǎn)
現(xiàn)在我們可以愉快的使用了橱健,flask API和后臺(tái)服務(wù)已經(jīng)部署在了服務(wù)器上(新加坡)F破拧0萌薄袭灯!
恩残揉,更新一下睬魂,目前已經(jīng)可以在HTML頁(yè)面進(jìn)行數(shù)據(jù)展示了:
我在說(shuō)什么
聲明:
1.我不是一個(gè)標(biāo)題黨
2.我一般只提供干貨
事實(shí)上愚墓,我實(shí)在干這樣一件事杠氢,他大概分為如下幾個(gè)步驟:
一、獲取一些優(yōu)秀的設(shè)計(jì)素材的數(shù)據(jù)
二续崖、存儲(chǔ)和篩選這些數(shù)據(jù)
三敲街、編寫一套API提供數(shù)據(jù)
四、編寫一個(gè)網(wǎng)頁(yè)調(diào)用API 展現(xiàn)數(shù)據(jù)
五严望、編寫iso和android客戶端展現(xiàn)數(shù)據(jù)
應(yīng)用場(chǎng)景:
當(dāng)你在閑暇的時(shí)候多艇,打開(kāi)手機(jī)或者網(wǎng)頁(yè),查看一下最近有沒(méi)有什么好的設(shè)計(jì)素材或者比較感興趣的HTML頁(yè)面像吻。
恩峻黍,你可能看到很多复隆,突然發(fā)現(xiàn)一個(gè)讓你眼前一亮的,然后你手藏了他姆涩。
有一天你正在寫一個(gè)HTML頁(yè)面或者設(shè)計(jì)產(chǎn)品原型挽拂,突然,你的腦子里閃過(guò)一些東西骨饿,于是你打開(kāi)了你的手機(jī)查看了一下收藏夾......
接下來(lái)亏栈,我們就來(lái)看看,如何實(shí)現(xiàn):
數(shù)據(jù)獲取
首先样刷,數(shù)據(jù)主要是從各大免費(fèi)的設(shè)計(jì)素材資源網(wǎng)站拿到的,這需要用到python爬蟲(chóng)览爵。
其次置鼻,這類網(wǎng)站大量的使用了JS來(lái)加載內(nèi)容,我選擇selenium+phantomJS渲染JS蜓竹。
最后箕母,從爬取到的內(nèi)容內(nèi)獲取想要的,我選擇用pyquery來(lái)獲取html節(jié)點(diǎn)(不要問(wèn)為什么俱济,因?yàn)槲伊?xí)慣用jqueryK皇恰)
存儲(chǔ)數(shù)據(jù)
數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)很簡(jiǎn)單,我不過(guò)就是想獲取一張預(yù)覽圖蛛碌,一個(gè)預(yù)覽地址(或者下載地址)聂喇,還有標(biāo)題!
一條數(shù)據(jù)大概會(huì)是這樣:
{
"download": "http://www.doooor.com/thread-2762-1.html",
"preview": "http://img.doooor.com/img/forum/201404/16/173909sczpof6sf26eckcf.jpg.thumb.jpg",
"title": "STARS TOUCH 完全扁平化網(wǎng)頁(yè)設(shè)計(jì)"
}
數(shù)據(jù)持久化
我們對(duì)數(shù)據(jù)的存儲(chǔ)要求不是很高蔚携,因?yàn)樽罱趯W(xué)習(xí)redis希太,所以就用redis,利用快照持久化酝蜒!
爬蟲(chóng)的框架
一誊辉、我不懂什么框架,而且總體來(lái)說(shuō)亡脑,要爬取得網(wǎng)站就那幾個(gè)堕澄。自己編寫一下規(guī)則就好了。
二霉咨、避免重復(fù)工作蛙紫,用redis來(lái)存儲(chǔ)待爬和爬過(guò)的url。
三途戒、分布式惊来? 哈哈,也許棺滞,可能大概是支持的吧裁蚁。
四矢渊、效率?使用了selenium和phantomJS枉证,貌似不用談效率了矮男,不過(guò)有些優(yōu)化的小知識(shí)啦!
五室谚、我是怎么實(shí)現(xiàn)的:
首先毡鉴,我定義了一個(gè)爬蟲(chóng)服務(wù) service.py,主要作用是連接redis秒赤,開(kāi)始爬取工作猪瞬,記錄工作內(nèi)容和工作結(jié)果。
然后入篮,我寫了一個(gè)爬蟲(chóng)工具 servicetools.py, 主要作用是模擬瀏覽器訪問(wèn)url陈瘦,查找需要的元素和內(nèi)容。
service.py 管理者-勞動(dòng)者模式 (管理者M(jìn)aster發(fā)布任務(wù)潮售,勞動(dòng)者Work進(jìn)行具體工作.)
管理者維護(hù)一個(gè)Redis 的 List 按照先進(jìn)先出的模式痊项, 每次發(fā)布一個(gè)url出去
勞動(dòng)者接收到管理者的url,開(kāi)始執(zhí)行網(wǎng)頁(yè)爬取工作酥诽,工作完成后 管理者pop掉這個(gè)url
勞動(dòng)者如果獲取的數(shù)據(jù)是url,則封裝成list 提交給管理者鞍泉, 管理者挨個(gè)push url.
servicetools.py(具體的網(wǎng)頁(yè)爬取工作)
使用phantomJS和selenium結(jié)合,使用pyquery進(jìn)行節(jié)點(diǎn)和內(nèi)容的獲取肮帐,不同的網(wǎng)站需要不同的規(guī)則咖驮。
目前實(shí)現(xiàn)的功能 和存在問(wèn)題:
總體來(lái)說(shuō),運(yùn)行良好训枢,效率足夠(根本不是實(shí)時(shí)系統(tǒng)嘛)游沿!
額,比較費(fèi)內(nèi)存肮砾,可以在晚上睡覺(jué)之前執(zhí)行诀黍,偶爾會(huì)出現(xiàn)假死,主要是phantomJS的優(yōu)化沒(méi)做仗处!
如果程序異常推出眯勾,再次啟動(dòng)依舊能夠繼續(xù)工作,且不重復(fù)之前工作婆誓!
API的實(shí)現(xiàn)
上面的爬蟲(chóng)運(yùn)行半個(gè)小時(shí)之后吃环,大概就會(huì)有500多條有效數(shù)據(jù),這些數(shù)據(jù)全部被存在redis里面(hset)洋幻。
可以參見(jiàn)我之前的文章快速入門 基于Flask實(shí)現(xiàn)Restful風(fēng)格API,比較詳細(xì)的介紹了如何使用flask來(lái)實(shí)現(xiàn)一個(gè)restful的API郁轻。
這里的flask程序需要從redis拿數(shù)據(jù),我自己定義了一個(gè)數(shù)據(jù)源(連接redis分發(fā)數(shù)據(jù))。
目前已經(jīng)完成的工作
目前已經(jīng)基本實(shí)現(xiàn)API獲取數(shù)據(jù)好唯,爬蟲(chóng)還正在努力的運(yùn)行竭沫,穩(wěn)定以后,將會(huì)設(shè)置系統(tǒng)任務(wù)骑篙,在每天半夜3點(diǎn)開(kāi)始蜕提,五點(diǎn)結(jié)束。
看一張效果圖吧:
下一步的工作
繼續(xù)發(fā)現(xiàn)和修補(bǔ)爬蟲(chóng)的bug
增加用戶系統(tǒng)和認(rèn)證機(jī)制谎势,這樣大家就可以收藏了
租一個(gè)云主機(jī)(求有需求的伙伴打賞)
編寫客戶端
公開(kāi)源代碼
最后,如果你對(duì)這個(gè)項(xiàng)目感興趣杨名,請(qǐng)發(fā)我簡(jiǎn)信脏榆,或者直接在下面評(píng)論!
還有台谍,服務(wù)器好貴须喂,真希望有人能打賞,讓我早點(diǎn)把API公開(kāi)典唇。