此次爬虫要实现的是爬取某个微博用户的关注和粉丝的用户公开基本信息,包括用户昵称、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. TabLayout 遇到那些坑 tab标签不显示问题
  2. IBM-JAVA面试题
  3. cannot find Toolkit in /usr/local/cuda-8.0
  4. 错误信息Make an entry in Field Text Area
  5. BZOJ.4516.[SDOI2016]生成魔咒(后缀自动机 map)
  6. nginx的学习(配置文件,以及部署的疑惑)
  7. PHP中类重写方法,php中重写方法有什么规则
  8. Spark 基础 —— Map 容器
  9. 转载:找到免费中文电子书的几个网站
  10. 麻瓜python视频教程_2019年最新麻瓜编程,Python商业爬虫学徒计划全套视频教程下载...
  11. 极乐净土—官方中文版 单曲循环洗脑三天了φ(ω*)
  12. MIPI接口和DVP接口的区别及优点
  13. 2014清华计算机系直博名单,2014年清华大学博士研究生拟录取名单公示
  14. 如何下载720云上的全景图片?
  15. 【收藏】通信知识分类整理
  16. 3月12日公开短线黑马牛股请点击验证
  17. 自动组策略(GPO)备份工具
  18. 通过初始时间和流逝的分钟数计算终止时间
  19. 【vs】vs编译爆出大量莫名其妙错误的解决方法
  20. GEDI学习笔记1:数据产品简介

热门文章

  1. mysql命令导出数据不完整_使用MySQL MySqldump命令导出数据时的注意事项
  2. 是自学前端还是培训学前端?
  3. 总有人黑 JavaScript?那是不知道它有多好用吧!
  4. python strip_Python strip()方法
  5. linux 驱动器发送信号,Linux设备驱动并发控制详解(自旋锁,信号量)
  6. 计算机网络自上而下影印版_《计算机网络(影印版)》 影印 【正版电子纸书阅读_PDF下载】- 书问...
  7. 三年级下册计算机课程工作计划,三年级下册信息技术教学工作计划
  8. 计算机应用基础win7.pdf,计算机应用基础WIn7操作题(12页)-原创力文档
  9. STM8学习笔记---按键KEY
  10. DeepLearning | Tensorflow编程基础:Session、Constant、Variable、Tensor、Placeholder、OP