精华内容
下载资源
问答
  • 爬取B站我关注的人关注的人关注的人 本项目最后更新于2018-6-4,可能会因为没有更新而失效。如已失效或需要修正,请联系我! 本项目已授权微信公众号“菜鸟学Python”发表文章 爬取B站10万数据,看看都有哪些热门的...

    此文首发于我的个人博客:爬取B站我关注的人关注的人关注的人 — zhang0peter的个人博客


    声明

    • 代码、教程均为本人原创,且仅限于学习交流,请勿用于任何商业用途!

    我突发奇想,想用Python爬取B站中我关注的人,我关注的人关注的人,我关注的人关注的人关注的人等。

    准备阶段

    写代码前先构思思路:既然我要爬取用户关注的用户,那我需要存储用户之间的关系,确定谁是主用户,谁是follower。
    存储关系使用数据库最方便,也有利于后期的数据分析,我选择sqlite数据库,因为Python自带sqlite,sqlite在Python中使用起来也非常方便。
    数据库中需要2个表,一个表存储用户的相互关注信息,另一个表存储用户的基本信息,在B站的用户体系中,一个用户的mid号是唯一的。
    然后我还需要一个列表来存储所以已经爬取的用户,防止重复爬取,毕竟用户之间相互关注的现象也是存在的,列表中存用户的mid号就可以了。
    最后我需要找到B站用户的关注列表的json接口,很快就找到了,地址是https://api.bilibili.com/x/relation/followings?vmid=2&pn=1&ps=20&order=desc&jsonp=jsonp&callback=__jp7
    其中vimd=后的参数就是用户的mid号,pn=1指用户的关注的第一面用户,一面显示20个用户。因为B站的隐私设置,一个人只能爬取其他人的前5面关注,共100人。

    开始写代码

    先写建数据库的代码,数据库中放一个用户表,一个关系表:

    def create():
        # 创建数据库
        global conn
        conn = sqlite3.connect('data.db')
        conn.execute("""
                    create table if not exists user(
                    id INTEGER PRIMARY KEY ,
                    mid int DEFAULT NULL,
                    name varchar DEFAULT NULL,
                    sign varchar DEFAULT NULL)""")
        conn.execute("""
                    create table if not exists relation(
                    id INTEGER PRIMARY KEY ,
                    master int,
                    following int 
                    )""")
        conn.commit()
    

    然后写爬取的核心代码:

    def func(startid=0):
        global user
        if startid == 0:
            return
        i = 0
        result = []
        ref_url = "https://space.bilibili.com/"+str(startid)+"/#/fans/follow"
        head = {
            'Accept': '*/*',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Cache-Control': 'no-cache',
            'Connection': 'keep-alive',
            'DNT': '1',
            'Host': 'api.bilibili.com',
            'Pragma': 'no-cache',
            'Referer': ref_url,
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
            AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36'
        }
        while 1:
            i += 1
            if i >= 6:
                break
            url = "https://api.bilibili.com/x/relation/followings?vmid=" + \
                str(startid)+"&pn="+str(i) + \
                "&ps=20&order=desc&jsonp=jsonp&callback=__jp5"
            try:
                r = requests.get(url, headers=head, timeout=10).text
                r2 = eval(r[6:-1].replace('null', 'None'))
                list1 = r2['data']['list']
                if list1 == []:
                    break
                else:
                    for user1 in list1:
                        result.append(
                            [user1["mid"], user1["uname"], user1["sign"]])
            except Exception as e:
                print(e)
        if result != []:
            save(result, startid)
    
    

    在这段代码里,我使用了requests库来获取网页,其中有10行代码用于修改requests的header,防止爬虫被封。
    接着写一个保存数据到数据库的函数:

    def save(result=[], master=0):
        # 将数据保存至本地
        global conn, user
        if result == [] or master == 0:
            print("save error!")
            return
        command1 = "insert into user \
                 (mid,name,sign) values (?,?,?);"
        command2 = "insert into relation\
                 (master,following)values(?,?)"
        for row in result:
            try:
                temp = (master, row[0])
                if row[0] not in user:
                    user.append(row[0])
                    conn.execute(command1, row)
                    conn.execute(command2, temp)
                else:
                    conn.execute(command2, temp)
            except Exception as e:
                print(e)
                print("insert error!")
                conn.rollback()
        conn.commit()
        result = []
    

    最后写main函数:

    if __name__ == "__main__":
        create()
        cycle = 0
        recordids = 0
        time0 = time.time()
        while 1:
            cycle += 1
            if recordids == 0:
                users = [startid]
            else:
                users = user[recordids:len(user)]
            for i in users:
                recordids += 1
                func(i)
                time1 = time.time()
                print("\r已爬取{0}个用户,正在第{1}层 ,总花费时间:{2:.2f}s".format(
                    recordids, cycle, time1-time0), end="")
    

    main函数在运行时会提示当前花费的时间和已经爬取的用户。
    我用user这个全局变量来存储所有已经爬取过的用户的mid号。
    完整的代码在 bilibili-following-spider.py

    实际操作

    我调试完程序后,已我自己作为开始的起点,花费了接近一天的时间,爬取了10万用户。
    然后我想单单爬取用户的关注,然后存在数据库中是对数据是一种浪费,我打算利用我拥有的数据。

    进阶操作

    我打算利用已经爬取到本地的数据进行词云的生成,来看一下这10万用户中共同的关注的哪些UP主出现的次数最多。
    代码的思路主要是从数据库中获取用户的名字,重复的次数越多说明越多的用户关注,然后我使用fate的一张图片作为
    词云的mask图片,最后生成词云图片。
    代码如下:

    import matplotlib.pyplot as plt
    from wordcloud import WordCloud, ImageColorGenerator
    from scipy.misc import imread
    import sqlite3
    conn = sqlite3.connect('data.db')
    user = {}
    for i in conn.execute("select mid,name from user order by id").fetchall():
        user[i[0]] = i[1]
    wordlist = []
    for i in conn.execute("select following from relation order by id").fetchall():
        if i[0] in user:
            wordlist.append(user[i[0]])
    wl_space_split = " ".join(wordlist)
    mask_png = imread("fate.jpeg")
    my_wordcloud = WordCloud(
        font_path=r"C:\Windows\Fonts\simhei.ttf",# 词云自带的字体不支持中文,在windows环境下使用黑体中文
        background_color="white",  # 背景颜色
        max_words=500,  # 词云显示的最大词数
        max_font_size=100,  # 字体最大值
        random_state=42,
        mask=mask_png,
        width=1000, height=860, margin=2,).generate(wl_space_split)
    image_colors = ImageColorGenerator(mask_png)
    plt.figure()
    plt.imshow(my_wordcloud.recolor(color_func=image_colors))
    plt.axis("off")
    plt.figure()
    plt.imshow(mask_png, cmap=plt.cm.gray)
    plt.axis("off")
    plt.show()
    my_wordcloud.to_file("wordcloud.png")
    

    词云生成的完整代码在bilibili-wordcloud.py
    最后生成的图片为
    在这里插入图片描述
    可以看出蕾丝,暴走漫画,木鱼水心,阅后即瞎,papi酱等B站大UP主都是热门关注。

    GitHub项目地址:https://github.com/zhang0peter/bilibili-following-spider

    展开全文
  • 我的好友、我关注的人、关注我的人 在“好友”页面里,你可以找到三个不同的列表“XX的好友”“XX关注的人”“关注XX的人”。 他们分别有着不同的属性: 1,“XX的好友”是你的双向好友,即你申请加他为好友后,你...
     
    我的好友、我关注的人、关注我的人 
     
     
    在“好友”页面里,你可以找到三个不同的列表“XX的好友”“XX关注的人”“关注XX的人”。
     
    他们分别有着不同的属性:
     
    1,“XX的好友”是你的双向好友,即你申请加他为好友后,你同意了你的申请;或者对方加你为好友,你同意了他的申请。你可以在此页面点击“删除好友”,解除你们的好友关系。
     
    2,“XX关注的人”是你正在关注的人。当你在访问对方的空间时,点击“关注他/他”时产生的。当然,你也可以加他们为好友。
     
    以上两类人,你可以通过“好友动态”知道他们的的近况。
     
    3,“关注XX的人”是他人关注你的名单。你可以通过这里知道有哪些人在关注你,对你感兴趣。他们肯定访问过你的空间,或者阅读过你的博客。如果你有需要,可以马上加他们为好友。
    
    

     

    如图:

     

    展开全文
  • CSDN找到:我关注的人

    千次阅读 2016-01-26 11:21:24
    一、进入“个人主页”, 二、找到“我的关系”,即可。 如图:

    一、进入“个人主页”,

    二、找到“我的关系”,即可。


    如图:





    展开全文
  • 在CSDN觉得某些大牛文章写得很好,点了一波关注,某一天,突然想回头看一下自己看过的某篇文章,点开,我关注的人,却发现关注的人里的博客只显示了最近几篇的文章,想要找之前的文章却找不到了,如下图: ...

    在CSDN觉得某些大牛文章写得很好,点了一波关注,某一天,突然想回头看一下自己看过的某篇文章,点开,我关注的人,却发现关注的人里的博客只显示了最近几篇的文章,想要找之前的文章却找不到了,如下图:

     

    这时,我们需要将页面网址进行修改:

    找到老版本的翻页钮了,可以查看之前看过的博客了 

    展开全文
  • 在CSDN写博四个月,扪心自问,基本上每一篇文章都是在用心、认真写, 很幸运,也有几篇文章被推荐到博客首页,受到了更多的关注。 于是,抱着试试看态度,给yuexn@csdn.net发了一封邮件进行自荐,
  • 自己写着玩公众号“程序员爱叨叨”,欢迎关注
  • 我关注的博客

    2013-05-20 14:50:01
    唐巧技术博客(IOS) 子龙山(cocos2d/cocos2d-x) Developer_Zhang专栏(ios) beforweb(pm) http://cdc.tencent.com/(设计体验)
  • 我的博客今天为止共101015次访问,排名1164,好友227关注者222。终于突破10万了,真好难啊!祝大家工作顺利!
  • 狗哥从运营自己公众号到现在也差不多一年多了,在这段时间内也认识了不少优秀管理者和开发者还有一个是华师大在读研究生,想在这里把他们介绍给大家。首先要说是,他们都...
  • 微博关注是根据什么来知道你关注我,我关注你了?数据库怎么设计? 尤其是一个明星,他有上百万上千万粉丝: 解决方案有两个思路: 1 由被关注者主动推数据 2 由被关注者向粉丝推送一个通知,然后由粉丝...
  • 在博客园里乃至其它地方看到有不少对培训班出身程序员评价,其实至少在面试时,培训班出来程序员没有原罪。 也面试不少程序员,从高级开发到初级开发都有,有985和211名校出身,也有大专学习通过...
  • 自认是一个心思细腻的人,这主要体现在我能在不知不觉中照顾到其他人的感受,是一个极喜欢换位思考的人。  就好像这样的行为总是发生在不知不觉中一样,甚至很难回忆具体会在什么情境中照顾到别人的感受,...
  • 此文章献给我在等的那个我的所长和我关注的: 机器码 bios 芯片核心算法设计 手机pdf图纸 安全与反安全 我的属相:保密我的生肖:双鱼座我的性格:文静 诚实 追求完美的东西我喜欢的明星:郑秀文 郭富城最喜欢...
  • 今天突然不知道在哪里看自己收藏过的文章和关注的人了,于是万能的度娘再一次告诉了答案:登陆自己的csdn账号之后,点击你的csdn账户名,进入到个人中心,是不是很简单呢?赶紧get起来吧,好好学习,天天向上,...
  • 方法:进入博主主页,比如我的主页http://blog.csdn.net/faith_mo_blog 把这个网址中“blog”换为“hi”也就是:“http://hi.csdn.net/faith_mo_blog”就ok了, 然后进入空间,就能看见 关注 或 加好友 字样。...
  • 如果有人找要风险投资,关注他什么呢?1.先了解此人的简历,看他过去干过什么...此外,如果他是年轻人,还会了解他在学校里是否是学生会干部或者团干部,通常会对做过社会工作的人感兴趣。2.再看此人的团队
  • 女人的关注点与男人不一样!

    千次阅读 2018-01-31 09:13:05
     总之男人与女人构造上就是天差地别,所以在看看物方面,关注点自然也就不一样了。  上回很开心用nodejs制作了一个网站,还实验了几把vue页面,完善网站后,给老婆show一把。结果她看了网站后,第一时间...
  • 是一个善于思考的人,常常找到权威中的错误,并总是喜欢自己研究。擅长关于语言类的学习,包括编程语言和自然语言,我有自己的一套方法。在很久一段时间内,都是自己用着自己的一套方法,而没有与大家分享。现在...
  • 2020年,冯唐49岁:给20、30岁IT职场年轻人的建议

    万次阅读 多人点赞 2020-01-14 08:16:56
    点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:...可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻中年”等不那么正经文章。 本文整理了冯...
  • 科技变革丝毫没有减速,自动化就是科技的终极使命! ...他自称“科技的绝对信徒”,现在关注的有且只有一件事:人工智能。 孙正义也不避讳可能出现的问题,但他相信人类有足够的智慧应对变...
  • 毋庸置疑,Python越来越被认可为程序员新时代风口语言。 无论是刚入门程序员,还是年薪百万 BATJ 大牛都无可否认:Python应用能力是成为一名码农大神必要项。 所...
  • 是小白】感谢大家的关注

    千次阅读 2019-05-18 21:14:21
    本博客不含任何涉密信息, 所有内容 = “阅读书籍知识”+“解决难题技术”+“公开论文笔记”+“生活经验”+“传承...博客笔记属于个人习惯,赠玫瑰手有余香。 谷歌学术镜像网站:https://ac.scmor.com/ ...
  •  首先是获取OAuth认证,简历一个Oauth类里面执行认证操作,这个过程会在下一篇博文里面讲到,那么要想获取登陆用户关注用户id,微博等信息需要对下面这个json地址进行查询! ...
  • 推荐几个认为值得关注的公众号

    千次阅读 2019-08-19 12:05:00
    2020年还剩下147天,你年初制定目标实现了吗?默默问上自己两遍,相信就有开始满世界找书看了,但别饥不择食——选择好充电方式才能事倍功半。今天为大家精选了8个优质...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,643
精华内容 8,257
关键字:

我关注的人