Python爬虫简单实例——豆瓣电影评论数据的爬取
Posted 呆呆敲代码的阿狸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫简单实例——豆瓣电影评论数据的爬取相关的知识,希望对你有一定的参考价值。
一、 前言
豆瓣网是一家基于用户对于图书、电影和音乐兴趣而搭建的社交网站,由杨勃创立于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 random
import 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 in range(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这样的问题该怎么解决-----------“千万不要忘了登录账号”。这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。
在这里还是要推荐下我自己建的Python学习Q群:249029188,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!
以上是关于Python爬虫简单实例——豆瓣电影评论数据的爬取的主要内容,如果未能解决你的问题,请参考以下文章
Python开发简单爬虫之静态网页抓取篇:爬取“豆瓣电影 Top 250”电影数据