基于python的用户画像系统设计与实现

实验要求
  • 编程语言:python
  • 爬取内容:爬取用户基础属性和UP主属性
  • 数据存储:mysql
  • 生成用户画像和UP主的画像
  • flask前端展示人员画像
爬虫
  • 爬取哔哩哔哩用户收藏夹内容和关注列表,代码如下:

def shoucangjia(cookie, mysql_handler, uid):
    import requests
    media_ids = get_media_id(cookie, uid)
    for media_id in media_ids:
        # url = "https://api.bilibili.com/x/v3/fav/resource/list?media_id=756273631&pn=1&ps=20&keyword=&order=mtime&type=0&tid=0&platform=web&jsonp=jsonp"
        url = f"https://api.bilibili.com/x/v3/fav/resource/list?media_id={media_id}&pn=1&ps=20&keyword=&order=mtime&type=0&tid=0&platform=web&jsonp=jsonp"

        payload = {}
        headers = {
            'authority': 'api.bilibili.com',
            'accept': 'application/json, text/plain, */*',
            'accept-language': 'zh-CN,zh;q=0.9',
            'cookie': cookie,
            'origin': 'https://space.bilibili.com',
            'referer': f'https://space.bilibili.com/{uid}/favlist',
            'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '"Windows"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-site',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
        }

        response = requests.request("GET", url, headers=headers, data=payload)
        time.sleep(2)
        print(response.text)
        for it in response.json()['data']['medias']:
            title = it['title']
            intro = it['intro']
            mid = it['upper']['mid']
            print('收藏夹中内容是')
            print('title: {}'.format(title))
            print('intro: {}'.format(intro))
            print('mid: {}'.format(mid))
            insert_sql = "INSERT INTO bilibili_shoucang (title,intro,uid,mid) VALUES( '%s','%s','%s','%s');" % (title,intro,uid, mid)
            print("insert_sql: {}".format(insert_sql))
            mysql_handler.insert_data(insert_sql)
            with open('./data/收藏夹.txt', 'a', encoding='utf8') as f:
                f.write(intro + '\n')
def guanzhu(cookie, mysql_handler, uid):
    import requests

    url = f"https://api.bilibili.com/x/relation/followings?vmid={uid}&pn=1&ps=20&order=desc&order_type=attention&jsonp=jsonp&callback=__jp13"

    payload = {}
    headers = {
        'authority': 'api.bilibili.com',
        'accept': '*/*',
        'accept-language': 'zh-CN,zh;q=0.9',
        'cookie': cookie,
        'referer': f'https://space.bilibili.com/{uid}/fans/follow',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'script',
        'sec-fetch-mode': 'no-cors',
        'sec-fetch-site': 'same-site',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
    }

    response = requests.request("GET", url, headers=headers, data=payload)
    time.sleep(2)
    print(response.text)
    ob = re.search('__jp13\((.*?)}}\)', response.text)
    if ob:
        str_data = ob.group(1) + '}}'
        # print(str_data)
        # print(type(str_data))
        json_da = json.loads(str_data)
        for it in json_da['data']['list']:
            # print('it: {}'.format(it))
            uname = it['uname']
            sign = it['sign']
            mid = it['mid']
            print('关注人员有')
            print('uname:{}'.format(uname))
            print('sign:{}'.format(sign))
            print('mid:{}'.format(mid))
            insert_sql = 'INSERT INTO bilibili_guanzhu(uname,sign,uid,mid) VALUES( "%s","%s","%s","%s");' % (uname,sign,uid,mid)
            print("insert_sql: {}".format(insert_sql))
            mysql_handler.insert_data(insert_sql)
            with open('./data/关注.txt', 'a', encoding='utf8') as f:
                f.write(sign + '\n')


  • 我们通过分析视频题目得到用户的偏好
  • 我们再通过关注列表的用户首页视频数据得到用户偏好
  • 通过这些偏好来确定用户爱好属性最后通过这些属性来生成用户画像,还需要爬取up主的主页视频内容来分析他的用户画像,代码如下:
def get_guanzhushufansshu(cookie, mid):
    import requests

    url = f"https://api.bilibili.com/x/relation/stat?vmid={mid}&jsonp=jsonp"

    payload = {}
    headers = {
        'authority': 'api.bilibili.com',
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9',
        'cookie': cookie,
        # 'cookie': '_uuid=284A9C35-410F10-EDF6-3C17-A54AB9E37FC100821infoc; b_nut=1643015606; buvid3=DA5BB132-6D37-E925-D4B3-2C8A4E90E3E206238infoc; buvid4=113A9242-DF44-71D7-411B-D2635313C53406238-022012417-49/i0Y3vQxJnoCHY0LiQLA%3D%3D; rpdid=|(u|kk)Jl)m|0J\'uYRRR)))mJ; i-wanna-go-back=-1; nostalgia_conf=-1; buvid_fp_plain=undefined; SESSDATA=23090d69%2C1666616262%2Cebd78%2A41; bili_jct=164fb21485e3237e504b7289f12e3522; DedeUserID=478755531; DedeUserID__ckMd5=7b252a2e31a4618c; sid=6lg80kg6; CURRENT_QUALITY=64; buvid_fp=5817007307836e6434cf19e36092363c; CURRENT_BLACKGAP=0; blackside_state=0; b_ut=5; is-2022-channel=1; CURRENT_FNVAL=4048; bp_video_offset_478755531=656642964180697100; fingerprint3=1aef2ae9098ea1c4d68da3b9ae656903; fingerprint=a6a9cadc0142d2671c783db7928ea24c; b_lsid=878109938_180A6C3B44F; innersign=1; PVID=2',
        'origin': 'https://space.bilibili.com',
        'referer': f'https://space.bilibili.com/{mid}',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-site',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
    }

    response = requests.request("GET", url, headers=headers, data=payload)

    # print(response.text)
    guanzhushu = response.json()['data']['following']
    print('关注数:{}'.format(guanzhushu))
    fansshu = response.json()['data']['follower']
    print('粉丝数:{}'.format(fansshu))
    return guanzhushu,fansshu
def gethuozanshubofnagshuyuedushu(cookie, mid):
    import requests

    url = f"https://api.bilibili.com/x/space/upstat?mid={mid}&jsonp=jsonp"

    payload = {}
    headers = {
        'authority': 'api.bilibili.com',
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9',
        'cookie': cookie,
        # 'cookie': '_uuid=284A9C35-410F10-EDF6-3C17-A54AB9E37FC100821infoc; b_nut=1643015606; buvid3=DA5BB132-6D37-E925-D4B3-2C8A4E90E3E206238infoc; buvid4=113A9242-DF44-71D7-411B-D2635313C53406238-022012417-49/i0Y3vQxJnoCHY0LiQLA%3D%3D; rpdid=|(u|kk)Jl)m|0J\'uYRRR)))mJ; i-wanna-go-back=-1; nostalgia_conf=-1; buvid_fp_plain=undefined; SESSDATA=23090d69%2C1666616262%2Cebd78%2A41; bili_jct=164fb21485e3237e504b7289f12e3522; DedeUserID=478755531; DedeUserID__ckMd5=7b252a2e31a4618c; sid=6lg80kg6; CURRENT_QUALITY=64; buvid_fp=5817007307836e6434cf19e36092363c; CURRENT_BLACKGAP=0; blackside_state=0; b_ut=5; is-2022-channel=1; CURRENT_FNVAL=4048; bp_video_offset_478755531=656642964180697100; fingerprint3=1aef2ae9098ea1c4d68da3b9ae656903; fingerprint=a6a9cadc0142d2671c783db7928ea24c; b_lsid=878109938_180A6C3B44F; innersign=1; PVID=2',
        'origin': 'https://space.bilibili.com',
        'referer': f'https://space.bilibili.com/{mid}',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-site',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
    }

    response = requests.request("GET", url, headers=headers, data=payload)

    # print(response.text)
    huozanshu = response.json()['data']['likes']
    print('获赞数:{}'.format(huozanshu))
    bofangshu = response.json()['data']['archive']['view']
    print('播放数:{}'.format(bofangshu))
    yuedushu = response.json()['data']['article']['view']
    print('获赞数:{}'.format(yuedushu))
    return huozanshu,bofangshu,yuedushu
def get_up_info(cookie, mid):
    import requests

    url = f"https://api.bilibili.com/x/space/arc/search?mid={mid}&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp"

    payload = {}
    headers = {
        'authority': 'api.bilibili.com',
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9',
        'cookie': cookie,
        # 'cookie': '_uuid=284A9C35-410F10-EDF6-3C17-A54AB9E37FC100821infoc; buvid3=DA5BB132-6D37-E925-D4B3-2C8A4E90E3E206238infoc; b_nut=1643015606; buvid4=113A9242-DF44-71D7-411B-D2635313C53406238-022012417-49/i0Y3vQxJnoCHY0LiQLA%3D%3D; rpdid=|(u|kk)Jl)m|0J\'uYRRR)))mJ; i-wanna-go-back=-1; nostalgia_conf=-1; buvid_fp_plain=undefined; SESSDATA=23090d69%2C1666616262%2Cebd78%2A41; bili_jct=164fb21485e3237e504b7289f12e3522; DedeUserID=478755531; DedeUserID__ckMd5=7b252a2e31a4618c; sid=6lg80kg6; CURRENT_QUALITY=64; buvid_fp=5817007307836e6434cf19e36092363c; blackside_state=0; CURRENT_BLACKGAP=0; b_ut=5; is-2022-channel=1; CURRENT_FNVAL=4048; bp_video_offset_478755531=656642964180697100; fingerprint3=1aef2ae9098ea1c4d68da3b9ae656903; fingerprint=a6a9cadc0142d2671c783db7928ea24c; innersign=1; PVID=3; b_lsid=2E10610AD3_1809868C916',
        'origin': 'https://space.bilibili.com',
        'referer': f'https://space.bilibili.com/{mid}/video',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-site',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36'
    }

    response = requests.request("GET", url, headers=headers, data=payload)

    print(response.text)
    text = ''
    for m in response.json()['data']['list']['vlist']:
        description = m['description']
        title = m['title']
        print('description: {}'.format(description))
        print('title: {}'.format(title))
        text += '{},{}'.format(title, description)
    return text


  • 最后需要和up的用户画像做一个相似度判断,画像如下:
    用户画像
    UPUP主画像

  • 最后就是前后端和数据库的功能展示了,如下:
    关注
    收藏
    flask

最后

本文的目的只有一个就是学习更多知识,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,对本文有任何疑问可以+v讨论:zgffzgffzgff。

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
随着大数据时代的到来,能够牢牢的抓住老客户、吸引新客户、读懂用户的偏好兴趣以及挖掘用户的潜在价值,这些对于运营商的的发展至关重要。而达成这一目标需要对用户市场进行细分实现精细化营销,应用数据挖掘技术对用户进行画像,实现用户细分,其研究和发展在实现运营商精确营销、提高工作效率、减少经营成本方面具有重要的指导意义和实用价值。本文以移动互联网用户行为作为研究对象,以用户画像理论作为理论依据,提出了用户画像系统的建设思路,采用标签化方法对用户行为以及用户偏好特征进行描述。本文首先对用户画像系统进行整体的阐述,分别从具象的语义化以及抽象的数学模型来对用户画像系统进行概述,再者从动态性以及时空局限性对用户画像的特性进行描述,最后从建模的角度,将用户画像系统分为静态信息画像以及动态信息画像,对其中的用到的建模方法以及所使用的数据挖掘算法进行了详细的介绍。其次对用户画像的整体架构上进行了描述。分别从系统的总体设计和功能架构,以及业务架构方面将用户画像系统设计思路进行详细的描述。再者文中结合运营商的经营特点以及业务经验,将用户画像系统分别从基础属性、业务属性、产品属性、渠道属性详细的阐述了用户静态信息标签构建的方法以及具体的分类。然后通过数据挖掘方法的方法实现中文分词,利用LDA聚类模型获得分词向量化从而获得用户文本的特征向量,接着利用改进的TF-IDF分类方法实现对用户不同维度信息的预测,从而构建了用户的互联网基础属性特征。其次通过对用户上网日志的解析和网络爬虫数据的匹配,构建内容的评分模型,实现对移动客户的特征、偏好等信息进行高度总结,从而生成用户移动互联网偏好特征标签,全面丰富了用户动态信息标签的构建。在此基础上,提出了用户画像系统运用列数据库对画像数据进行存储,标签元数据管理以及标签生命周期管理、查询机制和更新机制一系列完整的规范化的用户画像系统管理流程,从而构建一个完整闭环的用户画像系统。最后以营销过程中流量提升以及手机阅读软件用户量提升为例描述了用户画像系统在移动营销业务中的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

v(z_xiansheng88)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值