第100篇博客——用Python爬取我前99篇博客内容,分词并生成词云图
这是我的第100篇博客,从2016年7月1日发表第一篇博客至今,也有两个多年头了。
回首自己前99篇博客,各种类型都有,有技术总结,有随感,有读书笔记,也有BUG修改。内容千奇百怪,质量参差不齐,篇幅长短不一,但总的来说也是写了也有几十万字了。
写博客对于我来说渐渐也成为了一个习惯,通过写博客,我能定期进行自我总结,归纳自己的进步和了解自己的不足。同时也通过不断地笔耕,使得自己文笔上有了不小的进步。
这第100篇博客,我打算用咱程序员自己的方式对我前99篇文章做个小结。采用Python爬取我博客整体情况和前99篇博客内容,做分词处理,然后生成词云图。
一、运行环境
Python 3.6.3
二、博客整体情况爬取
博客的整体情况爬取可以参考我之前的文章:https://blog.csdn.net/bit_kaki/article/details/80254646
其实采用Python爬取数据的核心思想是通过模拟浏览器访问服务器,从响应的结果中获取自己想要的内容。
所以比起我之前的文章,访问服务器这块没有任何改变,而随着CSDN自身前端页面的更改,所以在获取内容这块代码会有所更改。
这里我再重新说明下吧,首先是模拟浏览器访问服务器,其代码为:
#输入CSDN博客ID
account = str(raw_input('print csdn id:'))#首页地址
baseUrl = 'http://blog.csdn.net/'+account
#连接页号,组成爬取的页面网址
myUrl = baseUrl+'/article/list/'+str(page_num)#伪装成浏览器访问,直接访问的话csdn会拒绝
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent':user_agent}
#构造请求
req = urllib2.Request(myUrl,headers=headers)#访问页面
myResponse = urllib2.urlopen(req)
myPage = myResponse.read()
type=sys.getfilesystemencoding()
myPage = myPage.decode("UTF-8").encode(type)
这里需要注意的我都以注释形式给予了备注。
接下来就是解析服务器响应的数据。在我们自己解析前,可以先打开浏览器,看看页面源代码:
在总体情况这里,我想爬取的是我的博客标题、原创、粉丝、喜欢、评论、访问量等基本信息,于是我们在源代码里找到相应的信息:
然后我们就可以利用正则表达式来获取相应的信息,其代码如下所示:
#获取总体信息
#利用正则表达式来获取博客的标题
title = re.findall('<title>(.*?)</title>',myPage,re.S)
titleList=[]
for items in title:titleList.append(str(items).lstrip().rstrip())
print '%s %s' % ('标题'.decode('utf8').encode('gbk'),titleList[0])#利用正则表达式来获取博客的数量
num = re.findall('<span class="count">(.*?)</span>',myPage,re.S)
numList=[]
for items in num:numList.append(str(items).lstrip().rstrip()) #利用正则表达式来获取粉丝的数量
fan = re.findall('<dd><span class="count" id="fan">(.*?)</span></dd>',myPage,re.S)
fanList=[]
for items in fan:fanList.append(str(items).lstrip().rstrip()) #输出原创、粉丝、喜欢、评论数
print '%s %s %s %s %s %s %s %s' % ('原创'.decode('utf8').encode('gbk'),numList[0],'粉丝'.decode('utf8').encode('gbk'),fanList[0],'喜欢'.decode('utf8').encode('gbk'),numList[1],'评论'.decode('utf8').encode('gbk'),numList[2])#利用正则表达式来获取访问量
fangwen = re.findall('<dd title="(.*?)">',myPage,re.S)
fangwenList=[]
for items in fangwen:fangwenList.append(str(items).lstrip().rstrip()) #利用正则表达式来获取排名
paiming = re.findall('<dl title="(.*?)">',myPage,re.S)
paimingList=[]
for items in paiming:paimingList.append(str(items).lstrip().rstrip()) #输出总访问量、积分、排名
print '%s %s %s %s %s %s' % ('总访问量'.decode('utf8').encode('gbk'),fangwenList[0],'积分'.decode('utf8').encode('gbk'),fangwenList[1],'排名'.decode('utf8').encode('gbk'),paimingList[0])
运行结果如下:
于是第一部分获取博客整体情况就完成了。内容很简单,步骤总结下就是网络请求——获取数据——截取自己需要的数据。
三、获取每篇博客的内容
刚刚我们是获取博客整体情况,通过一次网络请求即可获取整体信息。
那么我们如何获取每篇文章的内容呢?
其实答案也挺简单,那就是做一次遍历,访问每篇文章所在地址,获取博客数据即可。
在CSDN里,每个博客展示页面仅仅展现20篇博客内容,而我的博客数是大于20的,所以在博客综述页面里是进行了分页展示。所以首先,我应该获取到每页博客综述页面的数据。代码如下:
#不是最后列表的一页
notLast = []#获取每一页的信息
while not notLast:#首页地址baseUrl = 'http://blog.csdn.net/'+account#连接页号,组成爬取的页面网址myUrl = baseUrl+'/article/list/'+str(page_num)#伪装成浏览器访问,直接访问的话csdn会拒绝user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = {'User-Agent':user_agent}#构造请求req = urllib2.Request(myUrl,headers=headers)#访问页面myResponse = urllib2.urlopen(req)myPage = myResponse.read()type=sys.getfilesystemencoding()myPage = myPage.decode("UTF-8").encode(type)#在页面中查找最后一页,这里我用了我博客的最后一页的一个标签notLast = re.findall('android.media.projection',myPage,re.S)print '-----------------------------the %d page---------------------------------' % (page_num,)#利用正则表达式来获取博客的标题title = re.findall('<span class="article-type type-1">(.*?)</a>',myPage,re.S)titleList=[]for items in title:titleList.append(str(items)[32:].lstrip().rstrip()) #利用正则表达式获取博客的访问地址url = re.findall('<a href="(.*?)" target="_blank">',myPage,re.S)urlList=[]for items in url:urlList.append(str(items).lstrip().rstrip())#将结果输出 for n in range(len(titleList)):print '%s %s' % (titleList[n],urlList[n*2+1])#页号加1page_num = page_num + 1
这里,我设置了一个参数notLast作为是否为最后一页的标签,然后在我博客综述的最后一页找到个特殊的内容“ android.media.projection” 作为判定依据,这样我就可以找到博客综述的所有数据了。
运行结果为:
接下来我就是要获取我每一篇博客的内容了。方法依然是遍历,根据每一页博客综述里获取的博客地址,进行请求访问,然后从响应结果里获取博客内容。代码为:
#将结果输出 for n in range(len(titleList)):print '%s %s' % (titleList[n],urlList[n*2+1])#每篇博客地址baseUrl = urlList[n*2+1]#伪装成浏览器访问,直接访问的话csdn会拒绝user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = {'User-Agent':user_agent}#构造请求req = urllib2.Request(baseUrl,headers=headers)#访问页面myResponse = urllib2.urlopen(req)myPage = myResponse.read()type=sys.getfilesystemencoding()myPage = myPage.decode("UTF-8").encode(type)#利用正则表达式来获取博客的内容content = re.findall('<article>(.*?)</article>',myPage,re.S)contentList=[]for items in content:contentList.append(str(items).lstrip().rstrip())try:fh = open('F:\\study\\article\\'+titleList[n]+'.txt', 'a')fh.write('%s' % (contentList[0]))fh.write('\n')fh.close()except IOError:print '发生了错误'
运行的结果,我们就在指定位置获取了每篇博客的内容:
不过目前的博客内容还有大量html标签,我们再把这些html标签去掉,并且全部保存到一个文件里。代码为:
#将结果输出 for n in range(len(titleList)):print '%s %s' % (titleList[n],urlList[n*2+1])#每篇博客地址baseUrl = urlList[n*2+1]#伪装成浏览器访问,直接访问的话csdn会拒绝user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'headers = {'User-Agent':user_agent}#构造请求req = urllib2.Request(baseUrl,headers=headers)#访问页面myResponse = urllib2.urlopen(req)myPage = myResponse.read()type=sys.getfilesystemencoding()myPage = myPage.decode("UTF-8").encode(type)#利用正则表达式来获取博客的内容content = re.findall('<article>(.*?)</article>',myPage,re.S)contentList=[]for items in content:contentList.append(str(items).lstrip().rstrip())text = contentList[0]dr = re.compile(r'<[^>]+>',re.S)dd = dr.sub('',text)try:fh = open('F:\\study\\article\\ALL\\all.txt', 'a')fh.write('%s' % (dd))fh.write('\n')fh.close()except IOError:print '发生了错误'
然后在一个名为all.txt的文档,就可以看到我所有博客的文档内容了:
四、利用jieba分词
jieba是目前最常用的中文分词工具包,分为三种模式:精确模式(默认)、全模式和搜索引擎模式。下面举例说明:
精确模式:主要将句子最精确的切开,适合文本分析;
比如:'我想和女朋友一起去北京故宫博物院参观和闲逛。'
拆分结果为:我,想,和,女朋友,一起,去,北京故宫博物院,参观,和,闲逛。
全模式:把句子中所有的可能成词语都扫描出来,速度非常快,但是不能解决歧义
比如:'我想和女朋友一起去北京故宫博物院参观和闲逛。'
拆分结果为:我,想,和,女朋友,朋友,一起,去,北京,北京故宫,北京故宫博物院,故宫,故宫博物院,博物,博物院,参观,和,闲逛。
搜索引擎模式 :在精准模式的基础上,对长词再次切分,提高招呼率,适合用于搜索引擎分词。
比如:'我想和女朋友一起去北京故宫博物院参观和闲逛。'
拆分结果为:我,想,和,朋友,女朋友,一起,去,北京,故宫,博物,博物院,北京故宫博物院,参观,和,闲逛。
本文采用精确模式,词库选择清华大学的thulac中文词库。
首先需要安装两个分析包:
pip install thulac #安装清华大学的thulac中文词法分析包
pip install jieba #安装中文词法分析包jieba
然后直接附上代码:
#! python3
# -*- coding: utf-8 -*-
import jieba #导入结巴模块
from collections import Counter #导入collections模块的Counter类#对文本文件txt进行分词,并统计词频,再显示结果
def get_words(txt):
#对文本进行分词list = jieba.cut(txt) #结巴模块的cut函数用于中文分词
#统计词频c = Counter() #创建空的Counter计数器for x in list: #分词结果中循环提取词语if len(x) > 1 and x != '\r\n' and x != 'nbsp' and x !='gt' and x !='lt': #略掉只有一个字的词语和回车、换行、空格、大于、小于c[x] += 1 #统计每个单词的计数值
#S3 将结果可视化fh = open('F:\\study\\article\\ALL\\tongji.txt', 'a')fh.write('卡小基博客常用词')fh.write('\n')fh.close()for(k,v) in c.most_common(150): #只取出现值最高的前150个词语fh = open('F:\\study\\article\\ALL\\tongji.txt', 'a')fh.write('%s %d' % (k, v))fh.write('\n')fh.close()#读取某文本文件(默认uft-8格式)
with open('F:\\study\\article\\ALL\\all.txt','rb') as f :txt = f.read()txtlength=len(txt)fh = open('F:\\study\\article\\ALL\\tongji.txt', 'a')fh.write('卡小基博客总字数为'+str(txtlength))fh.write('\n')fh.close()
#对该文件进行分词,并统计词频,显示结果
get_words(txt)
运行可以得出结果:
就可以得出我的博客总字数以及常用词的字数了。用得最多的都是一些日常常见词,以及代码里涉及到的new、int、string的名号关键词。
五、生成词云图
根据我们的统计结果,下一步就是生成词云图了。
在Python里,我们可以使用WorldCloud生成词云图,代码也很简单,详见:
https://blog.csdn.net/CSDN2497242041/article/details/77175112?locationNum=5&fps=1
不过效果来说真的一般,于是后来我找到了WordArt,在上面制作词云图。
WordArt的网址为:https://wordart.com/create
首先是导入文字:
接下来是选择背景图,背景图我选择了CSDN的一个LOGO作为背景图:
接下来就是选择字体。因为我这里中文汉字较多,所以选择自己导入微软雅黑字体。步骤和上两步相似。
然后就是布局和类型选择,这里我都采取的是其默认选择内容。
选择完毕后,点击visualize按钮,即可生成词云图,效果如下:
就这样,就完成了我前99篇博客词云图统计。
第100篇博客——用Python爬取我前99篇博客内容,分词并生成词云图相关推荐
- 爬取2021年天猫平台儿童推车畅销单品评价生成词云图
目录 前言 一.爬取天猫评论 1.代码 二.在线生成词云 1.微词云 2.使用技巧 (1)粘贴复制文本 (2)分词性筛选需要的词语 (3)生成词云图 总结 前言 了解用户对相应畅销单品的看法,研究用户 ...
- 第一篇博客,python爬取淘宝信息
python爬取淘宝信息 本人只是刚学python的菜鸟,代码不规范及需改进的地方请指教 我们直接看代码吧!哈哈 import requests from bs4 import BeautifulSo ...
- Python爬取韩寒全部新浪博客
接上一篇,我们根据第一页的链接爬取了第一页的博客,我们不难发现,每一页的链接就只有一处不同(页码序号),我们只要在上一篇的代码外面加一个循环,这样就可以爬取所有博客分页的博文,也就是所有博文了. # ...
- python网易云歌词做成词云图_Python爬取李荣浩最短歌曲贝贝的网易云评论并做成词云图...
前言 在18 年的 10 月 17 号,李荣浩发了一张新专辑「耳朵」,专辑里有一首歌「贝贝」,只有 4 秒,歌词也就两个字.而且这首歌的作曲 .作词 .编曲.制作人.和声.录音师.混音师.录音室.混音 ...
- Python中文分析:《射雕英雄传》统计人物出场次数、生成词云图片文件、根据人物关系做社交关系网络和其他文本分析
前言 python中文分析作业,将对<射雕英雄传>进行中文分析,统计人物出场次数.生成词云图片文件.根据人物关系做社交关系网络和其他文本分析等. 对应内容 1.中文分词,统计人物出场次数, ...
- 我的第一篇博客:Python爬取新浪财经股票页面 并用matplotlib可视化输出结果
(由于疫情在家闲着,开学至少得等到四月份,便在上个星期动起了学习python的念头,凭借着大一C语言微薄的基础草草学习语法后便开始了学写爬虫.跟着教学视频爬了几个静态网站后便开始尝试爬动态网站,同时也 ...
- python爬取小说写入txt_燎原博客—python爬取网络小说存储为TXT的网页爬虫源代码实例...
python是一门优秀的计算机编程语言,两年前曾因为动过自动化交易的念头而关注过它.前几天在微信上点了个python教学的广告,听了两堂课,所以现在又热心了起来,照葫芦画瓢写了一段简单的网络爬虫代码, ...
- python爬取两个网站_python-2:爬取某个网页(虎扑)帖子的标题做词云图
关键词:requests,BeautifulSoup,jieba,wordcloud 整体思路:通过requests请求获得html,然后BeautifulSoup解析html获得一些关键数据,之后通 ...
- python爬取哔哩哔哩网页弹幕内容,并将爬取的内容以五角星的形式显示出来
思路: 向哔哩哔哩网站发送请求 请求成功后,解析爬取的弹幕内容保存到一个文件中 读取文件并分析弹幕内容中词组或文字出现的频率 将这些词组或文字组成五角星图形 组成五角星图形后,以图片的形式输出 使用到 ...
最新文章
- 开发日记-20190403
- 狗窝里的小日子- 2 ...
- MyEclipse/Eclipse 中使用javap
- 微信 html5禁止拖拽,js实现微信禁止h5网页下拉,禁止微信内置浏览器下拉网页...
- 95-10-045-启动-LogDirFailureChannel
- 爬虫、请求库requests
- 卡巴2009与word冲突完美解决方案,经测试几十台计算机全部通过
- centOS 6.5上安装mysql5.7压缩版
- Topaz DeNoise AI for Mac(图片降噪软件)
- 2017.3.27-morning
- Linux 程序运行时报错:找不到库文件[cannot open shared object file: No such file or directory ```](转载)
- 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---36
- iOS中的坑:URL不识别##
- 模拟电子技术,电力电子技术
- MinGW gcc下载链接及sjlj、dwarf、seh异同以及gcc安装
- 卡内基梅陇大学计算机学院,卡内基梅隆大学计算机学院
- 全国青少年编程等级考试python二级真题2020年9月(含题库答题软件账号)
- 软谋在线教育推荐好书(一)
- 这一篇说明大多数SQL优化的面试问题
- 微软IT如何规划和构建的企业私有云基础设施
热门文章
- Phone 多方通话流程(GSM CDMA)
- 超标量处理器设计——第八章_发射
- matlab离散型数据求和,MATLAB程序设计教程(6)---MATLAB数据分析与多项式计算
- CTFjpg图片隐写之zlib压缩数据包的提取
- BQ40Z50 调试
- 计算机学生的未来 .
- 入门系列-在AspNet Core MVC Web Application中使用ABP
- 东方博易OJ——1003 - 【入门】编程求1+3+5+...+n
- 谈谈我对PMP的一点点感受
- 【知识兔】自学Excel之9:数据输入与编辑(高级技巧)