selenium爬取豆瓣电影信息以Apriori分析关联规则,看看导演如何选择演员~

先上爬虫结果:

这是爬下来的数据,主要是用到演员名那些列。

链接:https://search.douban.com

要爬的页面:

爬虫不是重点,用到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)之间的关系,它在我们的生活中有很多应用场景,“购物篮分析”就是一个常见的场景,

这个场景可以从消费者交易记录中发掘商品与商品之间的关联关系,进而通过商品捆绑销售或者相关推荐的方式带来更多的销售量。

关联规则中的几个概念

支持度

什么是支持度呢?

支持度是个百分比,它指的是某个商品组合出现的次数与总次数之间的比例。支持度越高,代表这个组合出现的频率越大。

在这个例子中,我们能看到“牛奶”出现了 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 算法的递归流程:

  1. K=1,计算 K 项的支持度;
  2. 筛选掉小于最小支持度的项集;
  3. 如果项集为空,则对应 K-1 项集的结果为最终结果。
  4. 否则 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...







posted @ 2019-10-12 01:42  byadmin  阅读(1027)  评论(0)    收藏  举报