提升技能是成為數(shù)據(jù)科學(xué)家的重要組成部分。剛開始時(shí),您主要側(cè)重于學(xué)習(xí)編程語言,正確使用第三方工具,顯示可視化內(nèi)容以及對統(tǒng)計(jì)算法的理論理解。下一步是在更困難的數(shù)據(jù)集上測試您的技能。
有時(shí),這些數(shù)據(jù)集需要大量清理,格式不正確或很難找到。關(guān)于理解我們周圍數(shù)據(jù)的重要性,這里有很多內(nèi)容,但是對于如何實(shí)際獲取數(shù)據(jù)卻幾乎找不到。
隨著您成為數(shù)據(jù)科學(xué)家的成長,最初的數(shù)據(jù)調(diào)查,探索和檢索是最重要的學(xué)習(xí)步驟。從多個(gè)來源中查找和清理數(shù)據(jù)集無疑會產(chǎn)生前期成本—但是一旦您擁有了清理,格式正確且易于理解的數(shù)據(jù)集,回答數(shù)據(jù)上多個(gè)問題的可能性就會大大提高。
在大數(shù)據(jù)分析如何跟蹤遷移模式中,我們將逐步研究,檢索和清理現(xiàn)實(shí)世界的數(shù)據(jù)集。為了紀(jì)念世界候鳥日,我們將使用候鳥數(shù)據(jù)。我們還將介紹構(gòu)建您自己的數(shù)據(jù)集所涉及的成本收益和必要的工具。有了這些基礎(chǔ)知識,您就可以深入研究并找到自己要使用的數(shù)據(jù)集。
研究可用的候鳥數(shù)據(jù)集
您應(yīng)該從一個(gè)關(guān)鍵問題開始每次調(diào)查:我們要學(xué)習(xí)什么?有了這個(gè)問題,找到合適的數(shù)據(jù)集就容易了。對于我們的示例,我們想了解北美鳥類的遷徙方式。要了解這些模式,我們需要在幾年中找到準(zhǔn)確的遷移數(shù)據(jù)。
很難找到這樣的模糊數(shù)據(jù)。可能會有業(yè)余愛好者在個(gè)人網(wǎng)站,論壇或其他渠道上托管自己的數(shù)據(jù),但是業(yè)余數(shù)據(jù)集通常容易出錯(cuò)并且包含丟失的數(shù)據(jù)。相反,我們應(yīng)該尋找在政府或大學(xué)網(wǎng)站上托管的更專業(yè)的數(shù)據(jù)集。
搜尋關(guān)鍵字“鳥類遷徙”,“數(shù)據(jù)庫”和“美國”,我們找到了幾個(gè)有關(guān)鳥類遷徙信息的網(wǎng)站。第一個(gè)是eBird,包含康奈爾實(shí)驗(yàn)室托管的鳥類遷徙數(shù)據(jù)。第二個(gè)是來自美國魚類和野生動物服務(wù)(USFWS)網(wǎng)站,該網(wǎng)站使用合作伙伴關(guān)系和公民研究數(shù)據(jù)來創(chuàng)建報(bào)告。我們希望使用兩種服務(wù)的數(shù)據(jù)集,以便我們可以交叉檢查數(shù)據(jù)并確定不一致之處。
讓我們從eBirds數(shù)據(jù)集開始。
導(dǎo)航到下載頁面,系統(tǒng)將要求您在康奈爾研究實(shí)驗(yàn)室創(chuàng)建一個(gè)帳戶。登錄后,您可以進(jìn)入下載頁面。但是在訪問完整的數(shù)據(jù)集之前,您需要填寫一張表格,描述您打算如何使用數(shù)據(jù)。我們成功填寫了表格并等待了幾天,然后才能完全訪問數(shù)據(jù)集。需要時(shí)間,但不太困難。
接下來,讓我們看一下USFWS。乍一看,該網(wǎng)站似乎比eBirds門戶網(wǎng)站容易使用得多。有一個(gè)明確的鏈接可以指導(dǎo)我們找到完整的數(shù)據(jù)庫列表,其中包含不同的鳥類,地理數(shù)據(jù)點(diǎn)和遷徙飛行路線。如果它們具有有效的鏈接,則這些井井有條且經(jīng)過分類的數(shù)據(jù)集將非常有幫助且易于分析。
不幸的是,從USFWS門戶檢索數(shù)據(jù)并不容易。有多個(gè)無效鏈接,格式不正確的數(shù)據(jù)集以及無法按所宣傳的那樣運(yùn)行的HTML按鈕。盡管這些問題大多是不良的界面設(shè)計(jì),但所有HTTP端點(diǎn)似乎都可以正常運(yùn)行,并且只需使用少量Python代碼,我們就會發(fā)現(xiàn)我們能夠獲取所需的數(shù)據(jù)。
查找數(shù)據(jù)
由于USFWS網(wǎng)站提供的鏈接數(shù)量眾多,很難僅找到可能的數(shù)據(jù)集端點(diǎn)。當(dāng)我們潛入時(shí),我們發(fā)現(xiàn)的第一個(gè)成功數(shù)據(jù)集是通過鏈接到USFWS發(fā)布的水禽飛行方式數(shù)據(jù)手冊。該數(shù)據(jù)手冊據(jù)說包含了我們進(jìn)行調(diào)查所需的所有信息,但存在一個(gè)主要缺陷:它以PDF格式存儲。由于PDF的結(jié)構(gòu)不一致,因此很難解析它們,因此這應(yīng)該是最后的選擇。
致力于水鳥飛行路線模式的數(shù)據(jù)集,我們決定遵循另一條鏈接到USFWS報(bào)告的路徑。這些報(bào)告被描述為1995年以來有關(guān)北美水禽飛行路線模式的調(diào)查數(shù)據(jù)。正是我們想要的。單擊報(bào)告的鏈接后,我們將看到服務(wù)條款和免責(zé)聲明阻止程序。接受后,有一個(gè)報(bào)告生成表格,使研究人員能夠限制有關(guān)水禽類型,狀態(tài)或發(fā)現(xiàn)該水禽的“圖”的數(shù)據(jù)。
而不是限制數(shù)據(jù),我們選擇表單中的每個(gè)值,然后按提交。最后,我們向您展示了一個(gè)分頁表格,其中包含完整數(shù)據(jù)集的樣本。
滾動到頁面底部,還有整個(gè)數(shù)據(jù)集的下載按鈕!不幸的是,按下按鈕會將我們重定向到403 Unauthorized頁面。
有點(diǎn)沮喪,但并非沒有希望,我們正在尋找解決方案。首先,我們追溯為檢索數(shù)據(jù)而采取的步驟。這些步驟是導(dǎo)航到下載頁面,提交簡單的表單提交,解析HTML格式的表并在數(shù)據(jù)的每一頁上運(yùn)行解析器??紤]這些步驟,我們意識到可以使用Python網(wǎng)絡(luò)抓取腳本輕松地將它們自動化!
下載數(shù)據(jù)
我們將使用兩個(gè)主要包來抓取數(shù)據(jù)。
1)請求(用于發(fā)出HTTP請求)
2)beautifulsoup(用于解析HTML)
首先,requests執(zhí)行HTTP請求,表單提交和下載HTML表文件。使用Chrome Dev Tools,我們將導(dǎo)航到調(diào)查表單頁面,并填寫表單中的所有值,然后按下Submit按鈕,然后檢查請求的標(biāo)題。
我們分別突出顯示了請求類型,URL和表單數(shù)據(jù)的字段。從屏幕截圖中,要生成報(bào)告,我們需要使用給定的表單數(shù)據(jù)將POST請求發(fā)送到URL。為了使事情變得簡單,我們將使用URL編碼的表單數(shù)據(jù)源代碼。然后,我們將使用以下代碼段使用和內(nèi)容類型標(biāo)頭來發(fā)出POST請求。requests.post()x-www-form-urlencoded
這種感覺是正確的,但是我們?nèi)鄙俚闹匾M成部分,我們才能發(fā)出請求。如果要運(yùn)行該代碼段,那么我們的請求將被所需的條款和條件頁面阻止,而不是返回報(bào)告?;叵胍幌拢琔SFWS要求您在使用數(shù)據(jù)之前接受其免責(zé)聲明。
要解決此問題,請注意,在接受條款和條件時(shí),您的瀏覽會話擁有對其余報(bào)告的完全訪問權(quán)限。要在Python腳本中重新創(chuàng)建此行為,我們需要實(shí)例化一個(gè)持久requests.Session對象。使用該requests.Session對象,我們將導(dǎo)航到“接受”頁面來接受免責(zé)聲明,并且在經(jīng)過身份驗(yàn)證的會話中,我們將提交表單數(shù)據(jù)。
總之,它看起來像:
成功!我們根據(jù)需要獲得了報(bào)告表,但是請注意,有616頁的數(shù)據(jù)要解析。我們可以減少數(shù)量的一種方法是選擇更多數(shù)量的textRows表單值。讓我們將其更改為每個(gè)表99行的最大值。
現(xiàn)在我們已擁有每頁的最大行數(shù),我們可以轉(zhuǎn)到HTML解析步驟。
解析數(shù)據(jù)
要解析數(shù)據(jù),我們需要BeautifulSoup使用報(bào)告響應(yīng)HTML字符串創(chuàng)建一個(gè)對象。在后臺,該BeautifulSoup對象將HTML字符串轉(zhuǎn)換為樹狀數(shù)據(jù)結(jié)構(gòu)。這樣可以輕松查詢諸如包含報(bào)告數(shù)據(jù)的標(biāo)簽之類的標(biāo)簽。
使用我們的可分析對象,我們現(xiàn)在可以在HTML文檔中搜索該標(biāo)記。在文檔中,報(bào)告數(shù)據(jù)在第二個(gè)中,因此我們將使用該.findAll()方法并在列表中選擇第二個(gè)項(xiàng)目。然后,我們將過濾表的所有行,并將它們設(shè)置為rows變量。
接下來,我們要提取標(biāo)題行并清理值。作為參考,HTML表格的標(biāo)題行使用標(biāo)記格式化,數(shù)據(jù)行使用格式化。要獲取標(biāo)簽值,我們需要調(diào)用標(biāo)簽的.string屬性BeautifulSoup。我們將從表的第一行中獲取標(biāo)頭值。
提取標(biāo)題后,就該從行中獲取數(shù)據(jù)了。我們將遍歷該表的各行,找到所有標(biāo)簽,并將其分配給新行。此外,我們將合并標(biāo)題和行,然后清理一些空白值,以使其更易于解析。
使用進(jìn)行更多的unicode清理后unicodedata.normalize(),我們應(yīng)該獲得以下輸出:
解析表之后,我們可以遍歷數(shù)據(jù)集的每一頁并將值組合在一起。
放在一起
在構(gòu)建完整的數(shù)據(jù)集之前,尚需實(shí)現(xiàn)三個(gè)部分:
1)查找要分頁的數(shù)據(jù)總頁數(shù)。
2)創(chuàng)建一個(gè)form_data模板以動態(tài)修改表單數(shù)據(jù)。
3)循環(huán)瀏覽頁面并合并所有行。
我們將從第一點(diǎn)開始。窺視報(bào)告頁面的HTML,我們看到總頁數(shù)在標(biāo)題中。我們可以從標(biāo)題中提取總數(shù)的一種方法是從標(biāo)題中分離數(shù)字,然后將其轉(zhuǎn)換為整數(shù)。這是可行的,但是依靠標(biāo)題字符串的解決方案太脆弱了。
相反,如果我們仔細(xì)查看表單數(shù)據(jù),則會有一個(gè)隱藏的輸入字段為我們完成工作。在標(biāo)記的底部,帶有的輸入值name=txtLastPage。使用BeautifulSoup,我們只需搜索輸入標(biāo)簽和匹配名稱,然后將值轉(zhuǎn)換為整數(shù)。這是一個(gè)潛在的實(shí)現(xiàn)。
現(xiàn)在,我們要一起添加模板和分頁。首先,我們將創(chuàng)建一個(gè)字符串模板,該模板form_data使用字符串格式提交動態(tài)表單數(shù)據(jù)。在我們的情況下,我們要?jiǎng)討B(tài)修改當(dāng)前頁面值。接下來,我們將找到使用頁面總數(shù)的值并保持循環(huán),直到我們學(xué)會了數(shù)據(jù)集。經(jīng)過一點(diǎn)清理,我們得到以下最終實(shí)現(xiàn):
太棒了!我們已經(jīng)提取了完整的數(shù)據(jù)集,并且它也處于Python可讀狀態(tài)。從這里,我們可以添加更多數(shù)據(jù)清理功能,將表保存到文件中,并對數(shù)據(jù)進(jìn)行一些分析。
結(jié)論
使用一些基本的Python Web抓取,我們能夠:
1)使用會話訪問僅經(jīng)過身份驗(yàn)證的內(nèi)容。
2)解析HTML表格數(shù)據(jù)并將其映射到Python列表列表。
3)跨多個(gè)HTML頁面自動抓取數(shù)據(jù)集。
從這個(gè)例子中,我們能夠證明Python的Web抓取能力,用于數(shù)據(jù)調(diào)查,清理和檢索。如文章開頭所述,在詢問數(shù)據(jù)科學(xué)中更困難的問題時(shí),您需要查找自己的數(shù)據(jù)集。網(wǎng)絡(luò)上有大量可用數(shù)據(jù)。一旦您擁有查找和收集此數(shù)據(jù)的工具和經(jīng)驗(yàn),您將在分析中獲得很高的回報(bào)。
如果您想更新示例,請?zhí)砑右韵聝?nèi)容:
1)使用表數(shù)據(jù)創(chuàng)建一個(gè)CSV文件。
2)使用協(xié)程或線程加快網(wǎng)絡(luò)呼叫的阻塞。
3)循環(huán)瀏覽頁面,而不必兩次請求第一頁。
4)添加錯(cuò)誤處理以提高代碼的健壯性。
填寫下面表單即可預(yù)約申請免費(fèi)試聽!怕錢不夠?可先就業(yè)掙錢后再付學(xué)費(fèi)! 怕學(xué)不會?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!
?2007-2022/ m.5wd995.cn 北京漫動者數(shù)字科技有限公司 備案號: 京ICP備12034770號 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc