出處: 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=0 url = '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# 寫入execl def 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中。 03 數(shù)據(jù)分析挖掘 讀取數(shù)據(jù)集
從豆瓣.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') 分析
分析2:用戶畫像(用戶觀影相同率最高)
分析以用戶『mumudancing』為例進行用戶畫像
分析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』為例,對用戶之間進行電影推薦
分析4:電影之間進行電影推薦
分析以電影『送你一朵小紅花』為例,對電影之間進行電影推薦
04 總結(jié)
|
|