爬取新浪微博某超话用户信息,进行EDA分析
文章目录
- 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分析相关推荐
- 爬取b站视频评论用户信息!这些评论的才是大神!
最近马保国老师在b站挺火的,关于他的视频播放量很高,b站视频评论区都是人才说话好听,写个爬虫爬取一下b站评论区用户信息和评论内容. 一.准备工作 1.工具 (1)Chrome 谷歌浏览器 安装地址:h ...
- python3网络爬虫--爬取b站视频评论用户信息(附源码)
文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析网页加载方式 2.分析数据接口 3.获取oid 四.撰写爬虫 五.存储数据 六.总结 你爱我,我爱你,蜜雪 ...
- [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )
上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...
- [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) —— 编写一个基本的 Spider 爬取微博用户信息
上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(一) -- 新建爬虫项目 在上一篇我们新建了一个 sina_scrapy 的项目,这一节我们开始正式编写爬虫的代码. 选择目标 ...
- [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据
上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) -- 编写一个基本的 Spider 爬取微博用户信息 在上一篇博客中,我们已经新建了一个爬虫应用,并简单实现了爬取一位微 ...
- python爬取新浪微博内容_python新浪微博爬虫,爬取微博和用户信息 (含源码及示例)...
[实例简介] 这是新浪微博爬虫,采用python+selenium实现. 免费资源,希望对你有所帮助,虽然是傻瓜式爬虫,但是至少能运行.同时rar中包括源码及爬取的示例. 参考我的文章: http:/ ...
- 爬取新浪微博用户的个人信息和微博内容
#-*- coding:utf-8 -*-""" 爬取新浪微博的用户信息 功能:用户ID 用户名 粉丝数 关注数 微博数 微博内容 网址:www.weibo.cn 数据量 ...
- Scrapy爬取新浪微博用户粉丝数据
一般来说pc端的信息是最为全面的,但是防范措施也是最严格的.所以不能走weibo.com这个域名下进行爬取,新浪微博在pc端的反扒措施较为全面.而手机端的数据则相对好爬取,而且数据都是Json格式,解 ...
- python爬去新浪微博_Python 超简单爬取新浪微博数据 (高级版)
新浪微博的数据可是非常有价值的,你可以拿来数据分析.拿来做网站.甚至是*.不过很多人由于技术限制,想要使用的时候只能使用复制粘贴这样的笨方法.没关系,现在就教大家如何批量爬取微博的数据,大大加快数据迁 ...
最新文章
- 200行代码解读TDEngine背后的定时器
- 深度学习在CTR预估的应用
- blob的真实地址怎么获得_使用Python抓取m3u8加密视频 续:获得index.m3u8 地址
- php 其他页面获取session_PHP五十个提升执行效率的小技巧,和常见问题
- 史上首次无人车队集体婚礼,直男新郎给新娘の礼物:工业设计书
- 从零开始用Kotlin结合Jetpack写一个五子棋
- 计算机一级单元格填充,电脑Excel表格怎么对不连续的单元格进行批量填充
- VSCode取消注释斜体
- Pytorch深度学习笔记(02)--损失函数、交叉熵、过拟合与欠拟合
- 语音识别论文:Comparing the Benefit of Synthetic Training Data for Various Automatic Speech Recognition Arc
- 泌阳县鸿蒙机器人编程,鸿蒙教育机器人编程课程开始招生了!!!
- 选择 conforming 还是 non-conforming ?
- 成功人士们最近有点烦
- 常规创业公司股权分配参考
- 元宇宙发展研究报告2.0版本(清华大学)
- 使用百度Clouda框架创建RSS阅读器应用
- 吉大20春学期C语言程序设计作业二,c语言程序设计 教学课件 ppt 作者 吉大17秋学期《C语言程序设计》作业一...
- php导出成word试卷,依据word模板批量生成试卷
- RabbitMQ学习笔记(高级篇)
- 手机看图app android小众,日常看图 + 收集灵感,这6个APP太好用!