原创不易,转载前请注明博主的链接地址:Blessy_Zhu <https://blog.csdn.net/weixin_42555080>
https://blog.csdn.net/weixin_42555080 <https://blog.csdn.net/weixin_42555080>
本次代码的环境:
运行平台: Windows
Python版本: Python3.x
IDE: PyCharm

<>一、 前言


豆瓣网是一家基于用户对于图书、电影和音乐兴趣而搭建的社交网站,由杨勃创立于2005年。豆瓣网推崇算法,根据用户对音乐、书、电影等进行的操作,自动给出同类趣味和友邻推荐。基于记录和分享而生成的“用户价值”是豆瓣的核心竞争力。豆瓣网的一大特色是不做运营,用户自发组建的小组是豆瓣特有的文化和社区产物。


爬取豆瓣网上面的电影评论数据具有很重要的作用。电影评论数据是NLP(自然语言处理)重要的数据。通过电影评论数据集可以进一步做中文分词、命名实体识别、关键词提取、句法分析、文本向量化、情感分析、舆情分析等进一步的数据处理和应用。既然数据这么重要,废话不多说,紧接着就开始电影数据的爬取。

<>二、 代码及结果分析展示

这次选取的实例电影是《我不是药神》:它是由文牧野执导,宁浩、徐峥共同监制的剧情片,徐峥、周一围、王传君、谭卓、章宇、杨新鸣等主演
。该片于2018年7月5日在中国上映。影片讲述了神油店老板程勇从一个交不起房租的男性保健品商贩,一跃成为印度仿制药“格列宁”独家代理商的故事,这里先放一张海报。
 




紧接着查看《我不是药神》的豆瓣评论。还是老样子F12—>NetWork—>XHR,我们发现这里面竟然没有xhr文件,谢天谢地,这说明这些评论数据都
不是通过Ajax来传送数据的。这样工作就简单太多了---------直接通过寻找URL的规律爬取每页的数据并保存
那就直接来吧:
https://movie.douban.com/subject/26752088/comments?status=P
https://movie.douban.com/subject/26752088/comments?start=20&limit=20&sort=new_score&status=P
https://movie.douban.com/subject/26752088/comments?start=40&limit=20&sort=new_score&status=P
https://movie.douban.com/subject/26752088/comments?start=60&limit=20&sort=new_score&status=P
. . .
https://movie.douban.com/subject/26752088/comments?start=n*20&limit=20&sort=new_score&status=P
这样规律就找到了,只需要通过一个变量改变start的值就可以。
接下来直接给出代码:
# -*-coding:utf-8-*- import urllib.request from bs4 import BeautifulSoup import
randomimport time import jieba import wordcloud def getHtml(url): """获取url页面"""
user_agents= [ 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60', 'Opera/8.0
(Windows NT 5.1; U; en)', 'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1)
Gecko/20061208 Firefox/2.0.0 Opera 9.50', 'Mozilla/4.0 (compatible; MSIE 6.0;
Windows NT 5.1; en) Opera 9.50', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0)
Gecko/20100101 Firefox/34.0', 'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN;
rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko)
Version/5.1.7 Safari/534.57.2 ', 'Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko)
Chrome/23.0.1271.64 Safari/537.11', 'Mozilla/5.0 (Windows; U; Windows NT 6.1;
en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16'
, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/30.0.1599.101 Safari/537.36', 'Mozilla/5.0 (Windows NT 6.1; WOW64;
Trident/7.0; rv:11.0) like Gecko', 'Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0
Safari/536.11', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML,
like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER', 'Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)'
, 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko)
Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0', 'Mozilla/4.0 (compatible;
MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E;
SE 2.X MetaSr 1.0) ', "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;
AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/4.0 (compatible;
MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center
PC 5.0; .NET CLR 3.0.04506)", "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5;
AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", "Mozilla/5.0
(compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR
3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64;
Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729;
.NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b;
Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR
3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN)
AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287
c9dfb30)", "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like
Gecko, Safari/419.3) Arora/0.6", "Mozilla/5.0 (Windows; U; Windows NT 5.1;
en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U;
Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko
Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6", "Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like
Gecko) Chrome/19.0.1036.7 Safari/535.20", "Opera/9.80 (Macintosh; Intel Mac OS
X 10.6.8; U; fr) Presto/2.9.168 Version/11.52" ] headers = { 'Cookie': 你的cookie,
'User-Agent': str(random.choice(user_agents)), 'Referer': 'https: //
movie.douban.com / subject / 26752088 / comments?status = P', 'Connection':
'keep-alive' } req = urllib.request.Request(url,headers=headers) req = urllib.
request.urlopen(req) content = req.read().decode('utf-8') return content def
getComment(url): """解析HTML页面""" html = getHtml(url) soupComment = BeautifulSoup(
html, 'html.parser') comments = soupComment.findAll('span', 'short')
onePageComments= [] for comment in comments: # print(comment.getText()+'\n')
onePageComments.append(comment.getText()+'\n') return onePageComments def
wordAnalysis(): f = open(
'C:/Users/Administrator/PycharmProjects/practice1/我不是药神.txt','r',encoding =
'utf-8') content = f.read() f.close() ls = jieba.lcut(content) txt = ' '.join(ls
) w = wordcloud.WordCloud(font_path='c:\windows\Fonts\STZHONGS.TTF', width=1000,
height=700, background_color='white') w.generate(txt) w.to_file('Movie.png') if
__name__== '__main__': f = open('我不是药神.txt', 'a', encoding='utf-8') j = 0 for
page inrange(15): # 豆瓣爬取多页评论需要验证。 url =
'https://movie.douban.com/subject/26752088/comments?start=' + str(20*page) +
'&limit=20&sort=new_score&status=P' print('第%s页的评论:' % (page)) print(url + '\n')
for i in getComment(url): f.write(str(j)) f.write(i) print(j,i) j += 1 time.
sleep(10) print('\n') wordAnalysis()
词云结果如下图所示:
 





在代码里面本文设置了UserAgent池来防止反爬虫,其中需要重点强调的是:注意啦、注意啦、注意啦,注意啦、注意啦、注意啦:
如果在运行代码时遇到这样一个问题:
 




不要着急,以上问题可能有两种可能:

* (1) 你可能遭遇反爬虫:
原因如下:
如果用 urllib.request.urlopen
方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器,操作系统,硬件平台等信息,而缺失这些信息的请求往往都是非正常的访问,例如爬虫.

有些网站验证请求信息中的UserAgent(它的信息包括硬件平台、系统软件、应用软件和用户个人偏好),如果UserAgent存在异常或者是不存在,那么这次请求将会被拒绝(如上错误信息所示)
(当然现在很多网站的反爬虫不单单是通过UserAgent进行验证非正常访问,还会通过cookie、爬虫频率等很多方法去判断验证)
解决办法:
可以通过建立User-Agent池和IP池来伪装自己。
* (2)你没有登录

有些网站必须是注册、登录,然后获取cookie。进而爬取。豆瓣网就是一个很典型的例子,在没有登录的时候,是可以10页的评论数据。一旦超过10页,并且检测到用户没有登录信息,立即回终止爬虫的进行。
所以,在爬取豆瓣电影评论的时候,一定要记得注册账号并登录哦。
<>三、总结


这篇文章是豆瓣电影评论数据的爬取,除了爬取评论数据,还可以爬取评论用户、该用户是否看过电影、评论时间、五星评分等信息。就这篇文章而言,豆瓣数据的爬取相对较为简单,其中介绍了当代码运行时出现了
HTTPError: HTTP Error 403: Forbid这样的问题该怎么解决-----------“千万不要忘了登录账号
”。这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。
 
 


友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信