查看原文
其他

利用pyecharts看微博粉丝地区分布

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:赵冰洁,中南财经政法大学金融学院

本文编辑:杨婉清

技术总编:王子一

Stata&Python云端课程来啦!

好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!





细雨霏霏柳眼开,云烟缭绕似仙台。  

一江春水清悠淌,十里桃花锦绣裁。  





      李子柒,一个将人生书写成诗,生活在现代世外桃源的女子,让沉睡的桃源迷梦落入现实,她所展现的“雪沫乳花浮午盏,蓼茸高笋试春盘”式的人间清欢,充满了烟火气与田园独有的浪漫。这种惬意的生活如同繁华都市里的一股清泉,流入每一位粉丝的心底。

      今天,小编将从数据角度出发,和大家一起看一下李子柒微博粉丝的地区分布。Start~





爬虫思路



  • 先从手机端用户(URL:https://m.weibo.cn/profile/2970452952) 获取微博粉丝的用户ID。(URL中“2970452952”即为李子柒的微博ID)

  • 根据获取的用户ID,通过旧版微博网址(https://weibo.cn/u/2970452952)抓取粉丝的公开信息(用户昵称、性别、地址、关注数、粉丝数)。

  • 由于抓取到的粉丝信息不规整,需要进行数据清洗。

  • 微博粉丝地区分布可视化。





微博粉丝用户ID爬取



首先,通过URL进入李子柒的微博粉丝页面:

通过检查查看粉丝抓包信息:

不同的粉丝页面所对应的URL:


比较两个URL可知,粉丝页面是通过URL中since_id这个参数的改变进行翻页的。因此,我们可以通过设置since_id(值域:1-250)来获取至多5000个粉丝的用户ID。
# 粉丝用户ID爬取## 导入相关库import reimport time import randomimport requestsfrom tqdm import tqdm_notebook ### 该库用于进度条的配置
def get_userid(url): header_list = [ "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00", "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00", "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0", "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62", "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62", ] header = { 'user-agent': random.choice(header_list) } pat = 'since_id=(.*)' with open('D:/python爬虫/李子柒微博粉丝地区分布/user_id.txt', 'w') as f: for page in tqdm_notebook(range(1, 251), desc='进度条:'): try: print(url) r = requests.get(url, headers=header) all_user = r.json()['data']['cards'][0]['card_group'] since_id = r.json()['data']['cardlistInfo']['since_id'] for user in all_user: f.write(str(user.get('user')['id'])+'\n') url = re.sub(pat, 'since_id='+str(since_id), url) time.sleep(random.randint(1, 2)) except Exception as e: print(e)
if __name__ == '__main__': start_url = "https://m.weibo.cn/api/container/getIndex?containerid=231051_-_fans_-_2970452952&since_id=21" get_userid(start_url)运行结果如下:


当进度条显示100%时,所有用户ID就已经抓取完毕啦~

接下来,我们根据上面抓取到的粉丝用户ID来获取粉丝的公开信息。首先,导入相关库。
# 根据爬取的粉丝用户ID获取粉丝的基本公开信息import requestsfrom lxml import etreeimport pandas as pdimport numpy as npimport reimport timeimport randomimport osos.chdir("D:\python爬虫\李子柒微博粉丝地区分布")其次,登录旧版微博网页,进入李子柒的微博页面,获取headers信息。

headers = { "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "cookie": "输入自己的cookie", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36"}然后,抓取粉丝公开信息。
new_url = "https://weibo.cn/u/"data = []count = 0def get_id(ID): with open(ID, 'r') as f: user_list = f.readlines() user_id = np.char.rstrip(user_list, '\n') return user_iddef gethtml(url, header): r = requests.get(url, headers = headers) if r.status_code == 200: return r.text else: print("网络连接异常")for user_id in get_id('user_id.txt'): try: url = new_url + user_id r_text = gethtml(url, headers) tree = etree.HTML(r_text.encode('utf-8')) user_name_xpath = "//tr/td[2]/div/span[1]/text()[1]" user_name = tree.xpath(user_name_xpath) Inf_xpath = "//tr/td[2]/div/span[1]/text()[2]" Inf = tree.xpath(Inf_xpath) focusnumber_xpath = "//div[4]/div/a[1]/text()" focusnumber = tree.xpath(focusnumber_xpath) fansnumber_xpath = "//div[4]/div/a[2]/text()" fansnumber = tree.xpath(fansnumber_xpath) data.append([user_name, Inf, focusnumber, fansnumber]) count += 1 print("第{}个用户信息录入完毕".format(count)) time.sleep(random.randint(1,2)) except: print("用户信息录入失败")最后,保存数据。
file = r"D:\python爬虫\李子柒微博粉丝地区分布\粉丝公开信息.xlsx"df = pd.DataFrame(data, columns = ['user_name', 'Inf', 'focusnumber', 'fansnumber'])df.to_excel(file, index = None)print("程序执行完毕")运行结果如下:

我们所抓取到的粉丝信息不规整,不便于后续绘图所用,因此,我们需要进行数据清洗,清洗后的结果如下:





粉丝信息数据可视化



在获取粉丝数据之后,我们利用Python中的pyecharts模块来看一下李子柒微博粉丝的地区分布图。
## 导入相关库并读入数据import pandas as pdimport numpy as npfrom pyecharts.charts import Mapfrom pyecharts import options as opts
df = pd.read_excel("粉丝信息.xlsx")df

地图Map
## 绘制粉丝地区分布图address=pd.DataFrame(df['Inf'].value_counts()) ### 汇总每个地区的粉丝数量city=np.char.rstrip(list(address.index)) ### 城市名称Map1 = ( Map(init_opts=opts.InitOpts(width="1200px",height="800px")) .add("", [list(z) for z in zip(city,address['Inf'])], "china", is_roam = False, is_map_symbol_show = False ) .set_global_opts( title_opts = opts.TitleOpts(title = "李子柒微博粉丝地区分布"), visualmap_opts = opts.VisualMapOpts(max_ = 1500, is_piecewise = True, pieces=[ {"max": 1500, "min": 1000, "label": ">1000", "color": "#2F7F50"}, {"max": 999, "min": 600, "label": "600-999", "color": "#FFFFE0"}, {"max": 599, "min": 200, "label": "200-599", "color": "#7FFFD4"}, {"max": 199, "min": 1, "label": "1-199", "color": "#00FFFF"}, {"max": 0, "min": 0, "label": "0", "color": "#EE82EE"},]) ))Map1.render("粉丝分布图.html")

地理坐标Geo
from pyecharts import options as optsfrom pyecharts.charts import Geofrom pyecharts.globals import ChartType
g = ( Geo(init_opts=opts.InitOpts(width="1200px",height="800px")) .add_schema( maptype = "china", itemstyle_opts = opts.ItemStyleOpts(color = "#5F9EA0", border_color = "#2F4F4F"), ) .add("", [list(z) for z in zip(city,address['Inf'])], label_opts = opts.LabelOpts(is_show = False), type_ = ChartType.EFFECT_SCATTER ) .set_global_opts( title_opts = opts.TitleOpts(title = "李子柒微博粉丝地区分布"), visualmap_opts = opts.VisualMapOpts(max_ = 1500, is_piecewise = True, pieces=[ {"max": 1500, "min": 1000, "label": ">1000", "color": "#2F7F50"}, {"max": 999, "min": 600, "label": "600-999", "color": "#FFFFE0"}, {"max": 599, "min": 200, "label": "200-599", "color": "#FF4500"}, {"max": 199, "min": 1, "label": "1-199", "color": "#6A5ACD"}, {"max": 0, "min": 0, "label": "0", "color": "FF0000"},]) ))g.render("粉丝分布图3.html")

以上就是本篇全部内容,欢迎各位小伙伴点赞评论关注呀~

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐

  零值太多怎么办?解锁Stata17新命令ziologit

  Stata17新功能之Python API

小罗肥归升级啦|解锁Stata17之新命令xtmlogit

 
速度大比拼之Stata17有多快?

初识PyStata

辞旧迎新——Stata17之Do-file编辑器优化

Stata17新亮点——解放表格输出生产力

【爬虫+可视化】链家网北京租房信息

 手把手教你如何获取股票数据和可视化

  Countvalues——数数的超级小帮手

         frame框架进阶篇

 下拉选择框如何变成“小猫咪” | selenium小技巧

  Python中的运算符知多少?

  快来get缺失值的正确打开方式

  frame框架——我到底在哪个“房间”

如何使用Pandas读取txt文件?

基于MySQL数据库实现增量式爬取

寻找春日气息|本月最受欢迎的景点都在这里!

问世间情为何物,大数据也想参悟——后考研时代,何以解忧?唯有数据!

Python与数据库交互—浅述pymysql

偷懒小妙招|selenium之玩转鼠标键盘操作--鼠标篇

大家用Stata来“找茬”

“粉墨登场”——多期双重差分法(DID)的Stata操作

Python与百度地图合璧,绘制棒呆的热力地图

【数据可视化】统计图绘制神器:Seaborn

检索Stata推文的“任意门”学会了这些,分分钟提升你的毕业体验

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存