高雨菲 毛紅霞
摘? 要:豆瓣是一個(gè)通過(guò)提供書(shū)籍影視相關(guān)內(nèi)容發(fā)展起來(lái)的網(wǎng)站,能夠提供電影的各類(lèi)信息。豆瓣用戶(hù)的評(píng)論有時(shí)能引領(lǐng)一代新的風(fēng)尚潮流。文章使用Python語(yǔ)言結(jié)合有關(guān)爬蟲(chóng)的知識(shí)設(shè)計(jì)了有關(guān)豆瓣影視短評(píng)的爬取系統(tǒng),采用了URL管理器、網(wǎng)頁(yè)結(jié)構(gòu)分析、數(shù)據(jù)采集、數(shù)據(jù)清洗、數(shù)據(jù)分析、數(shù)據(jù)可視化等模塊,將指定的電影影評(píng)內(nèi)容保存,精準(zhǔn)的獲取不同電影的被喜愛(ài)程度以及電影上映后帶來(lái)的反響。
關(guān)鍵詞:Python;數(shù)據(jù)采集;數(shù)據(jù)清洗;數(shù)據(jù)可視化
中圖分類(lèi)號(hào):TP391.1? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2020)24-0010-04
Data Collection and Analysis of Douban Film and Television Short Commentary Based on Python
GAO Yufei,MAO Hongxia
(School of Computer and Software,Jincheng College of Sichuan University,Chengdu? 611731,China)
Abstract:Douban is website that is gradually developed through providing books,film and television related content,it can provide different kinds of information about film. Sometimes,Douban userscomments can lead a generation of new fashion trend. In this paper,using Python language and combining with the knowledge on crawlers to design a crawling system about Douban film and television short commentary,which adopts the following modules such as URL manager,webpage structure analysis,data collection,data cleaning,data analysis and data visualization etc to save the specified film review content,so as to accurately obtain the popularity extent of the different films and response produced after the filmsshowing.
Keywords:Python;data collection;data cleaning;data visualization
0? 引? 言
隨著互聯(lián)網(wǎng)時(shí)代的到來(lái),網(wǎng)絡(luò)上的數(shù)據(jù)量持續(xù)高速增長(zhǎng),已經(jīng)呈現(xiàn)出數(shù)以千萬(wàn)計(jì)的數(shù)據(jù)大爆發(fā)。面對(duì)著這樣龐大的數(shù)據(jù)僅僅使用人工來(lái)篩選有價(jià)值的數(shù)據(jù)是不現(xiàn)實(shí)的。通過(guò)Python編寫(xiě)程序來(lái)自動(dòng)獲取信息的網(wǎng)絡(luò)爬蟲(chóng)應(yīng)運(yùn)而生。在當(dāng)下,娛樂(lè)行業(yè)蓬勃發(fā)展,電影作為其中的主力之一,有著龐大的受眾,大量的豆瓣用戶(hù)在豆瓣網(wǎng)站上留下了他們對(duì)于不同電影的評(píng)論。本文采用Python作為編程語(yǔ)言,爬取當(dāng)下熱門(mén)電影的影評(píng),并對(duì)于爬取的數(shù)據(jù)內(nèi)容進(jìn)行了一系列的清洗與整理,將有價(jià)值的數(shù)據(jù)進(jìn)行了分析并通過(guò)可視化技術(shù)展現(xiàn)出來(lái)。
1? 爬蟲(chóng)原理
網(wǎng)絡(luò)爬蟲(chóng)是通過(guò)獲取的不同的URL作為核心的支撐,來(lái)尋找和抓取在URL之下的各種文章,鏈接和圖片等內(nèi)容。在給定的URL中,網(wǎng)絡(luò)爬蟲(chóng)會(huì)不斷地從中抽取URL,然后對(duì)當(dāng)下URL的內(nèi)容進(jìn)行篩選和獲取,當(dāng)一個(gè)URL從頭到尾都查找完了之后,網(wǎng)絡(luò)爬蟲(chóng)會(huì)自動(dòng)地進(jìn)入到下一個(gè)URL中,重復(fù)之前的步驟,直到所有的URL都被查找了一次。轉(zhuǎn)到技術(shù)層面來(lái)說(shuō),是通過(guò)程序模擬瀏覽器請(qǐng)求站點(diǎn)的行為,把站點(diǎn)返回的數(shù)據(jù)(HTML代碼/JSON數(shù)據(jù)/二進(jìn)制數(shù)據(jù))存放在本地,等待后期使用。根據(jù)不同需要有目的地進(jìn)行爬取,要增加目標(biāo)的定義和過(guò)濾機(jī)制。本文采用簡(jiǎn)單的框架結(jié)構(gòu)來(lái)編寫(xiě)爬蟲(chóng)程序,分別有以下四個(gè)模塊:URL管理器、網(wǎng)頁(yè)下載器、網(wǎng)頁(yè)解析器、網(wǎng)頁(yè)輸出器,這四個(gè)模塊共同完成抓取網(wǎng)頁(yè)的整個(gè)過(guò)程[1]。
2? 影評(píng)爬取數(shù)據(jù)系統(tǒng)設(shè)計(jì)
2.1? 網(wǎng)頁(yè)URL分析
首先通過(guò)對(duì)于本文要獲取的豆瓣的電影的網(wǎng)頁(yè)影評(píng)界面進(jìn)行分析,觀(guān)察需要的URL地址??梢园l(fā)現(xiàn),豆瓣的每一部電影在subject/之后的數(shù)字則對(duì)應(yīng)了每一部固定的電影。如圖1所示,在start=與limit=20之間的數(shù)值都是以每頁(yè)20的速度遞增的,可以通過(guò)改變程序中有關(guān)于抓取網(wǎng)頁(yè)URL時(shí)候的數(shù)值的改變來(lái)進(jìn)行程序的簡(jiǎn)單模擬翻頁(yè)。解析網(wǎng)頁(yè)URL的代碼為:
for i in range(n):
url='https://movie.douban.com/subject/26754233/comments?start={&limit=20&status=P&sort=new_score'url = url.format(i*20)
2.2? 網(wǎng)頁(yè)內(nèi)容解析
對(duì)于頁(yè)面解析不同的使用者在不同的網(wǎng)站上使用的解析方法都不一樣,主要的解析方式有正則表達(dá)式,其次是解析庫(kù),常用的有兩個(gè)解析庫(kù)有l(wèi)xml和BeautifulSoup。通過(guò)確定每個(gè)數(shù)據(jù)對(duì)應(yīng)的元素及Class名稱(chēng)后,使用find,find_all,select等方法進(jìn)行標(biāo)簽的定位,進(jìn)行數(shù)據(jù)提取[2]。通過(guò)Chrome瀏覽器的開(kāi)發(fā)者工具,可以看到如圖2所示的源代碼。通過(guò)源代碼可以找到影評(píng)中的評(píng)論者信息,評(píng)論者主頁(yè)網(wǎng)址,影評(píng)評(píng)論的內(nèi)容,具體評(píng)論的時(shí)間,以及評(píng)論者對(duì)于這部電影的喜好程度等級(jí)。
同樣的方式打開(kāi)用戶(hù)的主頁(yè),如圖3所示,可以找到在主頁(yè)的右上方有一份關(guān)于用戶(hù)的個(gè)人信息的簡(jiǎn)單補(bǔ)充。
2.3? 反爬蟲(chóng)措施的應(yīng)對(duì)
針對(duì)爬蟲(chóng),很多網(wǎng)站都有了反爬蟲(chóng)手段,而建立網(wǎng)絡(luò)爬蟲(chóng)的第一原則是:所有信息都是偽造的[3]。本文主要采用了四種方式來(lái)應(yīng)對(duì)反爬蟲(chóng)措施:
(1)使用Cookies。豆瓣網(wǎng)站上,每一個(gè)注冊(cè)了豆瓣賬號(hào)的用戶(hù)都有一個(gè)獨(dú)一無(wú)二的Cookies。Cookies是辨別用戶(hù)身份的重要途徑??梢酝ㄟ^(guò)Session跟蹤而儲(chǔ)存用戶(hù)在網(wǎng)頁(yè)登錄時(shí)候的Cookies來(lái)進(jìn)行模擬用戶(hù)登錄訪(fǎng)問(wèn)網(wǎng)頁(yè),來(lái)獲取只有登錄之后才能被查找到的內(nèi)容。
(2)使用用戶(hù)的代理信息。通過(guò)F12,找到Headers,主要關(guān)注用戶(hù)代理User-Agent字段。User-Agent代表用戶(hù)是使用什么設(shè)備來(lái)訪(fǎng)問(wèn)網(wǎng)站的。不同瀏覽器的User-Agent值是不同的。通過(guò)在Headers中添加User-Agent就可以在爬蟲(chóng)程序中,將其偽裝成不同的設(shè)備訪(fǎng)問(wèn)瀏覽器信息。
(3)設(shè)置延時(shí)訪(fǎng)問(wèn)。在使用程序訪(fǎng)問(wèn)網(wǎng)頁(yè)的時(shí)候往往在一秒鐘內(nèi)可以訪(fǎng)問(wèn)幾百上千次,而在現(xiàn)實(shí)生活中,用戶(hù)是無(wú)法在一秒鐘內(nèi)達(dá)到這樣一個(gè)訪(fǎng)問(wèn)速度的。這樣爬蟲(chóng)的程序就很容易被網(wǎng)站監(jiān)測(cè)出來(lái)。因此,可以使用sleep()來(lái)降低爬蟲(chóng)在一段時(shí)間之內(nèi)的爬取速度,由此來(lái)模擬用戶(hù)行為。
(4)建立用戶(hù)代理池來(lái)達(dá)到隨機(jī)爬取的目的。在爬取過(guò)程中,一直用同樣一個(gè)地址爬取是不可取的。如果每一次訪(fǎng)問(wèn)都是不同的用戶(hù),對(duì)方就很難進(jìn)行反爬,那么用戶(hù)代理池就是一種很好的反爬攻克的手段。首先需要收集大量的用戶(hù)代理User-Agent,對(duì)于收集到的用戶(hù)代理信息建立函數(shù)UA(),用于切換用戶(hù)代理User-Agent。最后利用上面所提到的用戶(hù)代理池進(jìn)行爬取,使用Python中的隨機(jī)函數(shù)random()來(lái)隨機(jī)獲取用戶(hù)代理信息,來(lái)使用不同的用戶(hù)來(lái)訪(fǎng)問(wèn)網(wǎng)頁(yè)信息。
2.4? 網(wǎng)頁(yè)內(nèi)容的獲取與保存
首先要獲取有需求的網(wǎng)頁(yè)內(nèi)容信息??梢允褂枚嗑€(xiàn)程的網(wǎng)絡(luò)爬蟲(chóng)來(lái)提高獲取內(nèi)容的速度。對(duì)于指定需要獲取內(nèi)容的獲取代碼為:
def query(get_url):
#函數(shù)功能獲取內(nèi)容并存入對(duì)應(yīng)的文件
rqg = requests.get(get_url, headers=headers)
rqg.encoding = chardet.detect(rqg.content)['encoding'l
html=rqg.content.decode(utf-8", "ignore")
html = etree.HTML(html, parser=etree.HTMLParser (encoding='utf-8'))search = html.xpath('//*[@id="profile"]/div/div[2]/div[1]/div/a/text()")
path='C:/Users/hby/PycharmProjects/pythonProject1/地址.txt'
f = open(path, mode=w", encoding='utf-8)
f.writelines(search)
f.close()
將從網(wǎng)頁(yè)之中爬取下來(lái)的數(shù)據(jù)轉(zhuǎn)化為本地的csv文件或者是txt文本。可以得到如圖4所示的幾個(gè)類(lèi)別信息,分別為評(píng)論者、時(shí)間、評(píng)分、內(nèi)容和主頁(yè)地址。通過(guò)對(duì)主頁(yè)內(nèi)容的抓取可以獲得大量的參與評(píng)論的用戶(hù)的常居住的文本信息。保存為本地文件的代碼為:
#to_csv導(dǎo)出為.csv文件; to_excel導(dǎo)出為.xls或.xlsx文件
df.to_excel(r'C:/Users/hby/PycharmProjects/pythonProject1/0.xls'.format(name),index=False)
print('導(dǎo)出完成?。?/p>
def write_txt(file_name,wirte_name):
df = pd.read_excel(file_name, header=None)
#使用pandas模塊讀取數(shù)據(jù)
print('開(kāi)始寫(xiě)入txt文件...")
df1=df[3]
df1.to_csv(wirte_name, header=None,sep=",", index=False)
#寫(xiě)入,逗號(hào)分隔
print('文件寫(xiě)入成功!'")
3? 數(shù)據(jù)分析系統(tǒng)設(shè)計(jì)
3.1? 數(shù)據(jù)清洗
檢測(cè)數(shù)據(jù)中存在冗余、錯(cuò)誤、不一致等噪聲數(shù)據(jù),利用各種清洗技術(shù),形成“干凈”的一致性數(shù)據(jù)集合,而數(shù)據(jù)清洗技術(shù)包括清除重復(fù)數(shù)據(jù)、填充缺失數(shù)據(jù)、消除噪聲數(shù)據(jù)等[4]。常用數(shù)據(jù)清洗函數(shù):排序,搜索np.sort函數(shù);從小到大進(jìn)行排序np.argsort函數(shù);返回的是數(shù)據(jù)中從小到大的索引值np.where;可以自定義返回滿(mǎn)足條件的情況np.extract;返回滿(mǎn)足條件的元素值。
Pandas常用數(shù)據(jù)結(jié)構(gòu)Series和方法通過(guò)pandas.Series來(lái)創(chuàng)建Series數(shù)據(jù)結(jié)構(gòu)。pandas.Series(data,index,dtype,name)。上述參數(shù)中,data可以為列表,array或者dict。上述參數(shù)中,index表示索引,必須與數(shù)據(jù)同長(zhǎng)度,name代表對(duì)象的名稱(chēng)Pandas常用數(shù)據(jù)結(jié)構(gòu)dataframe和方法通過(guò)pandas.DataFrame來(lái)創(chuàng)建DataFrame數(shù)據(jù)結(jié)構(gòu)。pandas.DataFrame (data,index,dtype,columns)。上述參數(shù)中,data可以為列表,array或者dict。上述參數(shù)中,index表示行索引,columns代表列名或者列標(biāo)簽。對(duì)于一些空值的位置可以適當(dāng)?shù)闹苯觿h除當(dāng)前位置。部分具體清洗數(shù)據(jù)代碼為:
def cleanout(path_file1):
result =[]
with open(path_file1, 'r', encoding='utf-8') as f:for line in f:
result.append(line.strip(r'\n').split('\n')[O])
df = pd.DataFrame(result)
drop=df.replace('[]',np.nan)
data=drop.dropna(how='all')list= data.values.tolist()
counts = dict(zip(*np.unique(list, return_counts=True)))
3.2? 數(shù)據(jù)可視化
數(shù)據(jù)可視化是數(shù)據(jù)科學(xué)領(lǐng)域中的一種技術(shù),它使復(fù)雜的數(shù)據(jù)看起來(lái)簡(jiǎn)單易懂。詞云圖,也稱(chēng)為文字云,是用圖像的方式對(duì)文本中頻繁出現(xiàn)的詞語(yǔ)進(jìn)行展現(xiàn),形成“關(guān)鍵詞渲染”或者“關(guān)鍵詞云層”的效果[5]。如圖5所示,通過(guò)詞云的刪減可以直觀(guān)地看到電影的主要文本內(nèi)容和一些突出的要素??梢越柚鶳ython的第三方庫(kù),如jieba庫(kù)來(lái)獲取有關(guān)于影評(píng)內(nèi)容的中文分詞,對(duì)于分詞后的內(nèi)容有著大量的無(wú)實(shí)際意義的詞語(yǔ)。也可導(dǎo)入自行增加刪減的stopwords來(lái)進(jìn)行無(wú)實(shí)際意義的詞語(yǔ)的刪減,達(dá)到想要的實(shí)際效果。某一特定文件內(nèi)的高詞語(yǔ)頻率,以及該詞語(yǔ)在整個(gè)文件集合中的低文件頻率,可以產(chǎn)生出高權(quán)重的TF-IDF[6]。
通過(guò)對(duì)于用戶(hù)的常居住地的處理和清洗之后,為了能夠更好、更直觀(guān)的呈現(xiàn)不同地區(qū)的差異,借助Python中的Basemap庫(kù),可以獲取到中國(guó)各省份的區(qū)分圖,如圖6所示,能夠發(fā)現(xiàn)不同地區(qū)的人對(duì)電影的討論熱度的差異。
4? 結(jié)? 論
通過(guò)Chrome的開(kāi)發(fā)者查看源代碼我們可以直觀(guān)的看到不同的內(nèi)容在網(wǎng)頁(yè)上的位置,而利用Python編寫(xiě)的程序可以幫助我們解析URL網(wǎng)頁(yè)。在網(wǎng)頁(yè)上獲取到所需要的內(nèi)容,保存到本地。針對(duì)爬取到的數(shù)據(jù)存在著格式不規(guī)范,內(nèi)容有空缺,數(shù)據(jù)出錯(cuò)等情況,需要在使用之前進(jìn)行數(shù)據(jù)的清洗與整理。對(duì)數(shù)據(jù)運(yùn)用不同的分析方法,最后借助圖表的方式來(lái)清晰直觀(guān)的展現(xiàn)出所要呈現(xiàn)的結(jié)果,由結(jié)果可以看出觀(guān)眾對(duì)于本文電影的感受是受到了非常大的歷史震撼的,而北京和上海的用戶(hù)對(duì)于本文電影的內(nèi)容在豆瓣網(wǎng)上的評(píng)論較多。
參考文獻(xiàn):
[1] 孫冰.基于Python的多線(xiàn)程網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn) [J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2018(4):38-39.
[2] 成文瑩,李秀敏.基于Python的電影數(shù)據(jù)爬取與數(shù)據(jù)可視化分析研究 [J].電腦知識(shí)與技術(shù),2019,15(31):8-10+12.
[3] XIE D X,XIA W F. Design and implementation of the topic-focused crawler based on scrappy [J].Advanced Materials Research,2014(850-851):487-490.
[4] 孔欽,葉長(zhǎng)青,孫赟.大數(shù)據(jù)下數(shù)據(jù)預(yù)處理方法研究 [J].計(jì)算機(jī)技術(shù)與發(fā)展,2018,28(5):1-4.
[5] 祝永志,荊靜.基于Python語(yǔ)言的中文分詞技術(shù)的研究 [J].通信技術(shù),2019,52(7):1612-1619.
[6] 涂小琴.基于Python爬蟲(chóng)的電影評(píng)論情感傾向性分析 [J].現(xiàn)代計(jì)算機(jī)(專(zhuān)業(yè)版),2017(35):52-55.
作者簡(jiǎn)介:高雨菲(1999.07—),女,漢族,四川內(nèi)江人,本科在讀,研究方向:數(shù)據(jù)科學(xué)與大數(shù)據(jù)技術(shù)。