前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

最近一直在关注百度明星吧,发现很多有趣的帖子,于是我就想用python把这些帖子都爬下来,并对内容进行分析。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

本文的知识点:

  • 介绍了mysql数据库内容插入及提取的简单应用;
  • 介绍了如何从mysql数据库提取文本并进行分析;
  • 介绍了数据分析的切入点及思路。

对于初学者想更轻松的学好Python开发技术,Python爬虫,Python大数据分析,人工智能等技术,这里给大家分享一套系统教学资源,加一下我建的Python技术的学习裙;七八四七五八二一四,一起学习。有相关开发工具,学习教程,每天还有专业的老司机在线直播分享知识与技术答疑解惑!

下面给大家详细介绍一下实现过程:

一、网站分析

贴吧的翻页通过url的变化来实现,主要是pn参数:

https://tieba.baidu.com/f?kw=明星&ie=utf-8&pn=页数*50

帖子的内容、发帖者及跟帖数量都可以在网页中找到:

所以,我们只需要用requests模拟请求获得,再用bs4解析就可以获得想要的内容了

二、python编程实现

1.爬取数据

用了静态网页爬虫的老套路,根据网页源码的特点,用find_all函数提取了帖子、发帖人及跟帖数量等信息,并将3类信息放入列表中,最终生成1个二维列表result,主要为了方便存入数据库,代码如下:

for t in range(250): print('第{0}页'.format(t+1))
url='https://tieba.baidu.com/f?kw=明星&ie=utf-8&pn={0}'.format(t*50)
header = { 'User-Agent': 'Mozilla/5.0(Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0' }
response = requests.get(url, header)
soup = BeautifulSoup(response.text, 'html.parser')
items_content = soup.find_all('a', class_='j_th_tit') #内容
items_user = soup.find_all('span', class_='tb_icon_author') #昵称
items_comment = soup.find_all(class_='threadlist_rep_num center_text') #跟帖数量
for i, j, k in zip(items_content, items_user, items_comment):
result.append([i.get('title'), j.get('title')[5:], k.text])
time.sleep(1)

2.存入数据库

先创建1个新表,命名为‘STAR’,然后再创建3列,分别命名为“title”、‘author’和‘num’,用于存放1中怕的内容,最后将二维列表result中的内容存入数据库:

conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='数据库密码',
db='test1',
charset='utf8mb4' )
cur = conn.cursor() #如果存在TIEBA表,则删除
cur.execute("DROP STAR IF EXISTS STAR") #创建TIEBA表
sql = """ create table STAR(
title char(255),
author char(100),
num char(20)) """ cur.execute(sql) for i in result:
cur.execute("INSERT INTO STAR(title,author,num) VALUES ('{0}','{1}','{2}')".
format(i[0].replace('\'','').replace('\"','').replace('\\',''), i[1], i[2]))
conn.commit()

由于帖子内容中存在表情等符号,所以选择用'utf8mb4'这样就可以把表情也存入数据库了,但是还有一些标点符号在写入过程会出错,所以用replace给替换掉了。

总共爬了250页数据,最后的结果如下:

总共爬了1万3千多条数据,基本把最近两年的帖子都爬完了。

三、可视化展示

用create_engine模块读取数据库表中的内容,代码如下:

import pandas as pd from sqlalchemy importcreate_engine # 初始化数据库连接,使用create_engine模块
engine =create_engine('mysql+pymysql://root:密码@127.0.0.1:3306/test1') # 查询语句,选出STAR表中的所有数据
sql = ''' select *from STAR; '''
# read_sql_query的两个参数: sql语句, 数据库连接
df =pd.read_sql_query(sql, engine) # 输出STAR表的查询结果
df['num']=[int(i) for i in list(df['num'])]
df=df.drop_duplicates(subset=['title','author','num'], keep='first')

因为跟帖数量是以字符格式存入的,所以先将其转为整数,再用drop_duplicates模块对数据进行去重,这样就把数据整理完毕了。

上万条数据放在你面前,用肉眼是看不出什么名堂的,所以我这里选择了几个角度,用python统计分析这个贴吧里到底隐藏着什么秘密

1.找出发帖数量最多的20个人

说简单点就是创建1个空字典,然后把df['author']转成列表,统计列表中元素个数,将元素及个数存入字典中,再对字典进行排序,将前十个画成柱状图,代码如下:

#发帖数量排名
rank_num={} for i in list(set(list(df['author']))):
rank_num[i.replace(' ', '')] = list(df['author']).count(i)
rank_num = sorted(rank_num.items(), key=lambda x: x[1], reverse=True)
bar = Bar("柱状图", "发帖数量-昵称")
bar.add("发帖数量-昵称", [i[0] for i in rank_num[:10]], [i[1] for i in rank_num[:10]],
xaxis_rotate=45, mark_line=["average"], mark_point=["max", "min"])
bar.render('发帖数量-昵称.html')

结果如下:

这个猎头发帖有点猛啊,单人最高发了751个,真厉害。

2.找出跟帖数最多的20个帖子

dff=df.sort_values(by='num', ascending=False).head(10)
bar = Bar('跟帖数量排名',width=1000,height=400)
bar.use_theme('dark')
bar.add('' ,dff['title'][::-1], dff['num'][::-1], is_convert=True, is_yaxis_inverse=False, xaxis_rotate=45,is_label_show=True,label_pos='right')
bar.render("跟帖数量排名.html")

结果如下:

跟帖最多的竟然是个水贴,数量高达73459次

3.制作所有帖子的词云图

先把所有帖子连接成字符,用jieba进行分词,插入背景图片,代码如下:

import matplotlib.pyplot as plt import jieba from wordcloud importwordcloud
text=''
for i in list(df['title']):
text+=i print(text)
cut_text = jieba.cut(text)
result=[] for i in cut_text:
result.append(i)
result = " ".join(result)
wc = wordcloud.WordCloud(
font_path='C:\Windows\Fonts\FZBWKSJW.TTF', # 字体路径
background_color='white', # 背景颜色
width=1000,
height=600,
max_font_size=1000, # 字体大小
min_font_size=10,
mask=plt.imread('水滴.jpg'), # 背景图片
max_words=100000)
wc.generate(result)
wc.to_file('result.png') # 图片保存

效果如下:

看了这张词云图,可以确定贴吧基本已经被猎头占领了,连肖战、李现等流量小生都被压下去了。

python深挖65万人的明星贴吧,探究上万个帖子的秘密的更多相关文章

  1. Python如何实现微信群万人同步直播?

    很多人传言微信网页版(https://wx.qq.com/)接口已经被封了,所以所有的微信都不能登录网页版,这是错误的. 2019年7月微信对网页版微信进行了动态安全策略调整,导致一大批微信号不能登录 ...

  2. 第一章 基础设施,1.3 阿里视频云ApsaraVideo是怎样让4000万人同时狂欢的(作者:蔡华)

    1.3 阿里视频云ApsaraVideo是怎样让4000万人同时狂欢的 前言 在今年的双11中,双11天猫狂欢夜的直播成为一大亮点. 根据官方披露数据,直播总观看人数超4257万,同时观看人数峰值达5 ...

  3. 深挖JDK动态代理(二):JDK动态生成后的字节码分析

    接上一篇文章深挖JDK动态代理(一)我们来分析一下JDK生成动态的代理类究竟是个什么东西 1. 将生成的代理类编程一个class文件,通过以下方法 public static void transCl ...

  4. 落实制度靠流程<摘自平安50万人的执行力>

     落实制度靠流程<摘自平安50万人的执行力> 讲在嘴上的制度是给人听的,写在纸上的制度是给人看的,落实在流程上的制度才是可靠的.制度的执行不能都依赖个人的自觉性. 很多企业都在强调和推行制 ...

  5. 深挖Openstack Nova - Scheduler调度策略

    深挖Openstack Nova - Scheduler调度策略   一.  Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(F ...

  6. EDG夺冠!用Python分析22.3万条数据:粉丝都疯了!

    一.EDG夺冠信息 11月6日,在英雄联盟总决赛中,EDG战队以3:2战胜韩国队,获得2021年英雄联盟全球总决赛冠军,这个比赛在全网各大平台也是备受瞩目: 1.微博热搜第一名,截止2021-11-1 ...

  7. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  8. 深挖BAT内部级别和薪资待遇,你敢看?(转)

    一. 阿里内部级别和薪资待遇 先看个例子,或许你也曾像他一样纠结 BAT 的 offer: 最近刚通过阿里面试,但基本薪酬也是不升反小降. 级别只有 P6+,连 P7 都没有,非常郁闷,打算拒绝算了. ...

  9. 深挖JDK动态代理(一)

     最近在研究RPC框架,避免不了的就是在RPC调用中使用最多的则是动态代理的机制了,基于此,我们先来研究一下JDK动态代理 我们先来尝试着编写一下JDK动态代理的代码 1. 由于JDK动态代理是基于接 ...

随机推荐

  1. java的自定义配置文件统一读取配置类示例

    前言:在我们的日常编程中难免会有些我们自定义的配置,虽然Java中提供了很多的读取配置文件的方法,但是当我们需要修改配置文件的key的时候,就会发现太过散乱了,工作量也会很大,涉及的文件还很多,一不小 ...

  2. python数据处理(五)之数据清洗:研究、匹配与格式化

    1 前言 保持数据格式一致以及可读,否则数据不可能正确合并 清洗数据的过程中记下清洗过程的每一步,方便数据回溯以及过程复用 2 数据清洗基础知识 2.1 找出需要清洗的数据 仔细观察文件,观察数据字段 ...

  3. 数据可视化之PowerQuery篇(六)PowerQuery技巧:批量合并Excel表的指定列

    本文来源于一个星友的问题,他有上百个Excel表格,格式并不完全一样,列的位置顺序也不同,但每个表都有几个共同列,这种情况下,能不能通过Power Query把这些表格共同的列批量合并呢? 当然是可以 ...

  4. ShaderLab-坐标转换

    观察空间就是相机的空间 投影矩阵本质就是对x.y.z分量进行不同程度的缩放(z还做了平移),结果就是视锥体近切面远切面变成正方形.视锥体的中心在(0,0). (对于正交相机,这一步已经得到了立方体) ...

  5. Vue你不得不知道的异步更新机制和nextTick原理

    前言 异步更新是 Vue 核心实现之一,在整体流程中充当着 watcher 更新的调度者这一角色.大部分 watcher 更新都会经过它的处理,在适当时机让更新有序的执行.而 nextTick 作为异 ...

  6. There are unfinished transactions remaining. Please run yum-complete-transaction as root.

    问题:CentOS  运行软件更新时,提示如下错误. 解决办法: 在终端界面,运行   sudo yum-complete-transaction.

  7. echarts 实战 : 怎么处理特殊的图表数字 label ?

    所谓Label,就是在图表上面显示的那个数字. 但有的时候我们需要柱状图堆叠. 那如果我们需要所有数字都在外面,并且以 320/210/310/410/1320 这样的形式显示呢? 那么 echart ...

  8. Git 推送到远程仓库

    github:https://github.com/ 国内的:https://gitee.com/ (和Github非常相似的) 一.Http方式进行推送 右击同步,配置远端,将URL替换成远程仓库的 ...

  9. collection集合常用功能

    java.util.Collection接口 是所有单列集合最顶层的接口,里面定义了所有单列集合的共性方法 1.public boolean add(E e)     添加元素 2.public bo ...

  10. LeetCode 85 | 如何从矩阵当中找到数字围成的最大矩形的面积?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题53篇文章,我们一起来看看LeetCode中的85题,Maximal Rectangle(最大面积矩形). 今天的 ...