我用Python爬取了豆瓣影评,成功后居然发现了一个惊人的秘密.........
大家好,我是IT界搬运喵。
相信大家在工作无聊时,总想掏出手机,看看电影刷刷视频。更加是夜深人静的时候,总是按耐不住自己的内心想要去看看小电影,当然我可没有开车。我说的是好电影,豆瓣高分电影,自己想歪的时候可不要怪我。
但是看电影之前,都想会简单的了解一下这部电影讲的是什么剧情等等(我真没有开车!!!)所以我今天就来带你爬取一下豆瓣影评!
前言
利用利用requests+xpath爬取豆瓣影评,废话不多说。
让我们愉快地开始吧~
开发工具
Python版本:3.6.8
相关模块:
requests模块;
jieba模块;
pandas模块
numpy模块
pyecharts模块;
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
前期准备
1.获取页面内容
# 爬取页面 url\ douban_url = 'https://movie.douban.com/subject/26647117/comments?status=P'\ # requests 发送请求\ get_response = requests.get(douban_url)\ # 将返回的响应码转换成文本(整个网页)\ get_data = get_response.text2.分析页面内容,获取我们想要的内容
- 浏览器中打开我们要爬取的页面
- 按F12进入开发者工具,查看我们想要的数据在哪里
- 这里我们只要 评论人+评论内
3.分析我们获取的 xpath值
'/html/body/div[3]/div[1]/div/div[1]/div[4]/**div[1]** /div[2]/h3/span[2]/a' '/html/body/div[3]/div[1]/div/div[1]/div[4]/**div[2]** /div[2]/h3/span[2]/a' '/html/body/div[3]/div[1]/div/div[1]/div[4]/**div[3]** /div[2]/h3/span[2]/a'通过观察我们发现,这几个xpath只有细微不同,上面加粗的部分已数加的格式改变,所以我们要爬取所有的 commentator(评论者),只需把xpath改为:
'/html/body/div[3]/div[1]/div/div[1]/div[4]/**div**/div[2]/h3/span[2]/a'即不要后面的序号,当我们查询时,会自动捕获类似的xpath。
- 同样的分析,我们可以得到评论内容的xpath为: # (跟在上面代码后)解析页面,并输出获取内容\
a = etree.HTML(get_data)\
commentator = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a/text()')\
comment_content = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p/text()')\
# 解析获取内容,去除多余内容\
for i in range(0,len(files)):\print(commentator[i]+'说:')\files[i].strip(r'\n')\files[i].strip(' ')\print(comment_content[i])
运行结果
实现翻页,并把评论人和评论内容存入csv文件
翻页1:
和前面分析xpath不同,我们只要找出每页之间url的不同之处和规律即可。
# start 属性表示开始位置\ turn_page1 = 'https://movie.douban.com/subject/26647117/comments?status=P'\ turn_page2 = 'https://movie.douban.com/subject/26647117/comments?start=20&limit=20&sort=new_score&status=P'\ turn_page3 = 'https://movie.douban.com/subject/26647117/comments?start=40&limit=20&sort=new_score&status=P'\ turn_page4 = 'https://movie.douban.com/subject/26647117/comments?start=60&limit=20&sort=new_score&status=P'观察发现,除了第一个,每个url就只有 start的值不同,而且每次增加20,上面已经说了start属性,通过观察我们也不难发现,每个页面只有20条评论,这个是由 limit这个属性控制的(小编已经试过,人为改动是没有用的,估计是豆瓣的反爬,但并不影响我们),我这里想说明的是这个start的值之所以会以20为增量,就是这个 limit 控制的。
翻页2:
# 获取评论总数\comment_counts = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/ul/li[1]/span/text()')\comment_counts = int(comment_counts[0].strip("看过()"))\# 计算出总的的页面数(每页有20条评论)\page_counts = int(comment_counts/20)\# 请求访问,并把爬取数据存入csv文件\for i in range(0,page_counts):\turn_page_url = 'https://movie.douban.com/subject/26647117/comments?start={}&limit=20&sort=new_score&status=P'.format(i*20)\get_respones_data(turn_page_url)在完成上面之前,我们肯定要把之前写的代码进行修改,让代码看起,我们可以把前面写的代码封装成一个函数get_respones_data(),传入一个访问url参数,获得返回的HTML。
代码实现
import requests\ from lxml import etree\ import pandas as pd\ def get_respones_data(douban_url = 'https://movie.douban.com/subject/26647117/comments?status=P'):\# requests 发送请求\get_response = requests.get(douban_url)\# 将返回的响应码转换成文本(整个网页)\get_data = get_response.text\# 解析页面\a = etree.HTML(get_data)\return a\first_a = get_respones_data()\# 翻页\comment_counts = first_a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/ul/li[1]/span/text()')\comment_counts = int(comment_counts[0].strip("看过()"))\page_counts = int(comment_counts / 20)\ #小编已经测试过了,如果没有登入的话最多只能访问10个页面,也就是200条评论\ #下一期小编将教大家如何应对反爬\for i in range(0, page_counts+1):\turn_page_url = 'https://movie.douban.com/subject/26647117/comments?start={}&limit=20&sort=new_score&status=P'.format(\i * 20)\print(turn_page_url)\a = get_respones_data(turn_page_url)\# 获取评论人和评论内容\commentator = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/h3/span[2]/a/text()')\comment_content = a.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/div/div[2]/p/text()')\# 解析内容,并存入csv文件\content = [' ' for i in range(0, len(commentator))]\for i in range(0, len(commentator)):\comment_content[i].strip(r'\n')\comment_content[i].strip(' ')\content_s = [commentator[i],comment_content[i]]\content[i] = content_s\name = ['评论人','评论内容']\file_test = pd.DataFrame(columns=name, data=content)\if i == 0:\file_test.to_csv(r'H:\PyCoding\FlaskCoding\Test_all\test0609\app\comment_content.cvs',encoding='utf-8',index=False)\else:\file_test.to_csv(r'H:\PyCoding\FlaskCoding\Test_all\test0609\app\comment_content.cvs',mode='a+',encoding='utf-8',index=False)数据可视化
安装新模块
pip install jieba\ pip install re\ pip install csv\ pip install pyecharts\ pip install numpy解析数据
1 with codecs.open(r'H:\PyCoding\FlaskCoding\Test_all\test0609\app\comment_content.cvs', 'r', 'utf-8') as csvfile:\ 2 content = ''\ 3 reader = csv.reader(csvfile)\ 4 i =0\ 5 for file1 in reader:\ 6 if i == 0 or i ==1:\ 7 pass\ 8 else:\ 9 content =content + file1[1]\ 10 i = i +1\ 11 # 去除所有评论里多余的字符\ 12 content = re.sub('[,,。. \r\n]', '', content)分析数据
# 切词,将整个评论分解成一个个的词语\ segment = jieba.lcut(content)\ words_df = pd.DataFrame({'segment': segment})\ # quoting=3 表示stopwords.txt里的内容全部不引用\ stopwords = pd.read_csv(r"H:\PyCoding\FlaskCoding\Test_all\test0609\app\stopwords.txt", index_col=False, quoting=3, sep="\t", names=['stopword'], encoding='utf-8')\ words_df = words_df[~words_df.segment.isin(stopwords.stopword)]\ # 计算每个词语重复出现次数\ words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数": numpy.size})\ words_stat = words_stat.reset_index().sort_values(by=["计数"], ascending=False)数据可视化
1 test = words_stat.head(1000).values\ # 获取所有词语\ 2 words = [test[i][0] for i in range(0,len(test))]\ # 获取词语对于的出现次数\ 3 counts = [test[i][1] for i in range(0,len(test))]\ 4wordcloud = WordCloud(width=1300, height=620)\ # 生成词云图\ 5 wordcloud.add("爆裂无声", words, counts, word_size_range=[20, 100])\ 6 wordcloud.render()效果展示
好啦。词云也就出来啦!
总结一下:Python爬虫实战----------requests+xpath模块
总结完毕,大家学会了吗
总结
以上是生活随笔为你收集整理的我用Python爬取了豆瓣影评,成功后居然发现了一个惊人的秘密.........的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 微信小程序-在使用加速器数据事件后移除的
- 下一篇: python第三方库大概有多少人口_py