文章目录

  • Sina_Topic_Spider:
  • 技术难点总结:
    • 1.爬取微博超话用户信息
      • 1. 查看网页数据
      • 2. 模拟请求数据,提取微博内容。
      • 3. 遍寻找分页参数技巧
      • 4. 爬取用户信息
      • 5. 保存文件
    • 2.数据可视化

Sina_Topic_Spider:

  • 内容: 爬取某位明星的微博超话的上万条用户信息,对爬取的结果进行EDA分析与数据可视化,如分析用户年龄,性别分布、粉丝团的地区分布,词云打榜微博内容。
  • 详细代码在Github:https://github.com/why19970628/Python_Crawler/tree/master/Sina_topic_spider
  • 适合人群:Python爬虫学习者、Python数据分析学习者、Pandas使用者、数据可视化学习者
  • 难度:★★★☆☆

技术难点总结:

1.爬取微博超话用户信息

1. 查看网页数据

手动进入微博超话页面,改为手机版,过滤请求,只查看异步请求,查看返回数据的格式。

地址:手机版微博超话

2. 模拟请求数据,提取微博内容。

数据返回的是Josn格式,可以加载放在txt文件中进行筛选数据(遍历)

3. 遍寻找分页参数技巧

查找分页参数技巧:比较第一次和第二次请求url,看看有何不同,找出不同的参数!
比较两次请求的URL发现,第二次比第一次请求链接中多了一个:since_id参数,而这个since_id参数就是每条微博的id!

微博分页机制:根据时间分页,每一条微博都有一个since_id,时间越大的since_id越大所以在请求时将since_id传入,则会加载对应话题下比此since_id小的微博,然后又重新获取最小since_id将最小since_id传入,依次请求,这样便实现分页。

了解微博分页机制之后,我们就可以制定我们的分页策略

我们将上一次请求返回的微博中最小的since_id作为下次请求的参数,这样就等于根据时间倒序分页抓取数据!

def spider_topic:# 每次请求中最小的since_id,下次请求使用,新浪分页机制min_since_id = ''global min_since_id  #全局变量topic_url = 'https://m.weibo.cn/api/container/getIndexjumpfrom=weibocom&containerid=1008087a8941058aaf4df5147042ce104568da_-_feed'if min_since_id:topic_url = topic_url + '&since_id=' + min_since_id   #分页r_since_id = mblog['id'] #遍历获取每页微博idif min_since_id:min_since_id = r_since_id if min_since_id > r_since_id else min_since_idelse:min_since_id = r_since_id# 5、爬取用户信息不能太频繁,所以设置一个时间间隔time.sleep(random.randint(3, 6))# 批量爬取for i in range(100):print('第%d页' % (i + 1))spider_topic()

4. 爬取用户信息

1.用户基本信息网址为 https://weibo.cn/用户id/info ,我们只需拿到用户id就可以得到用户信息。

2.访问别人用户信息需要模拟微博登录

需要使用手机版,并且输错账号,获取Form Data传递参数

登录我们使用的是requests.Session()对象,这个对象会自动保存cookies,下次请求自动带上cookies!

3. 爬取用户信息
爬取用户信息不能频繁,响应代码(418),
有些用户没有生日自动添加为空值,
爬取信息的时候一定要加 try- except 防止爬取信息提取错误,代码挂掉

def get_basic_info_list(basic_info_html) -> list:"""将html解析提取需要的字段:param basic_info_html::return: ['用户名', '性别', '地区', '生日']"""basic_infos = []basic_info_kvs = basic_info_html[0].split('<br/>')print(basic_info_kvs)for basic_info_kv in basic_info_kvs:if basic_info_kv.startswith('昵称'):basic_infos.append(basic_info_kv.split(':')[1])elif basic_info_kv.startswith('性别'):basic_infos.append(basic_info_kv.split(':')[1])elif basic_info_kv.startswith('地区'):area = basic_info_kv.split(':')[1]# 如果地区是其他的话,就添加空if '其他' in area or '海外' in area:basic_infos.append('')continue# 浙江 杭州,这里只要省if ' ' in area:area = area.split(' ')[0]basic_infos.append(area)elif basic_info_kv.startswith('生日'):try:birthday = basic_info_kv.split(':')[1]# 19xx 年和20xx 带年份的才有效,只有月日或者星座的数据无效if birthday.startswith('19') or birthday.startswith('20'):# 只要前三位,如198、199、200分别表示80后、90后和00后,方便后面数据分析basic_infos.append(birthday[:3])else:basic_infos.append('')except:if len(basic_infos) < 4:basic_infos.append('')else:pass# 有些用户的生日是没有的,所以直接添加一个空字符if len(basic_infos) < 4:basic_infos.append('')return basic_infos

5. 保存文件

for card in card_group:# 创建保存数据的列表,最后将它写入csv文件sina_columns = []mblog = card['mblog']# 2.2、解析用户信息user = mblog['user']# 爬取用户信息,微博有反扒机制,频率太快就请求就返回418try:basic_infos = spider_user_info(user['id'])#print(basic_infos)except:print('用户信息爬取失败!id=%s' % user['id'])continue# 把用户信息放入列表sina_columns.append(user['id'])sina_columns.extend(basic_infos).....def save_columns_to_csv(columns, encoding='utf-8'):"""将数据保存到csv中数据格式为:'用户id', '用户名', '性别', '地区', '生日', '微博id', '微博内容':param columns: ['用户id', '用户名', '性别', '地区', '生日', '微博id', '微博内容']:param encoding::return:"""with open(CSV_FILE_PATH, 'a', encoding=encoding,newline="") as csvfile:csv_write = csv.writer(csvfile)csv_write.writerow(columns)

2.数据可视化





代码:

import csv
import collectionsimport jieba.analyse
from pyecharts import options as opts
from pyecharts.globals import SymbolType
from pyecharts.charts import Pie, Bar, Map, WordCloud# 新浪话题数据保存文件
CSV_FILE_PATH = 'sina_topic.csv'
# 需要清洗的词
STOP_WORDS_FILE_PATH = 'stop_words.txt'def read_csv_to_dict(index) -> dict:"""读取csv数据数据格式为:'用户id', '用户名', '性别', '地区', '生日', '微博id', '微博内容':param index: 读取某一列 从0开始:return: dic属性为key,次数为value"""with open(CSV_FILE_PATH, 'r', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)column = [columns[index] for columns in reader]dic = collections.Counter(column)# 删除空字符串if '' in dic:dic.pop('')print(dic)return dicdef analysis_gender():"""分析性别:return:"""# 读取性别列dic = read_csv_to_dict(2)#Counter({'女': 728, '男': 263})# 生成二维数组gender_count_list = [list(z) for z in zip(dic.keys(), dic.values())]# z [('男', 263), ('女', 728)]print(gender_count_list)#[['男', 263], ['女', 728]]pie = (Pie().add("", gender_count_list).set_colors(["red", "blue"]).set_global_opts(title_opts=opts.TitleOpts(title="性别分析")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))pie.render('gender.html')def analysis_age():"""分析年龄:return:"""dic = read_csv_to_dict(4)# 生成柱状图sorted_dic = {}for key in sorted(dic):sorted_dic[key] = dic[key]print(sorted_dic)bar = (Bar().add_xaxis(list(sorted_dic.keys())).add_yaxis("周杰伦打榜粉丝年龄分析", list(sorted_dic.values())).set_global_opts(yaxis_opts=opts.AxisOpts(name="数量"),xaxis_opts=opts.AxisOpts(name="年龄"),))bar.render('age_bar.html')# 生成饼图age_count_list = [list(z) for z in zip(dic.keys(), dic.values())]pie = (Pie().add("", age_count_list).set_global_opts(title_opts=opts.TitleOpts(title="周杰伦打榜粉丝年龄分析")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))pie.render('age-pie.html')def analysis_area():"""分析地区:return:"""dic = read_csv_to_dict(3)area_count_list = [list(z) for z in zip(dic.keys(), dic.values())]print(area_count_list)map = (Map().add("周杰伦打榜粉丝地区分析", area_count_list, "china").set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=200),))map.render('area.html')def analysis_sina_content():"""分析微博内容:return:"""# 读取微博内容列dic = read_csv_to_dict(6)# Counter({'我太难了': 3, '超话粉丝大咖': 2,# 数据清洗,去掉无效词jieba.analyse.set_stop_words(STOP_WORDS_FILE_PATH)# 词数统计words_count_list = jieba.analyse.textrank(' '.join(dic.keys()), topK=50, withWeight=True)print(words_count_list)#('杭州', 1.0), ('演唱会', 0.9047694519491188), ('抢到', 0.4155709853243528),# 生成词云word_cloud = (WordCloud().add("", words_count_list, word_size_range=[20, 100], shape=SymbolType.DIAMOND).set_global_opts(title_opts=opts.TitleOpts(title="周杰伦打榜微博内容分析")))word_cloud.render('word_cloud.html')if __name__ == '__main__':#analysis_gender()#analysis_age()analysis_area()#analysis_sina_content()

爬取新浪微博某超话用户信息,进行EDA分析相关推荐

  1. 爬取b站视频评论用户信息!这些评论的才是大神!

    最近马保国老师在b站挺火的,关于他的视频播放量很高,b站视频评论区都是人才说话好听,写个爬虫爬取一下b站评论区用户信息和评论内容. 一.准备工作 1.工具 (1)Chrome 谷歌浏览器 安装地址:h ...

  2. python3网络爬虫--爬取b站视频评论用户信息(附源码)

    文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析网页加载方式 2.分析数据接口 3.获取oid 四.撰写爬虫 五.存储数据 六.总结 你爱我,我爱你,蜜雪 ...

  3. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

  4. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) —— 编写一个基本的 Spider 爬取微博用户信息

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(一) -- 新建爬虫项目 在上一篇我们新建了一个 sina_scrapy 的项目,这一节我们开始正式编写爬虫的代码. 选择目标 ...

  5. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) -- 编写一个基本的 Spider 爬取微博用户信息 在上一篇博客中,我们已经新建了一个爬虫应用,并简单实现了爬取一位微 ...

  6. python爬取新浪微博内容_python新浪微博爬虫,爬取微博和用户信息 (含源码及示例)...

    [实例简介] 这是新浪微博爬虫,采用python+selenium实现. 免费资源,希望对你有所帮助,虽然是傻瓜式爬虫,但是至少能运行.同时rar中包括源码及爬取的示例. 参考我的文章: http:/ ...

  7. 爬取新浪微博用户的个人信息和微博内容

    #-*- coding:utf-8 -*-""" 爬取新浪微博的用户信息 功能:用户ID 用户名 粉丝数 关注数 微博数 微博内容 网址:www.weibo.cn 数据量 ...

  8. Scrapy爬取新浪微博用户粉丝数据

    一般来说pc端的信息是最为全面的,但是防范措施也是最严格的.所以不能走weibo.com这个域名下进行爬取,新浪微博在pc端的反扒措施较为全面.而手机端的数据则相对好爬取,而且数据都是Json格式,解 ...

  9. python爬去新浪微博_Python 超简单爬取新浪微博数据 (高级版)

    新浪微博的数据可是非常有价值的,你可以拿来数据分析.拿来做网站.甚至是*.不过很多人由于技术限制,想要使用的时候只能使用复制粘贴这样的笨方法.没关系,现在就教大家如何批量爬取微博的数据,大大加快数据迁 ...

最新文章

  1. 200行代码解读TDEngine背后的定时器
  2. 深度学习在CTR预估的应用
  3. blob的真实地址怎么获得_使用Python抓取m3u8加密视频 续:获得index.m3u8 地址
  4. php 其他页面获取session_PHP五十个提升执行效率的小技巧,和常见问题
  5. 史上首次无人车队集体婚礼,直男新郎给新娘の礼物:工业设计书
  6. 从零开始用Kotlin结合Jetpack写一个五子棋
  7. 计算机一级单元格填充,电脑Excel表格怎么对不连续的单元格进行批量填充
  8. VSCode取消注释斜体
  9. Pytorch深度学习笔记(02)--损失函数、交叉熵、过拟合与欠拟合
  10. 语音识别论文:Comparing the Benefit of Synthetic Training Data for Various Automatic Speech Recognition Arc
  11. 泌阳县鸿蒙机器人编程,鸿蒙教育机器人编程课程开始招生了!!!
  12. 选择 conforming 还是 non-conforming ?
  13. 成功人士们最近有点烦
  14. 常规创业公司股权分配参考
  15. 元宇宙发展研究报告2.0版本(清华大学)
  16. 使用百度Clouda框架创建RSS阅读器应用
  17. 吉大20春学期C语言程序设计作业二,c语言程序设计 教学课件 ppt 作者 吉大17秋学期《C语言程序设计》作业一...
  18. php导出成word试卷,依据word模板批量生成试卷
  19. RabbitMQ学习笔记(高级篇)
  20. 手机看图app android小众,日常看图 + 收集灵感,这6个APP太好用!

热门文章

  1. Linux下图像处理软件汇总
  2. linux安装gcc编译器
  3. css罕见的冷门样式
  4. 金蝶云的企业数字化转型之道:从ERP到EBC,从竞争到共生
  5. 2022.5.29 蓝桥杯第十三届中级组全国总决赛真题
  6. 如何采用陷阱方式钩住API
  7. kotlin “${ }”是什么意思?
  8. 邀请码 java_邀请码生成器Java代码详解
  9. 使用晨曦记账本,记录流水账及记录借还款
  10. 支付宝开发 ——第三方支付