
大數(shù)據(jù)時(shí)代,這項(xiàng)收集數(shù)據(jù)的技能不可少
大數(shù)據(jù)是未來的“新石油”?!度祟惡喪罚簭膭?dòng)物到上帝》的作者尤瓦爾·赫拉利說:大數(shù)據(jù)將是人類自由意志的終結(jié),數(shù)據(jù)主義將取代以往的宗教和人文主義,成為未來的信仰。人人都在談大數(shù)據(jù),談DT時(shí)代,我們剝?nèi)ド鐣?huì)附加上的外衣,則回歸“數(shù)據(jù)”二字。
那如何獲取數(shù)據(jù)呢?
在運(yùn)營公眾號這么長一段時(shí)間,經(jīng)常有人問超模君:超模君,我需要什么的數(shù)據(jù),該怎么處理,或者直接問超模君,能不能給我提供一些數(shù)據(jù)?
其實(shí)超模君內(nèi)心是奔潰的。。。而一般我給出的建議如果沒有整理好的數(shù)據(jù),可以嘗試做個(gè)爬蟲試試。而在獲取數(shù)據(jù)的道路上并不簡單,爬蟲可謂是“麻雀雖小,五臟俱全”,爬蟲雖然操作起來很簡單,用十幾行腳本語言就可以搞定,但其中可涉及到網(wǎng)絡(luò)通信,字符串處理,數(shù)據(jù)庫等,能使用到一種語言的幾乎所有組件。
一言不合就上代碼
我們先來看一個(gè)最簡單的最簡單的爬蟲,用python寫成,只需要三行。
import requests
url="http://www.cricode.com"
r=requests.get(url)
上面這三行爬蟲程序,就如下面這三行情詩一般,很干脆利落。
是好男人,
就應(yīng)該在和女友吵架時(shí),
抱著必輸?shù)男膽B(tài)。
上面那個(gè)最簡單的爬蟲,不是一個(gè)完整的爬蟲,因?yàn)榕老x通常需要以下3個(gè)步驟:
1)給定的種子URLs,爬蟲程序?qū)⑺蟹N子URL頁面爬取下來
2)爬蟲程序解析爬取到的URL頁面中的鏈接,將這些鏈接放入待爬取URL集合里
3)重復(fù)1、2步,直到達(dá)到指定條件才終止爬取
因此,一個(gè)完整的爬蟲大概是這樣子的:
import requests #用來爬取網(wǎng)頁
from bs4 import BeautifulSoup #用來解析網(wǎng)頁
seds = ["http://www.hao123.com", #我們的種子
"http://www.csdn.net",
"http://www.cricode.com"]
sum = 0 #我們設(shè)定終止條件為:爬取到100000個(gè)頁面時(shí),就不玩了
while sum < 10000 :
if sum < len(seds):
r = requests.get(seds[sum])
sum = sum + 1
do_save_action(r)
soup = BeautifulSoup(r.content)
urls = soup.find_all("href",.....) //解析網(wǎng)頁
for url in urls:
seds.append(url)
else:
break
上面那個(gè)完整的爬蟲,不足20行代碼,相信你能找出20個(gè)需要改進(jìn)的地方來。因?yàn)樗娜秉c(diǎn)實(shí)在是太多了。下面列舉一下它的N個(gè)缺點(diǎn):
1)我們的任務(wù)是爬取1萬個(gè)網(wǎng)頁,按上面這個(gè)程序,一個(gè)人在默默的爬取,假設(shè)爬起一個(gè)網(wǎng)頁3秒鐘,那么,爬一萬個(gè)網(wǎng)頁就要3萬秒鐘。MGD,我們可以考慮開啟多個(gè)線程去一起爬取,或者用分布式架構(gòu)去并發(fā)地爬取網(wǎng)頁。
2)種子URL和后續(xù)解析到的URL都放在一個(gè)列表里,我們應(yīng)該將這些待爬取的URL存放到一個(gè)新的更合理的數(shù)據(jù)結(jié)構(gòu)里,例如隊(duì)列或者優(yōu)先隊(duì)列。
3)對各個(gè)網(wǎng)站的URL,我們一視同仁,然而,我們應(yīng)該是要區(qū)別對待的。應(yīng)當(dāng)考慮大站好站優(yōu)先原則。
4)我們每次發(fā)起請求,都是根據(jù)URL來發(fā)起的,而在這個(gè)過程中會(huì)牽涉到DNS解析(將URL轉(zhuǎn)換成 IP 地址)。一個(gè)網(wǎng)站通常有數(shù)以萬計(jì)的URL,所以我們可以考慮將這些網(wǎng)站域名的 IP 地址進(jìn)行緩存,避免每次都發(fā)起DNS請求,浪費(fèi)時(shí)間。
5)解析到網(wǎng)頁中的URLs后,我們沒有做任何去重處理,全部放入了待爬取的列表中。事實(shí)上,可能有很多鏈接是重復(fù)的,我們做了很多無用功。
6)…..
那么,真正的問題來了,學(xué)挖掘機(jī)到底哪家強(qiáng)?
現(xiàn)在我們就來列出上面找出的幾個(gè)問題的解決方案。
1)如何做到并行爬取
我們可以有多重方法去實(shí)現(xiàn)并行。
多線程或者線程池方式,一個(gè)爬蟲程序內(nèi)部開啟多個(gè)線程。同一臺機(jī)器開啟多個(gè)爬蟲程序,這樣,我們就有N多爬取線程在同時(shí)工作。能大大縮短時(shí)間。
此外,當(dāng)我們要爬取的任務(wù)特別多時(shí),一臺機(jī)器、一個(gè)網(wǎng)點(diǎn)明顯不夠,這時(shí)我們就要考慮分布式爬蟲了。常見的分布式架構(gòu)有:主從(Master——Slave)架構(gòu)、點(diǎn)對點(diǎn)(Peer to Peer)架構(gòu),混合架構(gòu)等。
說到分布式架構(gòu),我們需要考慮的問題就有很多,比如我們需要分派任務(wù),各個(gè)爬蟲之間需要通信合作,共同完成任務(wù),不要重復(fù)爬取相同的網(wǎng)頁。分派任務(wù)時(shí)我們要做到公平公正,就需要考慮如何進(jìn)行負(fù)載均衡。負(fù)載均衡,我們第一個(gè)想到的就是Hash,比如根據(jù)網(wǎng)站域名進(jìn)行hash。
負(fù)載均衡分派完任務(wù)之后,并不意味著萬事大吉了,萬一哪臺機(jī)器崩潰了呢?原先指派給崩潰的那臺機(jī)器的任務(wù)應(yīng)該再指派給哪臺機(jī)器?又或者哪天要增加幾臺機(jī)器,任務(wù)重新分配問題該如何解決?
用一致性Hash算法就是一個(gè)比較好的解決方案。
2)如何對待待抓取隊(duì)列
類似于操作系統(tǒng)如何調(diào)度進(jìn)程的場景。
不同的網(wǎng)站,重要程度不同,因此,可以設(shè)計(jì)一個(gè)優(yōu)先級隊(duì)列來存放待爬取的網(wǎng)頁鏈接。這樣一來,每次抓取時(shí),重要的網(wǎng)頁都會(huì)被我們優(yōu)先爬取。
另外,你也可以效仿操作系統(tǒng)的進(jìn)程調(diào)度策略之多級反饋隊(duì)列調(diào)度算法。
3)進(jìn)行DNS緩存
為了避免每次都發(fā)起DNS查詢,我們可以將DNS進(jìn)行緩存。DNS緩存當(dāng)然是設(shè)計(jì)一個(gè)hash表來存儲已有的域名及其 IP 。
4)進(jìn)行網(wǎng)頁去重
說到網(wǎng)頁去重,應(yīng)該都會(huì)想到垃圾郵件過濾。垃圾郵件過濾的一個(gè)經(jīng)典的解決方案是Bloom Filter(布隆過濾器)。布隆過濾器原理簡單來說就是:建立一個(gè)大的位數(shù)組,然后用多個(gè)Hash函數(shù)對同一個(gè)url進(jìn)行hash得到多個(gè)數(shù)字,然后將位數(shù)組中這些數(shù)字對應(yīng)的位置為1。下次再來一個(gè)url時(shí),同樣是用多個(gè)Hash函數(shù)進(jìn)行hash,得到多個(gè)數(shù)字,我們只需要判斷位數(shù)組中這些數(shù)字對應(yīng)的為是全為1,如果全為1,那么說明這個(gè)url已經(jīng)出現(xiàn)過。如此,便完成了url去重的問題。不過,這種方法會(huì)有誤差,但是只要誤差在我們的接受范圍之內(nèi),就像是1萬個(gè)網(wǎng)頁,我們只爬取到了9999個(gè),剩下那1個(gè)網(wǎng)頁,誰在乎呢!
5)數(shù)據(jù)存儲的問題
數(shù)據(jù)存儲同樣是一個(gè)很有技術(shù)含量的問題。用關(guān)系數(shù)據(jù)庫存取還是用NoSQL,或者是自己設(shè)計(jì)特定的文件格式進(jìn)行存儲,都有很大工程可做。
6)如何完成進(jìn)程間通信
分布式爬蟲,離不開進(jìn)程間的通信。我們可以以規(guī)定的數(shù)據(jù)格式進(jìn)行數(shù)據(jù)交互,去完成進(jìn)程間的通信。
7)……
廢話說了那么多,真正的問題來了,問題不是學(xué)挖掘機(jī)到底哪家強(qiáng)?而是如何實(shí)現(xiàn)上面這些東西?。海?
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03