前言本文文字及图片来源于网络,仅供学习交流之用,不作任何商业用途,版权归属给原作者。如有任何问题,请及时联系我们进行处理。最近一直在关注百度星吧,发现了很多有意思的帖子,所以想用python把这些帖子全部爬取,分析一下内容。本文知识点:介绍mysql数据库内容插入和提取的简单应用;介绍如何从mysql数据库中提取文本并进行分析;介绍数据分析的切入点和思路。对于想要更轻松的学习Python开发技术,Python爬虫,Python大数据分析,人工智能等技术的初学者,这里我给大家分享一套系统的教学资源,加上我搭建的Python技术的学习裙子;七八四七五八二一四,一起学习。有相关开发工具,学习教程,专业老司机每天在线直播分享知识技术答疑解惑!下面给大家详细介绍一下实现过程:1.网站分析贴吧的翻页是通过改变url实现的,主要是pn参数:https://tieba.baidu.com/f?kw=star&ie=utf-8&pn=Pages*50帖子的内容,发帖人和关注人数可以在网页上查到:所以我们只需要用requests模拟请求,然后用bs4解析得到想要的内容。二、Python编程实现1.爬取数据使用静态网络爬虫的老套路。根据网页源码的特点,使用find_all函数提取帖子、海报、帖子数等信息,并将三类信息放入列表中,最终生成一个二进制的Dimension列表结果,主要用于为了方便存入数据库,代码如下:fortinrange(250):print('Page{0}'.format(t+1))url='https://tieba.baidu.com/f?kw=star&ie=utf-8&pn={0}'.format(t*50)header={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64;rv:69.0)Gecko/20100101Firefox/69.0'}response=requests.get(url,header)soup=BeautifulSoup(response.text,'html.parser')items_content=soup.find_all('a',class_='j_th_tit')#contentitems_user=soup.find_all('span',class_='tb_icon_author')#nicknameitems_comment=soup.find_all(class_='threadlist_rep_numcenter_text')#zip中i、j、k的帖子数(items_content,items_user,items_comment):结果.append([i.get('title'),j.get('title')[5:],k.text])time.sleep(1)2.先在数据库中存储新建一张表,取名'STAR',然后创建3个名为“title”、“author”和“num”的columns,用于存储1中的内容,最后将二维列表结果中的内容存入数据库:conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='数据库密码',db='test1',charset='utf8mb4')cur=conn.cursor()#如果TIEBA表存在,删除cur.execute("DROPSTARIFEXISTSSTAR")#CreateTIEBAtablesql="""createtableSTAR(titlechar(255),authorchar(100),numchar(20))"""cur.execute(sql)for我在结果中:cur.execute("INSERTINTOSTAR(title,author,num)VALUES('{0}','{1}','{2}')".format(i[0].replace('\'','').replace('\"','').replace('\\',''),i[1],i[2]))conn.commit()由于发布content里面有表情等符号,所以我选择用'utf8mb4'这样表情也可以存入数据库,但是还是有一些p写的过程中会出错的笔触标记,所以我用replace替换掉,一共爬取了250页的数据。最终结果如下:一共爬取了13000多条数据,基本上近两年的帖子都被爬取了。3、可视化展示使用create_engine模块读取数据库表中的内容,代码如下:importpandasaspdfromsqlalchemyimportcreate_engine#初始化数据库连接,使用create_engine模块engine=create_engine('mysql+pymysql://root:password@127.0.0.1:3306/test1')#查询语句,选择STAR表中的所有数据sql='''select*fromSTAR;'''#read_sql_query的两个参数:sql语句,数据库连接df=pd.read_sql_query(sql,engine)#输出STAR表的查询结果df['num']=[int(i)foriinlist(df['num'])]df=df.drop_duplicates(subset=['title','author','num'],keep='first')因为帖子数是以字符格式存储的,所以首先将其转换为integer,然后使用drop_duplicates模块对数据进行去重,这样数据就整理好了。几万条数据摆在你面前,肉眼是看不出有什么出名的,所以我在这里选择几个角度,用python统计分析一下这个贴吧到底隐藏了哪些秘密1。找到帖子最多的20个人简单来说就是创建一个空字典,然后将df['author']转成一个列表,统计列表中的元素个数,将元素和个数存入字典,对字典进行排序,将前十张图片组成直方图,代码如下:#postnumberrankrank_num={}foriinlist(set(list(df['author']))):rank_num[i.replace('','')]=list(df['author'].count(i)rank_num=sorted(rank_num.items(),key=lambdax:x[1],reverse=True)bar=Bar("Histogram","Numberofposts-nickname")bar.add("NumberofPosts-Nickname",[i[0]foriinrank_num[:10]],[i[1]foriinrank_num[:10]],xaxis_rotate=45,mark_line=["average"],mark_point=["max","min"])bar.render('NumberofPosts-Nickname.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")结果如下:关注最多的帖子其实是水帖,数量为高达734593.制作所有帖子词云图首先将所有帖子连接成字符,使用jieba进行分词,插入一张背景图。代码如下:importmatplotlib.pyplotaspltimportjiebafromwordcloudimportwordcloudtext=''foriinlist(df['title']):text+=iprint(text)cut_text=jieba.cut(text)result=[]foriincut_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('waterdrop.jpg'),#背景图片max_words=100000)wc.generate(result)wc.to_file('result.png')#图片保存效果如下:看了这张词云图,可以确定贴吧基本已经被猎头占据了,就连肖战、李现和其他流量利基被压制。
