一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

python爬取44130條用戶觀影數(shù)據(jù),分析挖掘用戶與電影之間的隱藏信息!

 鷹擊彩霞 2021-02-16

出處: Python爬蟲數(shù)據(jù)分析挖掘

01

前言

明天就是大年初一,很多電影也上映,看電影前很多人都喜歡去『豆瓣』看影評,所以我爬取44130條『豆瓣』的用戶觀影數(shù)據(jù),分析用戶之間的關(guān)系,電影之間的聯(lián)系,以及用戶和電影之間的隱藏關(guān)系。


02

爬取觀影數(shù)據(jù)

數(shù)據(jù)來源

https://movie.douban.com/

『豆瓣』平臺爬取用戶觀影數(shù)據(jù)。

爬取用戶列表

網(wǎng)頁分析

為了獲取用戶,我選擇了其中一部電影的影評,這樣可以根據(jù)評論的用戶去獲取其用戶名稱(后面爬取用戶觀影記錄只需要『用戶名稱』)。

https://movie.douban.com/subject/24733428/reviews?start=0

url中start參數(shù)是頁數(shù)(page*20,每一頁20條數(shù)據(jù)),因此start=0、20、40...,也就是20的倍數(shù),通過改變start參數(shù)值就可以獲取這4614條用戶的名稱。

查看網(wǎng)頁的標簽,可以找到『用戶名稱』值對應(yīng)的標簽屬性。

編程實現(xiàn)

i=0url = 'https://movie.douban.com/subject/24733428/reviews?start=' + str(i * 20)r = requests.get(url, headers=headers)r.encoding = 'utf8's = (r.content)selector = etree.HTML(s)
for item in selector.xpath('//*[@class='review-list ']/div'): userid = (item.xpath('.//*[@class='main-hd']/a[2]/@href'))[0].replace('https://www.douban.com/people/','').replace('/', '') username = (item.xpath('.//*[@class='main-hd']/a[2]/text()'))[0] print(userid) print(username) print('-----')


爬取用戶的觀影記錄

上一步爬取到『用戶名稱』,接著爬取用戶觀影記錄需要用到『用戶名稱』。

網(wǎng)頁分析

#https://movie.douban.com/people/{用戶名稱}/collect?start=15&sort=time&rating=all&filter=all&mode=gridhttps://movie.douban.com/people/mumudancing/collect?start=15&sort=time&rating=all&filter=all&mode=grid

通過改變『用戶名稱』,可以獲取到不同用戶的觀影記錄。

url中start參數(shù)是頁數(shù)(page*15,每一頁15條數(shù)據(jù)),因此start=0、15、30...,也就是15的倍數(shù),通過改變start參數(shù)值就可以獲取這1768條觀影記錄稱。

查看網(wǎng)頁的標簽,可以找到『電影名』值對應(yīng)的標簽屬性。

編程實現(xiàn)

url = 'https://movie.douban.com/people/mumudancing/collect?start=15&sort=time&rating=all&filter=all&mode=grid'r = requests.get(url, headers=headers)r.encoding = 'utf8's = (r.content)selector = etree.HTML(s)
for item in selector.xpath('//*[@class='grid-view']/div[@class='item']'): text1 = item.xpath('.//*[@class='title']/a/em/text()') text2 = item.xpath('.//*[@class='title']/a/text()') text1 = (text1[0]).replace(' ', '') text2 = (text2[1]).replace(' ', '').replace('\n', '') print(text1+text1) print('-----')

保存到excel

定義表頭

# 初始化execl表def initexcel(filename):    # 創(chuàng)建一個workbook 設(shè)置編碼    workbook = xlwt.Workbook(encoding='utf-8')    # 創(chuàng)建一個worksheet    worksheet = workbook.add_sheet('sheet1')    workbook.save(str(filename)+'.xls')    ##寫入表頭    value1 = [['用戶', '影評']]    book_name_xls = str(filename)+'.xls'    write_excel_xls_append(book_name_xls, value1)


excel表有兩個標題(用戶, 影評)

寫入excel

# 寫入execldef write_excel_xls_append(path, value): index = len(value) # 獲取需要寫入數(shù)據(jù)的行數(shù) workbook = xlrd.open_workbook(path) # 打開工作簿 sheets = workbook.sheet_names() # 獲取工作簿中的所有表格 worksheet = workbook.sheet_by_name(sheets[0]) # 獲取工作簿中所有表格中的的第一個表格 rows_old = worksheet.nrows # 獲取表格中已存在的數(shù)據(jù)的行數(shù) new_workbook = copy(workbook) # 將xlrd對象拷貝轉(zhuǎn)化為xlwt對象 new_worksheet = new_workbook.get_sheet(0) # 獲取轉(zhuǎn)化后工作簿中的第一個表格 for i in range(0, index): for j in range(0, len(value[i])): new_worksheet.write(i+rows_old, j, value[i][j]) # 追加寫入數(shù)據(jù),注意是從i+rows_old行開始寫入 new_workbook.save(path) # 保存工作簿

定義了寫入excel函數(shù),這樣爬起每一頁數(shù)據(jù)時候調(diào)用寫入函數(shù)將數(shù)據(jù)保存到excel中。


最后采集了44130條數(shù)據(jù)(原本是4614個用戶,每個用戶大約有500~1000條數(shù)據(jù),預(yù)計400萬條數(shù)據(jù))。但是為了演示分析過程,只爬取每一個用戶的前30條觀影記錄(因為前30條是最新的)。

最后這44130條數(shù)據(jù)會在下面分享給大家。


03

數(shù)據(jù)分析挖掘

讀取數(shù)據(jù)集

def read_excel():    # 打開workbook    data = xlrd.open_workbook('豆瓣.xls')    # 獲取sheet頁    table = data.sheet_by_name('sheet1')    # 已有內(nèi)容的行數(shù)和列數(shù)    nrows = table.nrows    datalist=[]    for row in range(nrows):        temp_list = table.row_values(row)        if temp_list[0] != '用戶' and temp_list[1] != '影評':            data = []            data.append([str(temp_list[0]), str(temp_list[1])])            datalist.append(data)
return datalist

從豆瓣.xls中讀取全部數(shù)據(jù)放到datalist集合中。

分析1:電影觀看次數(shù)排行

###分析1:電影觀看次數(shù)排行def analysis1(): dict ={} ###從excel讀取數(shù)據(jù) movie_data = read_excel() for i in range(0, len(movie_data)): key = str(movie_data[i][0][1]) try: dict[key] = dict[key] +1 except: dict[key]=1 ###從小到大排序 dict = sorted(dict.items(), key=lambda kv: (kv[1], kv[0])) name=[] num=[] for i in range(len(dict)-1,len(dict)-16,-1): print(dict[i]) name.append(((dict[i][0]).split('/'))[0]) num.append(dict[i][1])
plt.figure(figsize=(16, 9)) plt.title('電影觀看次數(shù)排行(高->低)') plt.bar(name, num, facecolor='lightskyblue', edgecolor='white') plt.savefig('電影觀看次數(shù)排行.png')

分析

  1. 由于用戶信息來源于『心靈奇旅』評論,因此其用戶觀看量最大。

  2. 最近的熱播電影中,播放量排在第二的是『送你一朵小紅花』,信條和拆彈專家2也緊跟其后。

分析2:用戶畫像(用戶觀影相同率最高)

###分析2:用戶畫像(用戶觀影相同率最高)def analysis2():    dict = {}    ###從excel讀取數(shù)據(jù)    movie_data = read_excel()
userlist=[] for i in range(0, len(movie_data)): user = str(movie_data[i][0][0]) moive = (str(movie_data[i][0][1]).split('/'))[0] #print(user) #print(moive)
try: dict[user] = dict[user]+','+str(moive) except: dict[user] =str(moive) userlist.append(user)
num_dict={} # 待畫像用戶(取第一個) flag_user=userlist[0] movies = (dict[flag_user]).split(',') for i in range(0,len(userlist)): #判斷是否是待畫像用戶 if flag_user != userlist[i]: num_dict[userlist[i]]=0 #待畫像用戶的所有電影 for j in range(0,len(movies)): #判斷當前用戶與待畫像用戶共同電影個數(shù) if movies[j] in dict[userlist[i]]: # 相同加1 num_dict[userlist[i]] = num_dict[userlist[i]]+1 ###從小到大排序 num_dict = sorted(num_dict.items(), key=lambda kv: (kv[1], kv[0])) #用戶名稱 username = [] #觀看相同電影次數(shù) num = [] for i in range(len(num_dict) - 1, len(num_dict) - 9, -1): username.append(num_dict[i][0]) num.append(num_dict[i][1])
plt.figure(figsize=(25, 9)) plt.title('用戶畫像(用戶觀影相同率最高)') plt.scatter(username, num, color='r') plt.plot(username, num) plt.savefig('用戶畫像(用戶觀影相同率最高).png')

分析

以用戶『mumudancing』為例進行用戶畫像

  1. 從圖中可以看出,與用戶『mumudancing』觀影相同率最高的是:“請帶我回布拉格”,其次是“李校尉”。

  2. 用戶:'絕命紙牌', '笨小孩', '私享史', '溫衡', '沈唐', '修左',的觀影相同率相同。

分析3:用戶之間進行電影推薦

###分析3:用戶之間進行電影推薦(與其他用戶同時被觀看過)def analysis3(): dict = {} ###從excel讀取數(shù)據(jù) movie_data = read_excel()
userlist=[] for i in range(0, len(movie_data)): user = str(movie_data[i][0][0]) moive = (str(movie_data[i][0][1]).split('/'))[0] #print(user) #print(moive)
try: dict[user] = dict[user]+','+str(moive) except: dict[user] =str(moive) userlist.append(user)
num_dict={} # 待畫像用戶(取第2個) flag_user=userlist[0] print(flag_user) movies = (dict[flag_user]).split(',') for i in range(0,len(userlist)): #判斷是否是待畫像用戶 if flag_user != userlist[i]: num_dict[userlist[i]]=0 #待畫像用戶的所有電影 for j in range(0,len(movies)): #判斷當前用戶與待畫像用戶共同電影個數(shù) if movies[j] in dict[userlist[i]]: # 相同加1 num_dict[userlist[i]] = num_dict[userlist[i]]+1 ###從小到大排序 num_dict = sorted(num_dict.items(), key=lambda kv: (kv[1], kv[0]))
# 去重(用戶與觀影率最高的用戶兩者之間重復(fù)的電影去掉) user_movies = dict[flag_user] new_movies = dict[num_dict[len(num_dict)-1][0]].split(',') for i in range(0,len(new_movies)): if new_movies[i] not in user_movies: print('給用戶('+str(flag_user)+')推薦電影:'+str(new_movies[i]))

分析

以用戶『mumudancing』為例,對用戶之間進行電影推薦

  1. 根據(jù)與用戶『mumudancing』觀影率最高的用戶(A)進行進行關(guān)聯(lián),然后獲取用戶(A)的全部觀影記錄

  2. 將用戶(A)的觀影記錄推薦給用戶『mumudancing』(去掉兩者之間重復(fù)的電影)。

分析4:電影之間進行電影推薦

###分析4:電影之間進行電影推薦(與其他電影同時被觀看過)def analysis4():    dict = {}    ###從excel讀取數(shù)據(jù)    movie_data = read_excel()
userlist=[] for i in range(0, len(movie_data)): user = str(movie_data[i][0][0]) moive = (str(movie_data[i][0][1]).split('/'))[0] try: dict[user] = dict[user]+','+str(moive) except: dict[user] =str(moive) userlist.append(user)
movie_list=[] # 待獲取推薦的電影 flag_movie = '送你一朵小紅花' for i in range(0,len(userlist)): if flag_movie in dict[userlist[i]]: moives = dict[userlist[i]].split(',') for j in range(0,len(moives)): if moives[j] != flag_movie: movie_list.append(moives[j])
data_dict = {} for key in movie_list: data_dict[key] = data_dict.get(key, 0) + 1
###從小到大排序 data_dict = sorted(data_dict.items(), key=lambda kv: (kv[1], kv[0])) for i in range(len(data_dict) - 1, len(data_dict) -16, -1): print('根據(jù)電影'+str(flag_movie)+']推薦:'+str(data_dict[i][0]))

分析

以電影『送你一朵小紅花』為例,對電影之間進行電影推薦

  1. 獲取觀看過『送你一朵小紅花』的所有用戶,接著獲取這些用戶各自的觀影記錄。

  2. 將這些觀影記錄進行統(tǒng)計匯總(去掉“送你一朵小紅花”),然后進行從高到低進行排序,最后可以獲取到與電影『送你一朵小紅花』關(guān)聯(lián)度最高排序的集合。

  3. 關(guān)聯(lián)度最高的前15部電影給用戶推薦。


04

總結(jié)

  1. 分析爬取豆瓣平臺數(shù)據(jù)思路,并編程實現(xiàn)。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    一区二区日韩欧美精品| 天海翼精品久久中文字幕| 五月婷婷缴情七月丁香 | 午夜午夜精品一区二区| 日韩日韩欧美国产精品| 亚洲a码一区二区三区| 亚洲精品偷拍一区二区三区| 国产一级精品色特级色国产| 亚洲精品国产福利在线| 91精品蜜臀一区二区三区| 在线播放欧美精品一区| 国产精品一区二区高潮| 日本加勒比在线观看不卡| 亚洲精品一区二区三区日韩| 亚洲精品成人综合色在线| 一本色道久久综合狠狠躁| 欧美日不卡无在线一区| 日韩精品少妇人妻一区二区| 欧美熟妇喷浆一区二区| 国产大屁股喷水在线观看视频 | 久久少妇诱惑免费视频| 女同伦理国产精品久久久| 亚洲最新中文字幕在线视频| 中文字幕人妻一区二区免费| 色婷婷视频免费在线观看| 国产水滴盗摄一区二区| 午夜福利大片亚洲一区| 国产亚洲欧美自拍中文自拍| 日本高清一区免费不卡| 国产一区一一一区麻豆| 免费福利午夜在线观看| 中文字幕精品一区二区年下载| 在线一区二区免费的视频| 最近最新中文字幕免费| 97人妻精品一区二区三区免| 深夜视频在线观看免费你懂| 国产欧美日韩综合精品二区| 日韩精品一区二区三区射精| 久久99爱爱视频视频| 国产视频福利一区二区| 国产免费人成视频尤物|