爬取(沈阳)豆瓣影评及创建词云分析--实验报告

爬取(沈阳)豆瓣影评及创建词云分析–实验报告

要是想看最终代码,请点击此处
实验结果展示
【实验时间】:2022.11.09
【实验地点】:沈阳化工大学8号楼
【实 验 人】:是小张张呀zsy
【实验目的】:能熟练实验爬虫技术快速处理网页,并能够将获取数据保存在文件夹中,学会生成词云图
【实验过程】:
1、背景 :豆瓣网是一家集媒体内容、在线购票、用户互动社交、电影衍生品销售等服务的一站式互联网平台。
2、目的:本项目豆瓣电影为爬取目标,主要获取沈阳当前热门电影评论,并绘制词云图。
3、功能:该项目要满足以下四个功能:网页分析、信息提取、网址提取、数据存储。具体如下:
(1)网页信息进行提取。
(2)将网页内容进行解析,提取的内容包括:电影id, 电影名,电影评论。
(3)将爬取的数据保存为在文件或数据库中。
(4)云图可视化评论

4、项目可行性分析
豆瓣具有反爬虫机制(使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。当我们requests.get()时得到不正确的状态码(返回418),此时补充上headers(请求头): 目的是模拟浏览器,欺骗服务器,获取和浏览器一致的内容。所以该项目可行
在这里插入图片描述

程序结构

1.找到豆瓣沈阳电影,根据URL获取整个网页,解析url,筛选目标信息
我们获取网页信息一般都采用requests库,requests库提供了get()函数可以获取相应URL网页信息,再运用Beautifulsoup库进行信息提取,然后筛选出我们所需要的信息。
在这里插入图片描述

2.通过电影id,来获得特定电影影评网址,得到所需影评
我的遗憾和你有关 短评网址:
第一页影评:
https://movie.douban.com/subject/35720861/comments?start=0&limit=20&status=P&sort=new_score
第二页影评:
https://movie.douban.com/subject/35720861/comments?start=20&limit=20&status=P&sort=new_score
第三页影评:
https://movie.douban.com/subject/35720861/comments?start=60&limit=20&status=P&sort=new_score

万里归途 短评网址:
https://movie.douban.com/subject/26654184/comments?start=0&limit=20&status=P&sort=new_score
平凡英雄 短评网址
https://movie.douban.com/subject/35554292/comments?start=0&limit=20&status=P&sort=new_score
通过观察,发现每个电影影评只有电影id是不一样的,那么每次把url中的id信息更换便可以得到该网址信息
每页影评的start是不一样的,找的规律,start每次+20

即:若pp为我们所获得的id,那么将网址中的id(35720861,26654184…)变成’+pp+’即可
用num记录start,每次num+20,获得两页影评,循环两次

url='https://movie.douban.com/subject/'+pp+'/comments?start='+str(num)+'&limit=20&status=P'

由于每次for循环都是获得一个电影的影评,在这里,我先定义了一个列表data_list = [],将每次爬取的影评插入列表后面data_list.append()。
在这里插入图片描述

3.文本处理
再文件中直接存入data_list中的内容会报错,通过查找资料,发现应该是影评的一些特殊符号(如表情,斗图等)不能放入文件中,此时用re.sub()函数来移除特殊符号[\u4e00-\u9fa5]为unicode编码,并且刚好是中文编码的开始和结束的两个值,即只保留了中文汉字
在这里插入图片描述
4.词频统计
在这里插入图片描述

5生成词云图
豆瓣.Png中只有前20个高频词汇,豆瓣2.png是通过词频来生成词云图的

在这里插入图片描述

最终全部代码

import requests
from bs4 import BeautifulSoup
import wordcloud
import jieba
import re
# 请求头  418 - 420# 418就是你爬取的网站有反爬虫机制,我们要向服务器发出爬虫请求,需要添加请求头:headers
urlmain = 'https://movie.douban.com/cinema/nowplaying/shenyang/'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"}
resmain = requests.get(urlmain, headers=headers)
print(resmain.text)
resmain = BeautifulSoup(resmain.text,'html.parser')

idmain_list = []
idmain = resmain.find('div', id="wrapper")
idmain = idmain.find('div', id="content")
idmain = idmain.find('div',class_="grid-16-8 clearfix")
idmain = idmain.find("div", class_="article")
idmain = idmain.find("div", id = "nowplaying")
idmain = idmain.find("div", class_="mod-bd")
idmain = idmain.find("ul", class_="lists")
idmain_list = idmain.find_all("li", class_ ="list-item")
pp = 0
data_list = []for i in idmain_list:
    print(i['id'] + '  ' +i['data-title'] )

print("\n")for i in idmain_list:
    print(i['id'] + '  ' +i['data-title'] )
    pp = i['id']
    num = 0
    while(num < 30):
        url = 'https://movie.douban.com/subject/'+pp+'/comments?start='+str(num)+'&limit=20&status=P'
        print(url)
        num =num + 20
        res = requests.get(url, headers=headers)
        #提取,响应数据
        res = BeautifulSoup(res.text,'html.parser')
        comments = res.find("div", id="comments")
        p_list = comments.find_all("p")
        for i in p_list:
            print(i.find("span").string)
            data_list.append(i.find("span").string)
        print('-'*50)
    print('-' * 50)
    print('\n')
#文本处理
f = open('豆瓣.txt', 'w+')for i in data_list:
   new = re.sub('([^\u4e00-\u9fa5])', '', i)
   f.write(new)
   f.write('\n')

#词频分析#打开文件,读取内容
txt=open("豆瓣.txt").read()#直接使用分词工具进行分词
words=jieba.cut(txt)
stopwords=[]with open("wordcloud_stopwords.txt","r",encoding="utf-8") as f:
    stopwords=f.read()
#开始词频统计
counts={}for word in words:
    if word not in stopwords:
        counts[word]=counts.get(word,0)+1#字典get方法
print(counts)
#将字典转化为列表,为了排序
items=list(counts.items())
#按照词频排序
items.sort()#直接排序
items.sort(key=lambda  x:x[1],reverse=True)
print(items)
#按词频由高到低输出前20
wordsrr=''for i in range(20):
    word,count=items[i]
    print("{0:<10}{1:>5}".format(word,count))#打印词频
    wordsrr+=' '+word#用空格分割每个词汇

print(wordsrr)#词云绘制
c=wordcloud.WordCloud(width=1000,font_path="msyh.ttc",height=700)#font_path#字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = ‘黑体.ttf'
c.generate(wordsrr)#生成词云
c.to_file("豆瓣.png")
c.fit_words(counts)#按照词频来生成词云
c.to_file("豆瓣2.png")

实验结果展示 **1网页信息提取**

在这里插入图片描述

2提取的电影id,电影名称,该电影的评论网址以及该电影的影评
在这里插入图片描述

在这里插入图片描述

3将电影评论保存在了文件夹中(只保留了汉字,去除了其它字符)

4词频统计,并按照词频由高到低输出前20个词
在这里插入图片描述

5词云图
在这里插入图片描述

6按照词频生成的词云图
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值