此次爬虫要实现的是爬取某个微博用户的关注和粉丝的用户公开基本信息,包括用户昵称、id、性别、所在地和其粉丝数量,然后将爬取下来的数据保存在MongoDB数据库中,最后再生成几个图表来简单分析一下我们得到的数据。

一、具体步骤:

这里我们选取的爬取站点是https://m.weibo.cn,此站点是微博移动端的站点,我们可以直接查看某个用户的微博,比如https://m.weibo.cn/profile/5720474518。

然后查看其关注的用户,打开开发者工具,切换到XHR过滤器,一直下拉列表,就会看到有很多的Ajax请求。这些请求的类型是Get类型,返回结果是Json格式,展开之后就能看到有很多用户的信息。

这些请求有两个参数,containerid和page,通过改变page的数值,我们就能得到更多的请求了。获取其粉丝的用户信息的步骤是一样的,除了请求的链接不同之外,参数也不同,修改一下就可以了。

由于这些请求返回的结果里只有用户的名称和id等信息,并没有包含用户的性别等基本资料,所以我们点进某个人的微博,然后查看其基本资料,比如这个,打开开发者工具,可以找到下面这个请求:

由于这个人的id是6857214856,因此我们可以发现当我们得到一个人的id的时候,就可以构造获取基本资料的链接和参数了,相关代码如下(uid就是用户的id):

 1 uid_str = "230283" + str(uid)
 2 url = "https://m.weibo.cn/api/container/getIndex?containerid={}_-_INFO&title=%E5%9F%BA%E6%9C%AC%E8%B5%84%E6%96%99&luicode=10000011&lfid={}&featurecode=10000326".format(uid_str, uid_str)
 3 data = {
 4     "containerid": "{}_-_INFO".format(uid_str),
 5     "title": "基本资料",
 6     "luicode": 10000011,
 7     "lfid": int(uid_str),
 8     "featurecode": 100003269 }

然后这个返回的结果也是Json格式,提取起来就很方便,因为很多人的基本资料都不怎么全,所以我提取了用户昵称、性别、所在地和其粉丝数量。而且因为一些账号并非个人账号,就没有性别信息,对于这些账号,我选择将其性别设置为男性。不过在爬取的时候,我发现一个问题,就是当页数超过250的时候,返回的结果就已经没有内容了,也就是说这个方法最多只能爬250页。对于爬取下来的用户信息,全都保存在MongoDB数据库中,然后在爬取结束之后,读取这些信息并绘制了几个图表,分别绘制了男女比例扇形图、用户所在地分布图和用户的粉丝数量柱状图。

二、主要代码:

由于第一页返回的结果和其他页返回的结果格式是不同的,所以要分别进行解析,而且因为部分结果的json格式不同,所以可能报错,因此采用了try...except...把出错原因打印出来。

爬取第一页并解析的代码如下:

 1 def get_and_parse1(url):
 2     res = requests.get(url)
 3     cards = res.json()['data']['cards']
 4     info_list = []
 5     try:
 6         for i in cards:
 7             if "title" not in i:
 8                 for j in i['card_group'][1]['users']:
 9                     user_name = j['screen_name']  # 用户名
10                     user_id = j['id']  # 用户id
11                     fans_count = j['followers_count']  # 粉丝数量
12                     sex, add = get_user_info(user_id)
13                     info = {
14                         "用户名": user_name,
15                         "性别": sex,
16                         "所在地": add,
17                         "粉丝数": fans_count,
18                     }
19                     info_list.append(info)
20             else:
21                 for j in i['card_group']:
22                     user_name = j['user']['screen_name']  # 用户名
23                     user_id = j['user']['id']  # 用户id
24                     fans_count = j['user']['followers_count']  # 粉丝数量
25                     sex, add = get_user_info(user_id)
26                     info = {
27                         "用户名": user_name,
28                         "性别": sex,
29                         "所在地": add,
30                         "粉丝数": fans_count,
31                     }
32                     info_list.append(info)
33         if "followers" in url:
34             print("第1页关注信息爬取完毕...")
35         else:
36             print("第1页粉丝信息爬取完毕...")
37         save_info(info_list)
38     except Exception as e:
39         print(e)

爬取其他页并解析的代码如下:

 1 def get_and_parse2(url, data):
 2     res = requests.get(url, headers=get_random_ua(), data=data)
 3     sleep(3)
 4     info_list = []
 5     try:
 6         if 'cards' in res.json()['data']:
 7             card_group = res.json()['data']['cards'][0]['card_group']
 8         else:
 9             card_group = res.json()['data']['cardlistInfo']['cards'][0]['card_group']
10         for card in card_group:
11             user_name = card['user']['screen_name']  # 用户名
12             user_id = card['user']['id']  # 用户id
13             fans_count = card['user']['followers_count']  # 粉丝数量
14             sex, add = get_user_info(user_id)
15             info = {
16                 "用户名": user_name,
17                 "性别": sex,
18                 "所在地": add,
19                 "粉丝数": fans_count,
20             }
21             info_list.append(info)
22         if "page" in data:
23             print("第{}页关注信息爬取完毕...".format(data['page']))
24         else:
25             print("第{}页粉丝信息爬取完毕...".format(data['since_id']))
26         save_info(info_list)
27     except Exception as e:
28         print(e)

三、运行结果:

在运行的时候可能会出现各种各样的错误,有的时候返回结果为空,有的时候解析出错,不过还是能成功爬取大部分数据的,这里就放一下最后生成的三张图片吧。

完整代码已上传到GitHub!

转载于:https://www.cnblogs.com/TM0831/p/9974718.html

【Python3爬虫】微博用户爬虫相关推荐

  1. python写网络爬虫微博用户发布的视频

    微博用户发布在奉天承芸超话的视频: def run(self):         s = requests.Session()         # 暂时先抓self.TotalPage=200页   ...

  2. python 爬虫 微博 github_GitHub - peanut-shi/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...

    功能 爬取新浪微博信息,并写入csv/txt文件,文件名为目标用户id加".csv"和".txt"的形式,同时还会下载该微博原始图片和微博视频(可选). 本程序 ...

  3. python 爬虫 微博 github_GitHub - bubblesran/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...

    功能 爬取新浪微博信息,并写入csv/txt文件,文件名为目标用户id加".csv"和".txt"的形式,同时还会下载该微博原始图片和微博视频(可选). 本程序 ...

  4. python 爬虫 微博 github_GitHub - Joria0414/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...

    Weibo Spider 本程序可以连续爬取一个或多个新浪微博用户(如胡歌.迪丽热巴.郭碧婷)的数据,并将结果信息写入文件或数据库.写入信息几乎包括用户微博的所有数据,包括用户信息和微博信息两大类.因 ...

  5. 美国网红python微博_GitHub - dataabc/weiboPR: 用python判断微博用户的影响力

    功能 判断微博用户的影响力 输入 用户id:例如新浪微博昵称为"Dear-迪丽热巴"的id为"1669879400".可以输入一个用户的user_id,也可以输 ...

  6. python爬虫微博图片,pyhton爬虫爬取微博某个用户所有微博配图

    前几天写了个java爬虫爬花瓣网,但是事后总感觉不够舒服,终于在今天下午写了个python爬虫(爬微博图片滴),写完之后就感觉舒服了,果然爬虫就应该用python来写,哈哈(这里开个玩笑,非引战言论) ...

  7. 【微博简易爬虫】Python获取指定微博用户的发布文本

    一.背景&目的 心理学专业在读,又一心做一些和数据科学相关的项目,于是选择了基于微博的焦虑和抑郁识别作为毕设项目,开始从数据获取到处理建模到调参的全过程.院里和指导老师都非常在乎数据隐私问题, ...

  8. 基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息

    基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息 注意:仅供学习交流,任何非法使用与作者无关! 目录 基于golang的爬虫demo,爬取微博用户的粉丝和关注者信息 一.背景与取材 二. ...

  9. python微博爬虫实战_爬虫实战(一):爬取微博用户信息

    前言 最近做课设,是一个有关个人隐私安全的课题,在网上找了很多论文,最后上海交通大学的一篇硕士论文<面向社会工程学的SNS分析和挖掘>[1] 给了我很多灵感,因为是对个人隐私安全进行评估, ...

最新文章

  1. ubuntu14.04 升级gcc的方法
  2. Java与C语言比较(Java参考书中摘录)
  3. java 正则表达式 替换括号,Java正则表达式:如何替换方括号内的所有字符?
  4. 快速傅里叶变换(FFT)——按时间抽取DIT的基
  5. 【Openstack】实录手动部署Openstack Rocky 双节点(1)- 基础服务
  6. C#之double内存
  7. 如何搭建运营级的网络直播平台
  8. 2008年希赛软考学院招生
  9. 顺网服务器ip修改工具,一键更换IP工具,修改IP地址 — 活动撸羊毛必备
  10. PS基础操作及常用快捷键
  11. 透视效果的十字路口,不再“亲人两行泪”
  12. 自动化测试框架Selenium的使用——安装Selenium
  13. 华为数据存储用户精英论坛,信心与合作的故事
  14. 小姜杂谈:屏幕分辨率一次讲清楚
  15. 一阶电路中的时间常数_电路时间常数怎么求
  16. C语言自学笔记,第一天
  17. sparksql:dataframe数据写入到Hbase中
  18. 使用rufus制作Windows Server 2012 R2 U盘_wentfar·tsao
  19. NBUT1225 NEW RDSP MODE I(快速幂,规律)
  20. matlab简易实现图像压缩

热门文章

  1. ironpython不想要可以卸载吗_IronPython的致命弱点
  2. 前端系统化学习【JS篇】:(一)浏览器简述
  3. Python 变量 字符串 运算
  4. 计算机应用基础word教程,计算机应用基础-文字处理word教程PPT课件.ppt
  5. 新rust怎么拆除围墙_“问题围挡”拆除 街道变漂亮了
  6. sql between包括两端吗_技术分享:T-SQL 之语法艺术(一)
  7. ppt复制切片器_【PPT】高端人物活动介绍页PPT创意设计制作
  8. 南开大学计算机考研2019分数线,2019年南开大学考研复试分数线已公布
  9. np.array 的shape (2,)与(2,1)的分别是什么意思
  10. PyCharm使用期间出现报错集合 持续更新ing