前段时间,因为cxk粉丝质疑周杰伦微博没有数据(周杰伦没有开微博),所以“周杰伦上榜”的话题迅速登上了微博热搜榜。于是,无数隐居江湖多年、受不了的老周杰伦粉丝被迫开张营业,于是一场中老年周杰伦粉丝VS蔡徐坤铁军的微博排名战打响了,听了这么多年的周杰伦粉丝拉下老脸和00后微博粉圈年轻人从头学起资料一、需求背景爱坤们都说周杰伦的粉丝是夕阳红高级组。今天我们就用他们说的数据,用实力打他们的脸,让爱坤们看看周杰伦的粉丝是不是中老年粉丝!2.功能说明用爬虫爬取#周杰伦超话#下的微博,然后爬取他们的个人主页信息,获取年龄、地区、性别等信息,然后用数据分析,然后可视化!注:本文提及的微博个人主页信息均为微博公开信息,不包含任何隐私信息。同时,全文中不会出现任何人的个人信息。本资料仅供学习分析使用,任何人不得使用本教程。用于商业用途,违者后果自负!3.技术方案下面大致分解下#周杰伦超话#爬取微博的技术步骤和技术根据每条微博爬取用户的基本信息并保存到csv文件中使用数据分析用户的年龄和性别分布分析粉丝群体的区域分布使用词云分析打出排名微博内容爬取数据我们可以使用requests库保存csv文件我们可以使用内置库csv,以及可视化数据分析这次我会介绍一个超级好用的库pyecharts,选好技术之后,我们就可以开始实现技术了!四、抓取超话微博1、找到超话加载数据的网址。我们在谷歌浏览器(chrome)中找到#周杰伦超话#页面,然后调出调试窗口,切换到手机模式,然后过滤请求只查看异步请求,查看返回的数据格式,找到内容微博的!微博请求链接:https://m.weibo.cn/api/contai...2.代码模拟请求数据我们拿到链接就可以模拟请求了。这里我们还是使用熟悉的requests库。简单几句就能搞定微博!3.提取微博内容我们可以看到返回的数据是json格式的,我们可以通过层层查找找到微博内容和用户id!了解了微博返回的数据结构后,我们就可以提取出微博内容和id了!4、批量抓取微博我们提取一条微博后,就可以批量抓取微博了。怎么批?当然是要分页了?那么如何分页呢,这里朱哥教大家找分页参数的技巧:找分页参数技巧:比较第一个和第二个请求url,看不同,找出不同的参数!给大家推荐一个文字对比工具:BeyondCompare对比两次请求的url,发现第二次请求比第一次请求多了一个链接:since_id参数,而这个since_id参数就是每条微博的id!微博分页机制:根据时间分页,每条微博都有一个since_id,时间越长since_id越大,所以请求时传入since_id,会加载对应topic下小于since_id的微博,然后重新获取最小的since_id,传入最小的since_id,依次请求,这样就可以实现分页了。了解了微博分页机制后,我们就可以制定我们的分页策略了:我们将使用返回的微博中最小的since_id通过上一个请求作为下一个请求的参数,这相当于按时间倒序爬取数据!然后写一个for循环来调用上面的方法。#批量爬取foriinrange(1000):print('%dpage'%(i+1))spider_topic()四、爬取用户信息批量爬取获取到微博后,我们就可以开始爬取用户信息了!首先我们要明白用户基本信息页面的链接是:https://weibo.cn/userid/info,我们拿一个喜欢唱歌跳舞rap篮球的同学的主页作为例子!所以我们只要拿到用户的id,就可以拿到他的公开基本信息了!1.获取用户id查看我们之前分析的微博数据格式,发现有我们需要的用户id!所以我们在抽取微博内容的时候,可以顺便抽取用户id!2.模拟登录我们获取到用户id后,只需要请求urlhttps://weibo.cn/userid/info就可以获取到公开信息,但是需要登录才能查看其他用户的主页,所以我们先用代码模拟登录!之前我们爬豆瓣的时候,已经教过大家如何模拟登录了,这里直接上代码!登录我们使用什么是requests.Session()对象,这个对象会自动保存cookies,下次请求会自动带上cookies!3、爬取用户公开信息获取用户id并登录后,就可以开始爬取用户公开信息了!我们只需要在这里公开信息:用户名、性别、地区、生日等数据!所以我们需要提取这些数据!爬取用户信息不能太频繁,否则会请求失败(响应状态码=418),但是你的ip不会被封。其实很多大公司都不好封ip,太容易误伤了,说不定一个是A区就更大了!5.保存csv文件现在我们已经获取了微博信息和用户信息,我们就把这些数据保存起来,以备后面的数据分析之用!我们之前一直保存为txt格式,因为之前只有一条数据,这次是多条数据(微博内容、用户名、地区、年龄、性别等),所以选择CSV(逗号分隔值)逗号分隔值)格式文件!我们生成一个列表,然后把数据整理好,然后写入csv文件!查看生成的csv文件,注意csv如果用wps或者excel打开,可能会出现乱码,因为我们写的文件是utf-8编码的,而wps或者excel只能打开gbk编码的文件,可以用一个一般的文本编辑器是的,pycharm也可以!6.数据分析数据保存后,我们就可以进行数据分析了。首先,我们要知道我们需要分析哪些数据?我们可以将性别数据生成一个饼图,将年龄数据做一个直方图,简单直观,方便对比,看看是不是夕阳红老年组让该地区成为热点中国地图,看哪个地区的粉丝最活跃,最后把微博内容做成词云图,直观了解大家在说什么1.阅读csv文件栏目??,因为我们保存的数据格式是:'用户id','用户名','性别','地区','生日','微博id','微博内容',现在数据分析需要获取指定的列,比如:性别列,所以我们需要封装一个读取指定列的方法!这里猪哥还使用了Counter类来统计词频,方便后面的数据分析。他返回的格式是:{'female':1062,'male':637}2.在我们分析可视化库pyecharts之前,有一件很重要的事情,唯一重要的就是选择合适的可视化库!大家都知道有很多Python可视化库。之前我们一直在使用matplotlib库来制作词云。Matplotlib做一些简单的画图很方便。但是今天需要做一张全国分布图,所以经过朱兄的比较筛选,选择了国人开发的pyecharts库。选择这个库的理由是:开源免费,文档详尽,图文丰富,代码简单介绍。就一个字:爽!官网:https://pyecharts.org/#/源码:https://github.com/pyecharts/...安装:pipinstallpyechartspo他们官方文档的一张图片这里有一个很详细的例子,直接复制过来直接可以运行获取图片!3.性别分析选择好可视化库后,我们就开始使用吧!先说说这里为什么会生成html?因为是动态地图,可以点击选择显示,非常人性化!执行后会生成一个gender.html文件,在浏览器中打开即可!从效果图中可以看出,上榜的粉丝中女性多于男性,女性所占比例约为62%!4.分析年龄是大家比较关心的事情。真的是夕阳红粉丝会吗?在上图中,我们发现周杰伦上榜的主力军是:90后!5、区域分析我们来看看全国各省的粉丝分布情况吧!在上图中,我们可以看到排名最多的三个省(直辖市)分别是:广州、北京、上海!六、排行榜内容分析一起来看看打榜的粉丝们都在聊什么吧!上图分析中出现了一些有趣的词:business,seniors,milktea!好像上榜的粉丝都以为自己是老人,哈哈哈!7.总结从结果来看,周杰伦的粉丝主力还是80后和90后。毕竟他年纪小,女生比男生多。上榜粉丝最多的地区是广东!从技术上分析,今天的例子有很多新东西,了解新浪微博的分页机制,爬取用户公开信息,使用csv库保存文件,使用pyecharts进行数据可视化!当然,中间遇到的问题也很多,自己试了才知道。猪哥已经把源码放在了github(https://github.com/pig6/sina_...或点击阅读原文),有兴趣的同学记得转发收藏,有空可以试试看!
