Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
數(shù)據(jù)與智能 本公眾號(hào)關(guān)注大數(shù)據(jù)與人工智能技術(shù)。由一批具備多年實(shí)戰(zhàn)經(jīng)驗(yàn)的技術(shù)極客參與運(yùn)營(yíng)管理,持續(xù)輸出大數(shù)據(jù)、數(shù)據(jù)分析、推薦系統(tǒng)、機(jī)器學(xué)習(xí)、人工智能等方向的原創(chuàng)文章,每周至少輸出7篇精品原創(chuàng)。同時(shí),我們會(huì)關(guān)注和分享大數(shù)據(jù)與人工智能行業(yè)動(dòng)態(tài)。歡迎關(guān)注。
來(lái)源 | Data Science from Scratch, Second Edition
作者 | Joel Grus
譯者 | cloverErna
校對(duì) | gongyouliu
編輯 | auroral-L
全文共6018字,預(yù)計(jì)閱讀時(shí)間40分鐘。
第九章 獲取數(shù)據(jù)
9.1 stdin 和 stdout
9.2 讀取文件
9.2.1 文本文件基礎(chǔ)
9.2.2 分割的(delimited)文件
9.3 網(wǎng)絡(luò)抓取
9.3.1 HTML和解析方法
9.3.2 例:密切關(guān)注國(guó)會(huì)
9.4 使用API
9.4.1 JSON(和XML)
9.4.2 使用無(wú)驗(yàn)證的API
9.4.3 尋找API
9.5 案例:使用 Twitter API
9.6 延伸學(xué)習(xí)
寫作本書我用了三個(gè)月的時(shí)間;構(gòu)思只用了三分鐘;而收集書中的數(shù)據(jù),則用了我的一生。
——F. 斯科特 · 菲茲杰拉德
為了成為一名數(shù)據(jù)科學(xué)家,你需要數(shù)據(jù)。事實(shí)上,作為數(shù)據(jù)科學(xué)家,你會(huì)花很大一部分時(shí)間來(lái)獲取、清理和轉(zhuǎn)換數(shù)據(jù)。必要時(shí),你總可以自己輸入數(shù)據(jù)(或者可以讓你的助手來(lái)做),但通常這樣做比較浪費(fèi)時(shí)間。本章我們來(lái)看看利用 Python 獲取數(shù)據(jù)并得到正確格式的不同方法。
9.1 stdin和stdout
如果在命令行運(yùn)行 Python 腳本,你可以用 sys.stdin 和 sys.stdout 以管道(pipe)方式傳遞數(shù)據(jù)。例如,以下腳本按行讀入文本,然后輸出與一個(gè)正則表達(dá)式匹配的行:
然后對(duì)收到的行計(jì)數(shù)并輸出計(jì)數(shù)結(jié)果:
你可以用這種方法來(lái)計(jì)數(shù)文件中有多少行包含數(shù)字。在 Windows 中,你可以用:
而在 Unix 系統(tǒng)中,你可以用:
“|”運(yùn)算符是個(gè)管道字符,它的意思是“使用左邊命令的輸出作為右邊命令的輸入”。可以使用這種方法精心設(shè)計(jì)數(shù)據(jù)處理的管道。
注意
如果你使用的是 Windows,你可以在這行命令中去掉所包含的 python 部分:
如果你在Unix系統(tǒng)上,那么這樣做需要更多的步驟。首先添加一個(gè)“Shebang”作為腳本#!/usr/bin/env python的第一行。然后,在命令行中,使用chmod x egrep.py使文件可執(zhí)行。
類似地,下面的這個(gè)腳本計(jì)算了單詞的數(shù)量并給出了最常用的單詞:
之后你可以做這樣的事情:
(如果你正在使用Windows,那么使用type而不是cat。)
注意
如果你是個(gè) Unix 編程老手,你可能會(huì)很熟悉系統(tǒng)里許多內(nèi)置的命令行工具 (比如 egrep),但你自己從零開(kāi)始創(chuàng)建這些工具或許更好一些。畢竟,用到的時(shí)候剛好知道,總是好的。
9.2 讀取文件
可以顯式地用代碼來(lái)讀寫文件。用 Python 處理文件非常簡(jiǎn)便。
9.2.1 文本文件基礎(chǔ)
處理文本文件的第一步是通過(guò) open 命令來(lái)獲取一個(gè)文件對(duì)象:
因?yàn)榉浅H菀淄涥P(guān)閉文件,所以你應(yīng)該在 with 程序塊里操作文件,這樣在結(jié)尾處文件會(huì)被自動(dòng)關(guān)閉:
如果需要讀取一個(gè)完整的文本文件,可以使用 for 語(yǔ)句對(duì)文件的行進(jìn)行迭代:
按這種方法得到的每一行會(huì)用換行符來(lái)結(jié)尾,所以在對(duì)讀入的行操作之前會(huì)經(jīng)常需要用strip() 來(lái)進(jìn)行處理。
例如,假設(shè)你有一個(gè)寫滿電子郵件地址的文件,每個(gè)地址一行,你想利用這個(gè)文件生成域名的直方圖。正確地提取域名的規(guī)則有些微妙--如公共后綴列表,但一個(gè)好的近似方案是只取出電子郵件地址中 @ 后面的部分。(對(duì)于像 joel@mail.
datasciencester.com 這樣的郵件地址,會(huì)給出錯(cuò)誤的答案,但為了本例,我們?cè)敢饨邮埽?/span>
9.2.2 分割的(delimited)文件
我們剛剛處理的假想電子郵件地址文件每行只有一個(gè)地址。更常見(jiàn)的情況是你會(huì)處理每一行包含許多數(shù)據(jù)的文件。這種文件通常是用逗號(hào)分割或tab分割的:每一行有許多字段,用逗號(hào)或tab來(lái)表示一個(gè)字段的結(jié)束和另一個(gè)字段的開(kāi)始。
這開(kāi)始變得復(fù)雜了,各字段中帶有逗號(hào)、tab 和換行符(這是你不可避免地要處理的)。因?yàn)檫@個(gè)原因,幾乎總是會(huì)犯的一個(gè)錯(cuò)誤是你自己嘗試去解析它們。相反,你應(yīng)該使用Python的csv模塊(或者pandas庫(kù),或其他一些設(shè)計(jì)用來(lái)讀取逗號(hào)分隔或制表符分隔的文件的庫(kù))。
警告
不要自己解析逗號(hào)分隔的文件。 你會(huì)把一些特殊情況搞砸的!
如果文件沒(méi)有頭部(意味著你可能想把每一行作為一個(gè)列表,這帶來(lái)的麻煩是你需要知道每一列是什么),你可以使用 csv.reader 對(duì)行進(jìn)行迭代,每一行都會(huì)被處理成恰當(dāng)劃分的列表。
例如,如果有這樣一個(gè)用 tab 劃分的股票價(jià)格文件:
我們可以用下面的程序塊來(lái)處理:
如果文件存在頭部:
你既可以利用對(duì) read.next() 的初始調(diào)用跳過(guò)頭部的行,也可以利用 csv.DictReader 把每一行讀成字典(把頭部作為關(guān)鍵字):
即使你的文件缺少頭部,你仍可以通過(guò)把關(guān)鍵字作為文件名參數(shù)傳輸來(lái)使用 DictReader。
同樣,你可以用 csv.writer 來(lái)寫限制的文件:
如果行中的各字段本身包含逗號(hào),csv.writer 可以正確處理。但你自己手動(dòng)寫成的則很可能不會(huì)正確處理。比如,如果你嘗試這樣做:
你最終會(huì)得到像下面這樣一個(gè)csv文件,它看起來(lái)像這樣:
沒(méi)人能看懂它的意思。
9.3 網(wǎng)絡(luò)抓取
另一種獲取數(shù)據(jù)的方法是從網(wǎng)頁(yè)抓取數(shù)據(jù)。事實(shí)證明,獲取網(wǎng)頁(yè)很容易;但從網(wǎng)頁(yè)上抓取有意義的結(jié)構(gòu)化信息就不那么容易了。
9.3.1 HTML和解析方法
網(wǎng)絡(luò)上的頁(yè)面是由 HTML 寫成的,其中文本被(理想化地)標(biāo)記為元素和它們的屬性:
在理想的情況下,所有的網(wǎng)頁(yè)按語(yǔ)義標(biāo)記,這對(duì)我們很方便,我們可以使用類似這樣的規(guī)則來(lái)提取數(shù)據(jù):找到 id 是 subject 的 <p> 元素并返回它所包含的文本。但在真實(shí)的世界中,HTML 并不總是具有很好的格式的,更不用說(shuō)注解了。這意味著如果我們想搞清其含義,需要一些幫助。
為 了 從 HTML 里 得 到 數(shù) 據(jù), 我 們 需 要 使 用 BeatifulSoup 庫(kù),它對(duì)來(lái)自網(wǎng)頁(yè)的多種元素建立了樹(shù)結(jié)構(gòu),并提供了簡(jiǎn)單的接口來(lái)獲取它們。本書寫作時(shí),最新的版本是 Beatiful Soup 4.6.0,我們即將用到的就是這個(gè)版本。我們也會(huì)用到 requests 庫(kù),它與內(nèi)置在 Python 中的其他方法相比,是一種發(fā)起HTTP 請(qǐng)求的更好的方式。
Python 內(nèi)置的 HTML 解析器是有點(diǎn)嚴(yán)格的,這意味著它并不總是能處理那些沒(méi)有很好地格式化的 HTML。因此,我們需要使用另外一種解析器,它需要先安裝:
確保你處于正確的虛擬環(huán)境中,安裝庫(kù):
為了使用 Beatiful Soup,我們要把一些 HTML 傳遞給 BeautifulSoup() 函數(shù)。在我們的例子中,這些 HTML 是對(duì) requests.get 進(jìn)行調(diào)用的結(jié)果:
完成這個(gè)步驟之后,我們可以用一些簡(jiǎn)單的方法得到完美的解析。
通常我們會(huì)處理一些 Tag 對(duì)象,它們對(duì)應(yīng)于 HTML 頁(yè)面結(jié)構(gòu)的標(biāo)簽表示。
比如,找到你能用的第一個(gè) <p> 標(biāo)簽(及其內(nèi)容):
可以對(duì) Tag 使用它的 text 屬性來(lái)得到文本內(nèi)容:
另外可以把標(biāo)簽當(dāng)作字典來(lái)提取其屬性:
可以一次得到多個(gè)標(biāo)簽:
通常你會(huì)想通過(guò)一個(gè)類(class)來(lái)找到標(biāo)簽:
此外,可以把這些方法組合起來(lái)運(yùn)用更復(fù)雜的邏輯。比如,如果想找出包含在一個(gè) <div>元素中的每一個(gè) <span> 元素,可以這么做:
僅僅上述幾個(gè)特性就可以幫助我們做很多事。如果你需要做更復(fù)雜的事情(或僅僅是出于好奇),那就去查看文檔吧。
當(dāng)然,無(wú)論多重要的數(shù)據(jù),通常也不會(huì)標(biāo)記成。你需要仔細(xì)檢查源HTML,通過(guò)你選擇的邏輯進(jìn)行推理,并多考慮邊界情況來(lái)確保數(shù)據(jù)的正確性。接下來(lái)我們看一個(gè)例子。
9.3.2 例:密切關(guān)注國(guó)會(huì)
數(shù)據(jù)科學(xué)公司的政策副總裁擔(dān)心對(duì)數(shù)據(jù)科學(xué)行業(yè)的潛在監(jiān)管,并要求你量化國(guó)會(huì)對(duì)這個(gè)話題的看法。他特別希望你能找到所有有發(fā)布“數(shù)據(jù)”新聞稿的代表。
在發(fā)布時(shí),有一個(gè)頁(yè)面有所有代表網(wǎng)站的鏈接
如果你“查看來(lái)源”,所有網(wǎng)站的鏈接看起來(lái)都像:
讓我們從收集從該頁(yè)面鏈接到的所有URL開(kāi)始:
這將返回太多的URL。如果你看它們,我們從http://或者h(yuǎn)ttps://開(kāi)始,中間是某種名字,并以 .house.gov 或者 .house.gov/. 結(jié)束。
這是一個(gè)使用正則表達(dá)式的好地方:
這仍然太多,因?yàn)橹挥?35名代表。如果你看一下清單,有很多重復(fù)。我們可以用set來(lái)克服這些問(wèn)題:
總是有幾個(gè)眾議院的座位空著,或者可能有一些沒(méi)有網(wǎng)站的代表。無(wú)論如何,這已經(jīng)足夠好了。當(dāng)我們查看這些網(wǎng)站時(shí),大多數(shù)網(wǎng)站都有新聞稿的鏈接。例如:
請(qǐng)注意,這是一個(gè)相對(duì)鏈接,這意味著我們需要記住原始站點(diǎn)。讓我們來(lái)抓取一下:
注意
通常情況下,像這樣隨意地爬一個(gè)網(wǎng)站是不禮貌的。 大多數(shù)網(wǎng)站都會(huì)有一個(gè)robots.txt文件,該文件表明你可以頻繁地抓取站點(diǎn)(以及你不應(yīng)該抓取哪些路徑),但由于這是國(guó)會(huì),我們不需要特別禮貌。
如果你通過(guò)滾動(dòng)來(lái)查看它們,你將會(huì)看到大量/媒體/新聞稿和媒體中心/新聞稿,以及各種其他地址。其中一個(gè)URL是https://jayapal.house.gov/media/press-releases.
記住,我們的目標(biāo)是找出哪些國(guó)會(huì)議員提到“數(shù)據(jù)”。“我們會(huì)寫一個(gè)稍微更通用的功能,檢查一頁(yè)新聞稿中是否提到任何給定的術(shù)語(yǔ)。
如果你訪問(wèn)該網(wǎng)站并查看源代碼,似乎在<p>標(biāo)簽中有來(lái)自每個(gè)新聞稿的片段,因此我們將使用它作為我們的第一次嘗試:
讓我們?yōu)樗鼘懸粋€(gè)快速測(cè)試:
最后我們準(zhǔn)備找到相關(guān)國(guó)會(huì)議員,并告知他們的姓名給政策副總裁:
當(dāng)我運(yùn)行這個(gè)時(shí),我得到了大約20名代表的名單。你的結(jié)果可能會(huì)不同。
注意
如果你查看不同的“新聞稿”頁(yè)面,它們中的大多數(shù)都是分頁(yè)的,每頁(yè)只有5或10個(gè)新聞稿。 這意味著我們只檢索了每位國(guó)會(huì)議員最近的幾份新聞稿。 一個(gè)更徹底的解決方案將在頁(yè)面上迭代并檢索每個(gè)新聞稿的全文。
9.4 使用API
許多網(wǎng)站和網(wǎng)絡(luò)服務(wù)提供相應(yīng)的應(yīng)用程序接口(Application Programming Interface,APIS),允許你明確地請(qǐng)求結(jié)構(gòu)化格式的數(shù)據(jù)。這省去了你不得不抓取數(shù)據(jù)的麻煩!
9.4.1 JSON(和XML)
因?yàn)?HTTP 是一種轉(zhuǎn)換文本的協(xié)議,你通過(guò)網(wǎng)絡(luò) API 請(qǐng)求的數(shù)據(jù)需要序列化(serialized)地 轉(zhuǎn) 換 為 字 符 串 格 式。通 常 這 種 串 行 化 使 用JavaScript 對(duì) 象 符 號(hào)(JavaScript Object Notation,JSON)。JavaScript 對(duì)象看起來(lái)和 Python 的字典很像,使得字符串表達(dá)非常容易解釋:
我們可以使用 Python 的 json 模塊來(lái)解析 JSON。尤其是,我們會(huì)用到它的 loads 函數(shù),這個(gè)函數(shù)可以把一個(gè)代表JSON對(duì)象的字符串反序列化(deserialize)為 Python 對(duì)象:
有時(shí)候 API 的提供者可能會(huì)不那么友好,只給你提供 XML 格式的響應(yīng):
我們也可以仿照從 HTML 獲取數(shù)據(jù)的方式,用 BeautifulSoup 從 XML 中獲取數(shù)據(jù);更多細(xì)節(jié)可查閱文檔。
9.4.2 使用無(wú)驗(yàn)證的API
現(xiàn)在大多數(shù)的 API 要求你在使用之前先驗(yàn)證身份。而若我們不愿勉強(qiáng)自己屈就這種政策,API 會(huì)給出許多其他的陳詞濫調(diào)來(lái)阻止我們的瀏覽。因此,先來(lái)看一下 GitHub 的API,利用它我們可以做一些簡(jiǎn)單的無(wú)需驗(yàn)證的事情:
此處 repos 是一個(gè) Python 字典的列表,其中每一個(gè)字典表示我的 GitHub 賬戶的一個(gè)代碼倉(cāng)庫(kù)。(可以隨意替換成你的用戶名,以獲取你的代碼倉(cāng)庫(kù)的數(shù)據(jù)。你有 GitHub 賬號(hào),對(duì)吧?)
我們可以使用它來(lái)找出一周中最有可能創(chuàng)建哪些月份和天數(shù)的存儲(chǔ)庫(kù)。唯一的問(wèn)題是,響應(yīng)中的日期是字符串:
Python 本身沒(méi)有很強(qiáng)大的日期解析器,所以我們需要安裝一個(gè):
其中你需要的可能只是 dateutil.parser.parse 函數(shù):
類似地,你可以獲取我最后五個(gè)代碼倉(cāng)庫(kù)所用的語(yǔ)言:
通常我們無(wú)需在“做出請(qǐng)求而且自己解析響應(yīng)”這種低層次上使用 API。使用 Python 的好處之一是已經(jīng)有人建好了庫(kù),方便你訪問(wèn)你感興趣的幾乎所有 API。這些庫(kù)可以把事情做好,為你省下查找 API 訪問(wèn)的諸多冗長(zhǎng)細(xì)節(jié)的麻煩。(如果這些庫(kù)不能很好地完成任務(wù),或者它們依賴的是對(duì)應(yīng)的 API 已失效的版本,那就會(huì)給你帶來(lái)巨大的麻煩。)
盡管如此,偶爾你還是需要操作你自己的 API 訪問(wèn)庫(kù)(或者,更常見(jiàn)的,去調(diào)試別人不能順利操作的庫(kù)),所以了解一些細(xì)節(jié)是很有好處的。
9.4.3 尋找API
如果你需要一個(gè)特定網(wǎng)站的數(shù)據(jù),可以查看它的開(kāi)發(fā)者部分或 API 部分的細(xì)節(jié),然后以關(guān)鍵詞“python <站點(diǎn)名> api”在網(wǎng)絡(luò)上搜索相應(yīng)的庫(kù)。
有Yelp API、Instagram API、Spotify API等庫(kù)。
如果你想查看有 Python 封裝的 API 列表,那么在GitHub上有一個(gè)來(lái)自Real Python的不錯(cuò)的API列表(https://github.com/realpython/list-of-python-api-wrappers)。
如果最終還是找不到你需要的 API,還是可以通過(guò)抓取獲得的。這是數(shù)據(jù)科學(xué)家最后的絕招。
9.5 案例:使用Twitter API
Twitter 是一個(gè)非常好的數(shù)據(jù)源。你可以從它得到實(shí)時(shí)的新聞,可以用它來(lái)判斷對(duì)當(dāng)前事件的反應(yīng),可以利用它找到與特定主題有關(guān)的鏈接。使用 Twitter 可以做幾乎任何你能想到的事,只要你能獲得它的數(shù)據(jù)。可以通過(guò)它的 API 來(lái)獲得數(shù)據(jù)。
為了和 Twitter API 互動(dòng),我們需要使用 Twython 庫(kù)(python -m pip install twython)。實(shí)際上有很多 Python Twitter 的庫(kù),但這一個(gè)是我用過(guò)的庫(kù)中最好用的一個(gè)。你也可以嘗試一下其他的庫(kù)。
獲取憑據(jù)
為了使用 Twitter 的 API,需要先獲取一些證明文件(為此你無(wú)論如何都要有一個(gè) Twitter的賬戶,這樣你就能成為一個(gè)活躍友好的 Twitter #datascience 社區(qū)的一部分)。
注意
就像那些所有我不能控制的網(wǎng)站的指令一樣,它們會(huì)在某個(gè)時(shí)刻過(guò)時(shí),但是現(xiàn)在還是能發(fā)揮一段時(shí)間的作用的。(盡管在我寫作本書的這段時(shí)間里,它們至少已經(jīng)變更過(guò)一次了,所以祝你好運(yùn)!)
以下是步驟:
1. 找到鏈接 https://apps.twitter.com/。
2. 如果你還沒(méi)有注冊(cè),點(diǎn)擊“注冊(cè)”,并輸入你的 Twitter 用戶名和密碼。
3.單擊Apply申請(qǐng)開(kāi)發(fā)人員帳戶。
4.請(qǐng)求訪問(wèn)以供你自己使用。
5.填寫申請(qǐng)書。它需要填寫300字(真的)說(shuō)明清楚你為什么需要訪問(wèn)數(shù)據(jù),所以為了通過(guò)審核,你可以告訴他們這本書以及你有多喜歡它。
6.等一段不確定的時(shí)間。
7.如果你認(rèn)識(shí)在Twitter上工作的人,給他們發(fā)郵件,問(wèn)他們是否可以加快你的申請(qǐng)。否則,請(qǐng)繼續(xù)等待。
8.獲得批準(zhǔn)后,請(qǐng)返回到developer.twitter.com,找到“應(yīng)用程序”部分,然后單擊“創(chuàng)建應(yīng)用程序。”
9.填寫所有必需的字段(同樣,如果描述需要額外的字符,你可以討論這本書以及如何找到它)。
10.單擊“創(chuàng)建”。
現(xiàn)在你的應(yīng)用程序應(yīng)該有一個(gè)“鍵和令牌”選項(xiàng)卡,其中包含“消費(fèi)者API公鑰”部分,其中列出了“API公鑰”和“API密鑰”。“注意這些鍵;你需要它們。(而且,對(duì)他們保密!它們就像是密碼一樣。)
小心
不要分享它們,不要把它們印在書里,也不要把它們記錄在 GitHub 公共代碼庫(kù)里。一種簡(jiǎn)單的方法是把它們存儲(chǔ)在不會(huì)被簽入(checked in)的 credentials.json文件里,而且可以使用 json.loads 取回它們。另一個(gè)解決方案是將它們存儲(chǔ)在環(huán)境變量中,并使用os.environ檢索它們。
使用Twython
使用Twitter API最棘手的部分是認(rèn)證。(事實(shí)上,這是使用大量API最棘手的部分。) API提供者希望確保你被授權(quán)訪問(wèn)他們的數(shù)據(jù),并且你不會(huì)超過(guò)他們的使用限制。他們還想知道誰(shuí)在訪問(wèn)他們的數(shù)據(jù)。
身份驗(yàn)證有點(diǎn)令人痛苦。有一個(gè)簡(jiǎn)單的方法,OAuth 2,當(dāng)你只想做簡(jiǎn)單的搜索時(shí)就足夠了。還有一種復(fù)雜的方式,OAuth 1,當(dāng)你想要執(zhí)行操作(例如推特)或(特別是對(duì)我們)連接到推特流時(shí),這是必需的。
所以我們堅(jiān)持了更復(fù)雜的方式,我們將盡可能多地實(shí)現(xiàn)自動(dòng)化。
首先,你需要API公鑰和API密鑰(有時(shí)分別稱為消費(fèi)公鑰和消費(fèi)密鑰)。我可以從環(huán)境變量中獲得,如果你愿意的話,你可以隨時(shí)替換它們:
現(xiàn)在我們可以實(shí)例化客戶端:
提示
在這一點(diǎn)上,你可能想考慮把ACCESS_TOKEN和ACCESS_TOKEN_SECRET保存在安全的地方,這樣下一次你就不用經(jīng)歷這嚴(yán)格的過(guò)程了。
一旦我們有了一個(gè)經(jīng)過(guò)驗(yàn)證的Twython實(shí)例,我們就可以開(kāi)始執(zhí)行搜索:
如果你運(yùn)行上面這個(gè),你應(yīng)該得到一些推文,比如:
這并不那么有趣,主要是因?yàn)門witter搜索API只是向你顯示了一些最近的結(jié)果。當(dāng)你在做數(shù)據(jù)科學(xué)時(shí),你經(jīng)常想要很多推文。這就是流媒體API有用的地方。它允許你連接到一個(gè)偉大的Twitter“消防水管”。若要使用它,你需要使用訪問(wèn)令牌進(jìn)行身份驗(yàn)證。
為了使用Twython訪問(wèn)流API,我們需要定義一個(gè)從TwythonStreamer繼承并覆蓋它的on_success方法,也可能是它的on_error方法:
MyStreamer 會(huì)連接到 Twitter 流并等待 Twitter 給它發(fā)送數(shù)據(jù)。它每收到一些數(shù)據(jù)(在這里,一條推文表示為一個(gè) Python 對(duì)象)就傳遞給 on_success 方法,如果推文是英文的,這個(gè)方法會(huì)把推文附加到 tweets 列表中,在收集到 1000 條推文后會(huì)斷開(kāi)和流的連接。
剩下的工作就是初始化和啟動(dòng)運(yùn)行了:
它會(huì)一直運(yùn)行下去直到收集 1000條推文為止(或直到遇到一個(gè)錯(cuò)誤為止),此時(shí)就可以著手分析這些推文了。比如,你可以用下面的方法尋找最常見(jiàn)的標(biāo)簽:
每條推文都包含許多數(shù)據(jù)。你可以自己嘗試一下各種方法,或仔細(xì)查閱 Twitter API 的文檔。
注意
在一個(gè)正式的項(xiàng)目中,你可能并不想依賴內(nèi)存中的列表來(lái)存儲(chǔ)推文。相反,你可能想把推文保存在文件或者數(shù)據(jù)庫(kù)中,這樣就可以永久地?fù)碛兴鼈儭?/span>
9.6 延伸學(xué)習(xí)
? pandas是數(shù)據(jù)科學(xué)用來(lái)處理(特別是導(dǎo)入)數(shù)據(jù)的一個(gè)主要的庫(kù)。
? Scrapy是一個(gè)功能很健全的庫(kù),可用來(lái)構(gòu)建更復(fù)雜的網(wǎng)絡(luò)抓取器,來(lái)執(zhí)行類似跟蹤未知鏈接等任務(wù)。
? Kaggle擁有大量數(shù)據(jù)集。
用BeautifulSoup庫(kù)解析 HTML 或 XML 數(shù)據(jù)可以按照以下步驟進(jìn)行:
首先,確保你已經(jīng)安裝了BeautifulSoup庫(kù)。可以使用pip命令進(jìn)行安裝:pip install beautifulsoup4。
導(dǎo)入BeautifulSoup庫(kù)和相關(guān)的解析庫(kù),通常是html.parser或其他適合的解析器。
使用BeautifulSoup的parse方法將 HTML 或 XML 數(shù)據(jù)解析為一個(gè)BeautifulSoup對(duì)象。
通過(guò)find或find_all等方法在BeautifulSoup對(duì)象中查找特定的標(biāo)簽或?qū)傩浴?/p>
對(duì)找到的元素進(jìn)行進(jìn)一步的操作,例如提取文本、獲取屬性值等。
下面是一個(gè)簡(jiǎn)單的示例,演示如何使用BeautifulSoup解析 HTML 數(shù)據(jù):
收起
python
from bs4 import BeautifulSoup
html_data = '''
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
'''
# 解析 HTML 數(shù)據(jù)
soup = BeautifulSoup(html_data, 'html.parser')
# 查找所有包含"sister"類的鏈接
sister_links = soup.find_all('a', class_='sister')
# 打印鏈接的文本和鏈接地址
for link in sister_links:
print(link.text, link.get('href'))
在上述示例中,首先定義了一段 HTML 數(shù)據(jù)。然后,使用BeautifulSoup的parse方法將 HTML 數(shù)據(jù)解析為一個(gè)soup對(duì)象。接下來(lái),使用find_all方法查找所有具有sister類的鏈接,并將它們存儲(chǔ)在sister_links列表中。最后,通過(guò)遍歷sister_links列表,打印每個(gè)鏈接的文本和鏈接地址。
TML:完成頁(yè)面的內(nèi)容展示
CSS:完成頁(yè)面樣式的控制,美化頁(yè)面,完成頁(yè)面的布局。
表單:用于采集用戶輸入的數(shù)據(jù)。用于和服務(wù)器進(jìn)行交互。
form:用于定義表單的。可以定義一個(gè)范圍(代表用戶采集數(shù)據(jù)的范圍)
屬性:action:指定提交數(shù)據(jù)的url(指的就是把數(shù)據(jù)提交到哪里)
method:指定提交方式
分類:一共有7種,2種比較常用。
get:1.請(qǐng)求參數(shù)會(huì)在地址欄顯示
2.請(qǐng)求參數(shù)的長(zhǎng)度是有限制的。
3.請(qǐng)求不安全
post:1.請(qǐng)求參數(shù)不會(huì)在地址欄顯示,會(huì)封裝在請(qǐng)求體中。
2.請(qǐng)求參數(shù)的長(zhǎng)度沒(méi)有限制
3.較為安全
表單里面的數(shù)據(jù)要想被提交,必須指定它的name屬性
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。