python 爬虫 抓取豆瓣《极简宇宙史》书评,制作词云
整个过程分为两大步:
- 爬取豆瓣豆瓣《极简宇宙史》书评
- 制作中文词云
下面开始正式内容:
爬取豆瓣豆瓣《极简宇宙史》书评
打开豆瓣网站,转至《极简宇宙史》书评页面链接
打开页面我们可以看到截止到目前共有1354条短评
我们爬取书评用的是python语言,用到的库有 requests,还BeautifulSoup。
requests主要用来请求网页数据,BeautifulSoup用来解析网页数据。
安装requests,BeautifulSoup库
我用的是python自带的pip命令安装,
打开python根目录
按住shift+鼠标右键、,打开命令行窗口
在命令行窗口输入:
pip install requests
安装好requests,再安装beautifulsoup:
pip install beautifulsoup
把这两个库安装好之后,我们就可以进行数据抓取工作了!
分析网页源码,进行数据抓取
在书评的网页页面,鼠标右键单击,会出来一个选项窗口,选中检查,会出现网页源码,如下图所示:
经过分析查看,我们可以发现,所有书评都存放在一个叫
div class=''article''当中
再进一步分析,可以发现,全部书评是存放在 p class="comment-content"当中,找到书评具体存放位置就好办了,下面就可以开始抓取书评
导入 requests,BeautifulSoup 两个库,另外也导入系统自带time函数(防止短时间内获取数据服务器不响应)。
coding = "UTF-8"
#引入 requests BeautifulSoup 两个
import requests
from bs4 import BeautifulSoup
import time
#先命名一个空list
sm_list = []
#填写头部信息
headers = {'Host':'book.douban.com',
'Referer':'https://book.douban.com/subject/26697350/',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
}
#先利用requests请求网页信息,这里的循环主要作用是我们发现书评有1354条,每页有20条,将近70页,这里用字符串格式化操作,进行遍历抓取数据
for page in range(1,70):
url = 'https://book.douban.com/subject/26697350/comments/hot?p={}'.format(page)
req = requests.get(url,headers=headers)
content = req.content
soup = BeautifulSoup(content,'lxml')
article = soup.find('div',class_='article')
list = article.find_all('p',attrs ={'class':'comment-content'},)
for i in list:
shuji_list = i.get_text().replace('\n','')
sm_list.append(shuji_list)
#这里我设置时间间隔为1秒
time.sleep(1)
print(page)
print(sm_list)
耐心等待数据抓取......
数据抓取完之后,把全部书评复制到桌面的一个新建文本文档中。
进行数据清洗,利用正则表达式删除全部标点
我们抓取的书评是一个list,我们要先把这个list变为字符串,方法很简单,直接打开桌面的新建文本文档把最开始和最后面的两个中括号去掉就可以。
下面我们开始用正则表达式批量删除标点
源码如下:
# coding=utf-8
import re
s = '''晒着八分二十秒到达的阳光,看着一百多万年前的恒星爆炸,还有什么再浪漫的事嘛', '
笑哭了...泡利在发现此原则前刚被他太太抛弃……他太太的离开是因为一位化学家,对于
理论物理学家来说,这实在是奇耻大辱,因此泡利开始用酒精来埋葬自己的悲伤。所以他以
“不相容”来命名自己的原则也不再奇怪。****奇耻大辱啊奇耻大辱一本温柔的书。更像是
【【【【【【【【【为了大家阅读代码方便,我把中间大段书评删除掉,大家到时候把书评全部复制上去即可】】】】】】】】
究竟能探寻到宇宙的秘密。那么意识又怎么会像唯物论中那般卑微,物质才不过是万千粒子
,循化往复,智慧才建立文明,我并不信仰人格化的神,但我真的觉得人自以为认识世界的
时候原来从不曾认识世界。', '写的很通俗,很有趣。但对于我这样的物理盲来说,看起来
还是挺费劲的。好处在于看完之后我对我们所处的世界有了新的认识。', '还可以', '看完
之后居然发现自己可以看懂时间简史了。', '停不下来 有魔力'''
print(re.sub('\W','',s))
这是去除标点后的文本:
注意,至此,我们就已经完成对《极简宇宙史》书评的抓取,并且已经全部去除标点,保存在桌面文档中,下一步就可以开始制作词云了!!!
制作中文词云
制作中文词云我们要用到matplotlib,wordcloud,jieba 这三个库,这三个库的安装上方跟上面类似
我们把删除标点后的书评存放在桌面一个名叫“jijian.txt" 的文档中。
下面直接上源码:
#导入三个库
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import jieba
#用open函数打开文档,读取内容存放在text文件中
text = open('C:\\Users\\Administrator\\Desktop\\jijian.txt').read()
#用jieba库对文档进行分词,分词后存储在一个叫wordlist_jieba的文件中,这个文件为list格式
wordlist_jieba = jieba.cut(text, cut_all = True)
#用join函数将list转为str
wordstr = " ".join(wordlist_jieba)
#用wordcloud生成词云
my_wordcloud = WordCloud().generate(wordstr)
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
运行程序之后,生成的词云如图所示:
至此,我们就完成了对豆瓣《极简宇宙史》书评的抓取,并制作词云完成。
从词云中可以看出,出现频次最高的词语为:宇宙,物理,我们,作者,还是,知识,一个,世界,自己,理论。效果还算理想!!!
几点思考:
- 词云已经初步生成,但有时候我们抓取的信息中无效信息太多,如出现频次较高的如”的“,”我“,”你“之类的无关词语太多,影响我们判断信息主旨。下一步可以通过jieba添加字典,过滤无效信息。
- 有时候分析不准确,有可能出现”互联“,”互联网“这两个词频较高的词,可以利用jieba不同的分词模式。避免这种情况出现,或者是添加字典,定向排除某些词语。
- 这次生成的词云是系统系统默认的格式,下一步可以研究通过插入图片,生成图片形状的词云,也可以设置频次出现最高的词语的个数,词云背景色等等......生成更美观的词云
- 这次爬虫只是利用最基础的requests,beautifulSoup库,而且网站没有反爬虫机制,算是比较顺利的爬取下数据,属于静态页面。而且数据量较小。以后爬取大量数据可以学习使用Scrapy,多线程爬取数据。
- 这次爬完数据仔细阅读发现,我设置爬取页面为1到10页时,数据就可以全部下载下,设置为1到12页时,爬取的数据中第1页的第1条书评就缺失,当爬取页面设置为1到70页时,发现前面的书评缺失的更多,一直想不明白是什么原因,还望高人解答。
总之,需要学习的还有很多。
以上,可以作为自己近阶段学习的总结笔记,也勉强可以作为小白入门不算及格的教程吧!!!