selenium爬取豆瓣电影信息以Apriori分析关联规则,看看导演如何选择演员~
先上爬虫结果:
这是爬下来的数据,主要是用到演员名那些列。

要爬的页面:

爬虫不是重点,用到selenium,直接上代码好了,在代码写了详细注释:
import requests import time import csv from selenium import webdriver file_name = 'douban.csv' # 要保存的文件名 out = open(file_name,'a', newline='', encoding='utf-8-sig') # 打开文件,用encoding='utf-8-sig'防止中文乱码 csv_write = csv.writer(out, dialect='excel') # csv_write对象 url = 'https://search.douban.com/movie/subject_search?cat=1002&search_text=' keyword = '张艺谋' def download(keyword): browser = webdriver.Chrome() browser.get(url) # 这样会打开浏览器并访问url input = browser.find_element_by_id('inp-query') # 以id查找html节点 input.send_keys(keyword) # 在找到的节点输入keyword button = browser.find_element_by_xpath('//div[@class="inp-btn"]/input[@type="submit"]') # 以xpath查找html节点 button.click() # 点击按钮 films = browser.find_elements_by_xpath('//div[@class="title"]/a') # 以xpath查找电影名多个节点 actors = browser.find_elements_by_xpath('//div[@class="meta abstract_2"]') # 以xpath查找演员名多个节点 while len(films) >0: temp = [] # 用来存储爬取的一页数据 for film in films: print(film.text) if len(films) == 16: #第一页可能有16条信息,有一条是导演的介绍,删去即可 films = films[1:] actors = actors[2:] for i in range(len(actors)): temp.append(films[i].text) # 先加入电影名 for a in actors[i].text.split('/'): # 演员名是以'/'连接起来的,我们要将它分开以获得每个演员姓名 temp.append(a.strip()) # 先加入演员名 print(temp) csv_write.writerow(temp) #写入csv temp = [] try: next = browser.find_element_by_xpath('//a[@class="next"]') #这里使用try是因为最后一页没有下一页,这里会报错。报错时退出循环就好 except: break next.click() films = browser.find_elements_by_xpath('//div[@class="title"]/a') actors = browser.find_elements_by_xpath('//div[@class="meta abstract_2"]') browser.close() # 关闭浏览器 download(keyword) out.close() #关闭刚开始打开的文件handle
然后用Apriori分析关联规则
Apriori 是关联规则挖掘的重要算法
关联规则挖掘可以让我们从数据集中发现项与项(item 与 item)之间的关系,它在我们的生活中有很多应用场景,“购物篮分析”就是一个常见的场景,
这个场景可以从消费者交易记录中发掘商品与商品之间的关联关系,进而通过商品捆绑销售或者相关推荐的方式带来更多的销售量。
关联规则中的几个概念
U%7DWL4L@@99$0V.png)
支持度
什么是支持度呢?
支持度是个百分比,它指的是某个商品组合出现的次数与总次数之间的比例。支持度越高,代表这个组合出现的频率越大。
在这个例子中,我们能看到“牛奶”出现了 4 次,那么这 5 笔订单中“牛奶”的支持度就是 4/5=0.8。
同样“牛奶 + 面包”出现了 3 次,那么这 5 笔订单中“牛奶 + 面包”的支持度就是 3/5=0.6。
置信度
什么是置信度呢?
它指的就是当你购买了商品 A,会有多大的概率购买商品 B,在上面这个例子中:
置信度(牛奶→啤酒)=2/4=0.5,代表如果你购买了牛奶,有多大的概率会购买啤酒?
置信度(啤酒→牛奶)=2/3=0.67,代表如果你购买了啤酒,有多大的概率会购买牛奶?
我们能看到,在 4 次购买了牛奶的情况下,有 2 次购买了啤酒,所以置信度 (牛奶→啤酒)=0.5,而在 3 次购买啤酒的情况下,有 2 次购买了牛奶,所以置信度(啤酒→牛奶)=0.67。
所以说置信度是个条件概念,就是说在 A 发生的情况下,B 发生的概率是多少。
提升度
什么是提升度呢?
我们在做商品推荐的时候,重点考虑的是提升度,因为提升度代表的是“商品 A 的出现,对商品 B 的出现概率提升的”程度。
还是看上面的例子,如果我们单纯看置信度 (可乐→尿布)=1,也就是说可乐出现的时候,用户都会购买尿布,那么当用户购买可乐的时候,我们就需要推荐尿布么?
实际上,就算用户不购买可乐,也会直接购买尿布的,所以用户是否购买可乐,对尿布的提升作用并不大。我们可以用下面的公式来计算商品 A 对商品 B 的提升度:
提升度 (A→B)= 置信度 (A→B)/ 支持度 (B)
这个公式是用来衡量 A 出现的情况下,是否会对 B 出现的概率有所提升。
提升度 (A→B)>1:代表有提升;
提升度 (A→B)=1:代表有没有提升,也没有下降;
提升度 (A→B)<1:代表有下降。
Apriori 算法的递归流程:
- K=1,计算 K 项的支持度;
- 筛选掉小于最小支持度的项集;
- 如果项集为空,则对应 K-1 项集的结果为最终结果。
- 否则 K=K+1,重复 1-3 步。
安装efficient_apriori
pip install efficient_apriori
代码:
from efficient_apriori import apriori import csv file_name = 'douban.csv' lists = csv.reader(open(file_name, 'r', encoding='utf-8-sig')) data = [] for names in lists: data.append(names[1:]) #挖掘频繁项集和关联规则 itemsets,rules = apriori(data,min_support=0.1,min_confidence=1) #min_support设置最小支持度,min_confidence设置最小置信度 print(itemsets) print(rules)
结果:
{1: {('巩俐',): 11, ('张艺谋',): 65}, 2: {('巩俐', '张艺谋'): 11}}
[{巩俐} -> {张艺谋}]
意思是在我爬取的数据中,巩俐一共单独出现11次,张艺谋一共单独出现65次,
(巩俐,张艺谋)组合一共出现11次,它认为巩俐对张艺谋的出现有帮助。
按照上面提升度的计算:
提升度(巩俐->张艺谋) = 置信度(巩俐->张艺谋)/支持度(张艺谋)
置信度(巩俐->张艺谋) = 11/11 = 1 #即巩俐出现的11次都伴随有张艺谋的出现
支持度(张艺谋) = 65/78 #张艺谋单独出现65次,总条目78
提升度(巩俐->张艺谋)=1/65/78=78/65
所以支持度大于0.1, 置信度等于1。对应我们上面设置的参数
min_support=0.1,min_confidence=1
所以apriori将提升度(巩俐->张艺谋)这条筛选出来了。
The End...

浙公网安备 33010602011771号