王 恒,唐孝國,郭俊亮
(銅仁職業(yè)技術(shù)學(xué)院,貴州 銅仁 554300)
為了解觀眾的電影喜好,找到了具有代表性的電影網(wǎng)站進(jìn)行了系統(tǒng)分析。若想要獲取豆瓣網(wǎng)站中電影評分Top250的數(shù)據(jù),可直接登錄豆瓣網(wǎng)址,這種操作雖能得到目標(biāo)數(shù)據(jù),但需要耗費(fèi)大量的時(shí)間和精力,并有可能遺漏某些數(shù)據(jù),為此通過編寫python程序進(jìn)行網(wǎng)頁爬取和分析。較于人工搜集數(shù)據(jù),python爬取程序具有更為快速、準(zhǔn)確及方便的特點(diǎn),分析后的數(shù)據(jù)還可以很好地運(yùn)用到此后的數(shù)據(jù)可視化分析中。觀眾的電影喜好主要可以通過搜集電影排行榜中排名靠前的電影發(fā)布地、電影題材及電影評分等信息得知?;趐ython網(wǎng)絡(luò)爬取程序,通過搜集豆瓣Top250電影的發(fā)布地和題材等數(shù)據(jù),將得到的數(shù)據(jù)匯入Excle表格,進(jìn)行可視化分析。其中,各類屬性中的發(fā)布地屬性對于某個(gè)電影來說是唯一的,其主要發(fā)布地的比例可以運(yùn)用餅圖進(jìn)行展示,但對于電影題材屬性則運(yùn)用詞云圖來展示最為合適。
對豆瓣網(wǎng)上的電影數(shù)據(jù)爬取分析是一個(gè)系統(tǒng)化過程,分為如下幾步:
數(shù)據(jù)爬取首先要構(gòu)造爬取一個(gè)網(wǎng)頁內(nèi)容的函數(shù)askUrl():返回值為html def askUrl(url):
head={
″User-Agent″: ″Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36″
} #模擬瀏覽器訪問網(wǎng)頁
request = urllib.request.Request(url,headers=head)
html =″″
try: #try: except為錯(cuò)誤預(yù)處理
response = urllib.request.urlopen(request) #利用urllib庫中的request函數(shù)發(fā)送請求,命名為response。
html = response.read().decode(″utf-8″) #對上面得到的response進(jìn)行讀取,命名為html。
#print(html)
except urllib.error.URLError as ue:
if hasattr(ue,″code″):
print(ue.code)
if hasattr(ue,″reason″):
print(ue.reason)
return html #最后返回html。
觀察豆瓣影評Top250網(wǎng)站,發(fā)現(xiàn)該網(wǎng)站一頁共有25條電影數(shù)據(jù),共10頁,因而利用for循環(huán)將函數(shù)askURL()運(yùn)行10次,即可得到爬取到豆瓣影評Top250的全部數(shù)據(jù)。
構(gòu)造函數(shù)getData(),獲取250條電影信息并逐一解析,返回值為datalist:def getData(baseurl):
datalist = []
for i in range(0,10):#用一個(gè)for循環(huán),爬取十頁數(shù)據(jù),一頁250條
url = baseurl + str(i*25)
html = askUrl(url)#將爬取到的網(wǎng)頁源碼保存,命名為html
**對上一步得到的html數(shù)據(jù)進(jìn)行逐一解析***#注:此處為一重要環(huán)節(jié),將在1.3中進(jìn)行詳細(xì)說明。
return datalist
運(yùn)用正則表達(dá)式逐一解析數(shù)據(jù)。運(yùn)用以上兩個(gè)函數(shù),可以籠統(tǒng)的得到有關(guān)250條電影信息的html文件,網(wǎng)絡(luò)爬蟲的關(guān)鍵是運(yùn)用正則表達(dá)式在整個(gè)html文件中找到所需要的信息規(guī)律,并將其提取出來。以Top1電影《肖申克的救贖》的html文件為例,試圖從中獲取到有用信息的規(guī)律,并構(gòu)造正則表達(dá)式進(jìn)行提取。
由于本次爬蟲任務(wù)主要為了分析人們的電影喜好,因此將主要爬取以下信息。
A.電影名
上面展示出的html文件中,有關(guān)電影名《肖申克的救贖》的部分為:
于是,影片片名的正則表示式規(guī)則(之后簡稱為“規(guī)則”)為:
findTitle = re.compile(r′′)
B.影評評分
有關(guān)影片評分的部分為:
電影評分的規(guī)則是:
findGrade = re.compile(r′′)
C.評價(jià)人數(shù)
有關(guān)評價(jià)人數(shù)的部分為:
于是,評價(jià)人數(shù)的規(guī)則為:
findJnumber = re.compile(r′′)
D.影片類型
有關(guān)影片相關(guān)內(nèi)容的部分為:
導(dǎo)演: 弗蘭克·德拉邦特 Frank Darabont 主演: 蒂姆·羅賓斯 Tim Robbins /...
1994/美國/犯罪 劇情
于是,影片類型的規(guī)則為:
findBd = re.compile(r′
(.*?)
′,re.S)確定規(guī)則之后,在2中逐一解析數(shù)據(jù)部分的代碼應(yīng)為:
titles = re.findall(findTitle,item)
if(len(titles)) == 2:
ctitle = titles[0]
data.append(ctitle) #添加中文名
otitle = titles[1].replace(″/″,″″) #把無關(guān)的符號去掉
data.append(otitle) #添加外國名
else:
data.append(titles[0])
data.append(′ ′) #外國名留空
rating = re.findall(findGrade,item)[0]
data.append(rating) #添加評分
jdNum = re.findall(findJnumber,item)[0]
data.append(jdNum) #添加評價(jià)人數(shù)
bd = re.findall(findBd,item)[0]
bd = re.sub(′
(s+)?′,″ ″,bd) #去掉
bd = re.sub(′/′,″ ″,bd) #替換/
data.append(bd.strip()) #去掉前后的空格
datalist.append(data) #把處理好的一部電影信息放入datalist。
構(gòu)造數(shù)據(jù)保存函數(shù)saveData(datalist,savepath),將數(shù)據(jù)保存在指定路徑savepath中,
def saveData(datalist,savepath):
wbook = xlwt.Workbook(encoding=″ytf=8″,style_compression=0) #創(chuàng)建workbook對象
sheet = wbook.add_sheet(′豆瓣電影Top250′,cell_overwrite_ok=True) #創(chuàng)建工作表
col = (″影片中文名″,″影片外國名″,″評分″,″評價(jià)數(shù)″,″相關(guān)信息″)
for i in range(0,5):
sheet.write(0,i,col[i]) #列名
for i in range(0,250):
print(″第%d條″%(i+1))
data = datalist[i]
for j in range(0,5):
sheet.write(i+1,j,data[j])
wbook.save(savepath) #保存
def main():
baseurl = ″https://movie.douban.com/top250?start=″
#1.網(wǎng)頁爬取
datalist = getData(baseurl)
savepath = ″.\豆瓣電影Top250.xls″
#3. 保存數(shù)據(jù)
saveData(datalist,savepath)
if __name__ == ″__main__″:
main() #調(diào)用函數(shù)
print(″爬取完畢″)
上述所有步驟完成后,即可得到一個(gè)名為:豆瓣電影Top250.xls的Excel表格文件,里面共包含250條數(shù)據(jù)。以下為其中的一部分,具體內(nèi)容如表1所示。
表1 電影數(shù)據(jù)Tab.1 Movie data
“相關(guān)信息”一欄可以通過所含的電影所屬國家和電影種類對觀眾的電影喜好進(jìn)行分析。為了方便以后的應(yīng)用,將相關(guān)信息一欄分列為“國家”一欄和若干“類型”一欄,并進(jìn)行簡化處理。簡化后的表格如表2所示。
表2 電影種類Tab.2 Movie types
在豆瓣影評Top250中,美國電影所占市場份額較大,占總數(shù)的44%。其次為中國電影和日本電影,分別占16%和13%。其余國家電影所占市場份額較少,均不到10%。需大力支持國產(chǎn)電影,有關(guān)部門也應(yīng)加大國產(chǎn)電影的對外宣傳。
在眾多類別的電影中,劇情類電影出現(xiàn)的頻率最高,說明人們對于電影的要求越來越高,不僅限于觀看其特效是否華麗,最為關(guān)注的是其本身的劇情,因此一部電影若想吸引人的眼球,需要扣人心弦的好劇本,只靠特效和流量明星是遠(yuǎn)遠(yuǎn)不夠的,內(nèi)容連貫、跌宕起伏的劇情才是給電影帶來關(guān)注度的重要保障。頻次第二高的是喜劇片,人們的生活壓力越來越大,工作之余和家人朋友一起去看一部喜劇片是一種緩解生活壓力的好方法[3-5]。