Apriori是常用的关联规则挖掘方法之一, 本例为关联规则挖掘实战练习, 通过python自动化爬虫抓取豆瓣电影中某导演的电影名和演员, 通过apriori算法看出来其选择演员的倾向。
一. 网络爬虫
本例选择冯小刚导演为分析对象, 先进入豆瓣搜索冯小刚, 分析带爬取的网页:
1. url分析
首页网址为:
https://movie.douban.com/subject_search?search_text=冯小刚&cat=1002&start=0
第二页网址为:
https://movie.douban.com/subject_search?search_text=冯小刚&cat=1002&start=15
在查看之后需要爬取的网址, 可以确定网页变化的规律为, 每翻一页'start=' 后面的数字增值15, 其他不变.
2. 页面模块分析
除首页有16条数据(首页页首多出导演介绍)和末页以外, 其他页均包含15条数据, 通过对源代码分析, 可用Xpath定位每条数据的电影名和演员表, 其中演员表第一位为导演名, 由于网页中存在冯小刚不导演但参演的电影, 如"功夫", 所以可以通过第一位筛除不是冯小刚导演的电影.
利用python中的selenium自动化工具, 通过火狐浏览器爬取冯小刚导演的电影名及演员信息, 遇到某页信息不足15条时判定为末页, 在末页爬取完毕或爬取完10000条电影数据后结束自动化爬取, 同时把数据写入本地'冯小刚.csv'文件, 在写入时, 用相应电影名代替导演名, 得到全部'电影-演员'数据.
爬虫代码:
# -*- coding:utf-8 -*-
from lxml import etree
from selenium import webdriver
import time
import csv
driver = webdriver.Firefox()
# 设置想要下载的导演 数据集
director = '冯小刚'
# 写CSV 文件
file_name = './' + director + '.csv'
base_url = 'https://movie.douban.com/subject_search?search_text=' + director + '&cat=1002&start='
out = open(file_name, 'w', newline='', encoding='utf-8-sig')
csv_write = csv.writer(out, dialect='excel')
# 下载指定页面的数据
# 定义每页抓取函数
def download(request_url):
driver.get(request_url)
time.sleep(1)
html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")
html = etree.HTML(html)
# 设置电影名称,导演演员 的 XPATH
movie_lists = html.xpath(
"/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']")
name_lists = html.xpath(
"/html/body/div[@id='wrapper']/div[@id='root']/div[1]//div[@class='item-root']/div[@class='detail']/div[@class='meta abstract_2']")
# 获取返回的数据个数
num = len(movie_lists)
if num > 15: # 第一页会有 16 条数据,其中第一条为导演介绍 需要去掉
movie_lists = movie_lists[1:]
name_lists = name_lists[1:]
for (movie, name_list) in zip(movie_lists, name_lists):
# 会存在数据为空的情况
if name_list.text is None:
continue
# 显示下演员名称
print(name_list.text)
names = name_list.text.split('/')
# 判断导演是否为指定的 director
if names[0].strip() == director:
# 将第一个字段设置为电影名称
names[0] = movie.text
csv_write.writerow(names)
print('OK') # 代表这页数据下载成功
if num >= 15:
# 继续下一页
return True
else:
# 没有下一页
return False
# 设置开始的ID为0,每页增加 15
start = 0
while start < 10000: # 最多抽取1万部电影
request_url = base_url + str(start)
# 下载数据,并返回是否有下一页
flag = download(request_url)
if flag:
start = start + 15
else:
break
out.close()
print('finished')
打印信息:

爬取数据文件截图:
在文件中可以看到, 冯小刚导演的非电影型节目, 如"2014年中央电视台春节联欢晚会" 也被爬取并存入了文件, 在此手动删除了第20、24、25、26行非电影型数据.
二. 关联分析
python中的第三方工具包efficient_apriori提供了apriori算法关联规则分析, 通过传入list类型数据, 最小支持度和最小置信度参数, 可获得相应的频繁项集和关联规则.
首先读取.csv文件, 对演员名进行去空格处理后生成每个电影的演员名列表, 最后使用efficient_apriori中的apriori方法得到频繁项集itemsets和关联规则rules.
关联规则代码:
# -*- coding: utf-8 -*-
from efficient_apriori import apriori
import csv
director = '冯小刚'
file_name = './'+director+'.csv'
lists = csv.reader(open(file_name, 'r', encoding='utf-8-sig'))
# 数据加载
data = []
for names in lists:
name_new = []
for name in names:
name_new.append(name.strip()) # 去掉演员数据中的空格
data.append(name_new[1:]) # 去掉电影名, 加入列表
# 挖掘频繁项集和关联规则
itemsets, rules = apriori(data, min_support=0.15, min_confidence=1)
print(itemsets)
print(rules)
通过调整最小支持度和最小执行度, 在最小支持度为0.15, 最小置信度为1, 得到如下结果:

由此可以得到, 冯小刚导演比较喜欢用的演员是张国立, 徐帆, 葛优, 且在张国立参演时, 徐帆一般也会参演此电影.
PS: 由于豆瓣电影爬取网页中有包含某中间页数据不足15条的情况, 如张艺谋导演第三页只有14条,
在自动化爬取中需要灵活调整代码第48行 if num >= 15: 的数值, 使爬取信息得以完全.
相关数据及请点击: GitHub
247



被折叠的 条评论
为什么被折叠?



