王 恒,唐孝國,郭俊亮
(銅仁職業技術學院,貴州 銅仁 554300)
為了解觀眾的電影喜好,找到了具有代表性的電影網站進行了系統分析。若想要獲取豆瓣網站中電影評分Top250的數據,可直接登錄豆瓣網址,這種操作雖能得到目標數據,但需要耗費大量的時間和精力,并有可能遺漏某些數據,為此通過編寫python程序進行網頁爬取和分析。較于人工搜集數據,python爬取程序具有更為快速、準確及方便的特點,分析后的數據還可以很好地運用到此后的數據可視化分析中。觀眾的電影喜好主要可以通過搜集電影排行榜中排名靠前的電影發布地、電影題材及電影評分等信息得知?;趐ython網絡爬取程序,通過搜集豆瓣Top250電影的發布地和題材等數據,將得到的數據匯入Excle表格,進行可視化分析。其中,各類屬性中的發布地屬性對于某個電影來說是唯一的,其主要發布地的比例可以運用餅圖進行展示,但對于電影題材屬性則運用詞云圖來展示最為合適。
對豆瓣網上的電影數據爬取分析是一個系統化過程,分為如下幾步:
數據爬取首先要構造爬取一個網頁內容的函數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″
} #模擬瀏覽器訪問網頁
request = urllib.request.Request(url,headers=head)
html =″″
try: #try: except為錯誤預處理
response = urllib.request.urlopen(request) #利用urllib庫中的request函數發送請求,命名為response。
html = response.read().decode(″utf-8″) #對上面得到的response進行讀取,命名為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網站,發現該網站一頁共有25條電影數據,共10頁,因而利用for循環將函數askURL()運行10次,即可得到爬取到豆瓣影評Top250的全部數據。
構造函數getData(),獲取250條電影信息并逐一解析,返回值為datalist:def getData(baseurl):
datalist = []
for i in range(0,10):#用一個for循環,爬取十頁數據,一頁250條
url = baseurl + str(i*25)
html = askUrl(url)#將爬取到的網頁源碼保存,命名為html
**對上一步得到的html數據進行逐一解析***#注:此處為一重要環節,將在1.3中進行詳細說明。
return datalist
運用正則表達式逐一解析數據。運用以上兩個函數,可以籠統的得到有關250條電影信息的html文件,網絡爬蟲的關鍵是運用正則表達式在整個html文件中找到所需要的信息規律,并將其提取出來。以Top1電影《肖申克的救贖》的html文件為例,試圖從中獲取到有用信息的規律,并構造正則表達式進行提取。
由于本次爬蟲任務主要為了分析人們的電影喜好,因此將主要爬取以下信息。
A.電影名
上面展示出的html文件中,有關電影名《肖申克的救贖》的部分為:
于是,影片片名的正則表示式規則(之后簡稱為“規則”)為:
findTitle = re.compile(r′′)
B.影評評分
有關影片評分的部分為:
電影評分的規則是:
findGrade = re.compile(r′′)
C.評價人數
有關評價人數的部分為:
于是,評價人數的規則為:
findJnumber = re.compile(r′′)
D.影片類型
有關影片相關內容的部分為:
導演: 弗蘭克·德拉邦特 Frank Darabont 主演: 蒂姆·羅賓斯 Tim Robbins /...
1994/美國/犯罪 劇情
于是,影片類型的規則為:
findBd = re.compile(r′
(.*?)
′,re.S)確定規則之后,在2中逐一解析數據部分的代碼應為:
titles = re.findall(findTitle,item)
if(len(titles)) == 2:
ctitle = titles[0]
data.append(ctitle) #添加中文名
otitle = titles[1].replace(″/″,″″) #把無關的符號去掉
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) #添加評價人數
bd = re.findall(findBd,item)[0]
bd = re.sub(′
(s+)?′,″ ″,bd) #去掉
bd = re.sub(′/′,″ ″,bd) #替換/
data.append(bd.strip()) #去掉前后的空格
datalist.append(data) #把處理好的一部電影信息放入datalist。
構造數據保存函數saveData(datalist,savepath),將數據保存在指定路徑savepath中,
def saveData(datalist,savepath):
wbook = xlwt.Workbook(encoding=″ytf=8″,style_compression=0) #創建workbook對象
sheet = wbook.add_sheet(′豆瓣電影Top250′,cell_overwrite_ok=True) #創建工作表
col = (″影片中文名″,″影片外國名″,″評分″,″評價數″,″相關信息″)
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.網頁爬取
datalist = getData(baseurl)
savepath = ″.\豆瓣電影Top250.xls″
#3. 保存數據
saveData(datalist,savepath)
if __name__ == ″__main__″:
main() #調用函數
print(″爬取完畢″)
上述所有步驟完成后,即可得到一個名為:豆瓣電影Top250.xls的Excel表格文件,里面共包含250條數據。以下為其中的一部分,具體內容如表1所示。

表1 電影數據Tab.1 Movie data
“相關信息”一欄可以通過所含的電影所屬國家和電影種類對觀眾的電影喜好進行分析。為了方便以后的應用,將相關信息一欄分列為“國家”一欄和若干“類型”一欄,并進行簡化處理。簡化后的表格如表2所示。

表2 電影種類Tab.2 Movie types
在豆瓣影評Top250中,美國電影所占市場份額較大,占總數的44%。其次為中國電影和日本電影,分別占16%和13%。其余國家電影所占市場份額較少,均不到10%。需大力支持國產電影,有關部門也應加大國產電影的對外宣傳。
在眾多類別的電影中,劇情類電影出現的頻率最高,說明人們對于電影的要求越來越高,不僅限于觀看其特效是否華麗,最為關注的是其本身的劇情,因此一部電影若想吸引人的眼球,需要扣人心弦的好劇本,只靠特效和流量明星是遠遠不夠的,內容連貫、跌宕起伏的劇情才是給電影帶來關注度的重要保障。頻次第二高的是喜劇片,人們的生活壓力越來越大,工作之余和家人朋友一起去看一部喜劇片是一種緩解生活壓力的好方法[3-5]。