python 爬取 44130 条用户观影数据,分析挖掘用户与电影之间的隐藏信息!

Andrew2021-02-17 02:42:48

前言

明天就是大年初一,很多电影也上映,看电影前很多人都喜欢去『豆瓣』看影评,所以我爬取44130条『豆瓣』的用户观影数据,分析用户之间的关系,电影之间的联系,以及用户和电影之间的隐藏关系。

图片

爬取观影数据

数据来源

https://movie.douban.com/

图片

在『豆瓣』平台爬取用户观影数据。

爬取用户列表

网页分析

图片

为了获取用户,我选择了其中一部电影的影评,这样可以根据评论的用户去获取其用户名称(后面爬取用户观影记录只需要『用户名称』)。

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

url中start参数是页数(page20,每一页20条数据),因此start=0、20、40…,也就是*20的倍数,通过改变start参数值就可以获取这4614条用户的名称。**

图片

查看网页的标签,可以找到『用户名称』值对应的标签属性。

编程实现
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("-----")

图片

爬取用户的观影记录

上一步爬取到『用户名称』,接着爬取用户观影记录需要用到『用户名称』。

网页分析

图片

图片

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

通过改变『用户名称』,可以获取到不同用户的观影记录。

url中start参数是页数(page15,每一页15条数据),因此start=0、15、30…,也就是*15的倍数,通过改变start参数值就可以获取这1768条观影记录称。**

图片

查看网页的标签,可以找到『电影名』值对应的标签属性。

编程实现
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):
    # 创建一个workbook 设置编码
    workbook = xlwt.Workbook(encoding='utf-8')
    # 创建一个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
# 写入execl
def write_excel_xls_append(path, value):
    index = len(value)  # 获取需要写入数据的行数
    workbook = xlrd.open_workbook(path)  # 打开工作簿
    sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
    worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
    rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
    for i in range(0, index):
        for j in range(0, len(value[i])):
            new_worksheet.write(i+rows_old, j, value[i][j])  # 追加写入数据,注意是从i+rows_old行开始写入
    new_workbook.save(path)  # 保存工作簿

定义了写入excel函数,这样爬起每一页数据时候调用写入函数将数据保存到excel中。

图片

最后采集了44130条数据(原本是4614个用户,每个用户大约有500~1000条数据,预计400万条数据)。但是为了演示分析过程,只爬取每一个用户的前30条观影记录(因为前30条是最新的)。

最后这44130条数据会在下面分享给大家

数据分析挖掘

读取数据集

def read_excel():
    # 打开workbook
    data = xlrd.open_workbook('豆瓣.xls')
    # 获取sheet页
    table = data.sheet_by_name('sheet1')
    # 已有内容的行数和列数
    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中读取全部数据放到datalist集合中。

分析1:电影观看次数排行

###分析1:电影观看次数排行
def analysis1():
    dict ={}
    ###从excel读取数据
    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('电影观看次数排行(高->低)')
    plt.bar(name, num, facecolor='lightskyblue', edgecolor='white')
    plt.savefig('电影观看次数排行.png')

图片

分析
  1. 由于用户信息来源于『心灵奇旅』评论,因此其用户观看量最大。

  2. 最近的热播电影中,播放量排在第二的是『送你一朵小红花』,信条和拆弹专家2也紧跟其后。

分析2:用户画像(用户观影相同率最高)

###分析2:用户画像(用户观影相同率最高)
def analysis2():
    dict = {}
    ###从excel读取数据
    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)):
                #判断当前用户与待画像用户共同电影个数
                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 = []
    #观看相同电影次数
    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读取数据
    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)):
                #判断当前用户与待画像用户共同电影个数
                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]))

    # 去重(用户与观影率最高的用户两者之间重复的电影去掉)
    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. 根据与用户『mumudancing』观影率最高的用户(A)进行进行关联,然后获取用户(A)的全部观影记录

  2. 将用户(A)的观影记录推荐给用户『mumudancing』(去掉两者之间重复的电影)。

分析4:电影之间进行电影推荐

###分析4:电影之间进行电影推荐(与其他电影同时被观看过)
def analysis4():
    dict = {}
    ###从excel读取数据
    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("根据电影"+str(flag_movie)+"]推荐:"+str(data_dict[i][0]))

图片

分析

以电影『送你一朵小红花』为例,对电影之间进行电影推荐

  1. 获取观看过『送你一朵小红花』的所有用户,接着获取这些用户各自的观影记录。

  2. 将这些观影记录进行统计汇总(去掉“送你一朵小红花”),然后进行从高到低进行排序,最后可以获取到与电影『送你一朵小红花』关联度最高排序的集合。

  3. 将关联度最高的前15部电影给用户推荐。

总结

  1. 分析爬取豆瓣平台数据思路,并编程实现

  2. 对爬取的数据进行分析(电影观看次数排行用户画像用户之间进行电影推荐电影之间进行电影推荐

  3. 本文涉及的代码数据集在下方获取。

完整源码和数据集地址如下:

gitee.com/lyc96/douban-movie

原创:李运辰
原文链接:https://mp.weixin.qq.com/s/NRcX2he0wI3r0Qo...

str函数python函数
本作品采用《CC 协议》,转载必须注明作者和本文链接
函数简介 云函数是腾讯云为企业和开发者们提供的无服务器执行环境,可以无需购买和管理服务器的情况下运行代码。只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。SCF是实时文件处理和数据处理等场景下理想的计算平台。服务端配置云函数基础配置选择自定义创建,地域自选,部署模式,代码部署,运行环境Python3.6,其余默认即可。
Dump il2cpp 通常有两种方法,一种是用 Il2CppDumper 加载二进制文件直接dump. 另一种是用Zygisk-Il2CppDumper注入目标进程来dump il2cpp.接下来介绍一种我常用的方法。原理Unicorn 是一个CPU模拟框架,Qiling是基于Unicorn的一个系统模拟框架。一个内存扫描工具,这里主要主要用来dump进程的完整内存。准备首先用 mypower 将目标进程dump下来。启动mypoewr后运行以下命令可得到进程的内存镜像。
ChainFlag是一个区块链主题的CTF OJ平台,个人感觉现有题目质量很高,值得一做,这里分享下自己做题的过程。
0x00 前言常见webshell管理工具的分析记录,着重在流量侧。0x01 caidao1、配置使用菜刀是一款专业的网站管理软件,用途广泛,使用方便,小巧实用。支持动态脚本[如php/jsp/aspx/asp]的网站!新版antSword的ua也做了随机变换。在内置的rot13编码和解码器下,数据会通过随机变量传递给str_rot13函数,通过变换还原后再交给eval函数执行。
请求头的参数非常容易,接下来看看请求体的参数。在signData函数内部下一个断点其中比较重要的是的函数,这里生成了一段字符串来计算签名这个函数和查询参数编码的功能类似,除了data参数,并且在最后拼接了一个定值字符串,这里用python进行简单的复现 复制代码 隐藏代码。拿到密钥后,直接使用sm4算法加密就可以得到了,现在所有参数都已经能够获取了,就可以发送请求了。
target_func: sark.Function 类型,表示要查找交叉引用关系的目标函数对象。max_depth: int 类型,表示查找引用关系的最大深度。② 然后根据 include_data_xref 的设置,获取该函数中所有的引用 refes。③ 遍历函数的所有引用 ref,如果该引用 ref 指向目标函数,则在有向图 G 中通过 add_edge 函数添加一条从当前函数到目标函数的边,并返回 True。④ 如果引用指向另一个函数,则递归调用 find_cross_refs 函数查找两个函数之间的交叉引用关系。⑤ 如果所有引用遍历完,仍然没有找到交叉引用,则返回 False。
之后想到了更完美的办法
为了进行并行处理,我们将任务划分为多个子单元。我们将把数据以数组的形式送入函数,它将根据可用的工作者的数量,一次并行处理多个值。这些工作器是基于你的处理器内的核心数量的。Python包减少大文件的处理时间。处理时间可能因机器不同而不同。我们将导入multiprocessing、joblib和tqdm用于并行处理,pandas用于数据摄取,re、nltk和string用于文本处理。
就需要了解一下名称空间python的名称空间,是从名称到对象的映射,在python程序的执行过程中,至少会存在两个名称空间。python中一切均为对象,均继承于object对象,python的object类中集成了很多的基础函数,假如我们需要在payload中使用某个函数就需要用object去操作。
前言本文将记录学习下如何通过 Python 脚本实现 WIFI 密码的暴力破解,从而实现免费蹭网。无图形界面先来看看没有图形界面版的爆破脚本。WIFI爆破import pywififrom pywifi import constimport timeimport datetime. 下面进行改造优化:import pywifiimport timefrom pywifi import const. # WiFi扫描模块def wifi_scan(): # 初始化wifi wifi = pywifi.PyWiFi() # 使用第一个无线网卡 interface = wifi.interfaces()[0] # 开始扫描 interface.scan() for i in range: time.sleep print('\r扫描可用 WiFi 中,请稍后。。。
Andrew
暂无描述