一、实验目的及要求
1、目的
综合性、创新性实验,熟悉掌握网络数据采集技术的实践应用。
2、内容及要求
本实验为综合性、创新性实验,要求学生通过自选、自拟任务要求的方式,以某个具体案例为入手点,掌握网络数据采集技术的综合性、创新性的应用。
任务(1)应用场景自选、自拟(如电商、寻医问药、贴吧、论坛),通过某个具体案例,展示网络数据采集技术的综合性应用。
一个练习爬虫的专用学习网站>>>>>>>>>非常推荐大家使用,下面是详情信息
利用以上网站,我们进行下面的方向实验:
基于爬虫爬取电影数据的可视化分析
选择意义:
1. 获取实时的电影信息:通过爬虫技术,可以定期从各大电影网站或社交媒体上抓取最新的电影数据,包括电影名称、导演、演员、上映时间、评分等,从而保持数据的时效性。
2. 数据分析和挖掘:通过对电影数据的分析,可以发现一些有趣的规律和趋势,例如热门电影的类型、导演的风格、演员的热度等,为电影制作公司、发行商和投资者提供决策依据。
3. 个性化推荐:根据用户的观影历史和喜好,通过分析电影数据,可以为用户提供个性化的电影推荐,提高用户体验。
4. 市场调研和竞争分析:通过爬取竞争对手的电影数据,可以进行市场调研和竞争分析,了解行业动态和市场份额,为企业制定营销策略提供参考。
>>>>>>>>>可视化展示:将爬取到的电影数据进行可视化处理,如绘制柱状图、折线图、饼图等,直观地展示电影的热度、评分分布、类型比例等信息,帮助用户更快速地理解和分析数据。
第一步我们选择爬取的网址,通过开发者模式查看该网站具体信息
通过发送请求、获取html,使用xpath提取html里面的数据并存到csv
# – coding: gbk –
# -*- coding: utf-8 -*-
# @Time : 2024/7/2 21:13
# @Author : jianjian
# @File : Movie_data.py
# @Software: PyCharm
import requests,csv #请求库和保存库
import pandas as pd #读取csv文件以及操作数据
from lxml import etree #解析html库
from pyecharts.charts import * #可视化库
# 请求的网址
url = 'https://ssr1.scrape.center/page/1'
# 请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
# 发起请求,获取文本数据
reponse = requests.get(url, url, headers=headers)
print(reponse)
# 创建csv文件
with open('电影数据.csv', mode='w', encoding='utf-8', newline='') as f:
# 创建csv对象
csv_save = csv.writer(f)
# 创建标题
csv_save.writerow(['电影名', '电影上映地', '电影时长', '上映时间', '电影评分'])
for page in range(1, 11): # 传播关键1到10页的页数
# 请求的网址
url = 'https://ssr1.scrape.center/page/{}'.format(page)
print('当前请求页数:', page)
# 请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
response = requests.get(url, url, headers=headers, verify=False)
print(response)
html_data = etree.HTML(response.text)
# 获取电影名
title = html_data.xpath(
'//div[@class="p-h el-col el-col-24 el-col-xs-9 el-col-sm-13 el-col-md-16"]/a/h2/text()')
# 获取电影制作地
gbs = html_data.xpath(
'//div[@class="p-h el-col el-col-24 el-col-xs-9 el-col-sm-13 el-col-md-16"]/div[2]/span[1]/text()')
# 获取电影时长
time = html_data.xpath('//div[@class="m-v-sm info"]/span[3]/text()')
# 获取电影上映时间
move_time = html_data.xpath(
'//div[@class="p-h el-col el-col-24 el-col-xs-9 el-col-sm-13 el-col-md-16"]/div[3]/span/text()')
# 电影评分
numder = html_data.xpath('//p[@class="score m-t-md m-b-n-sm"]/text()')
for name, move_gbs, times, move_times, numders in zip(title, gbs, time, move_time, numder):
print('电影名:', name, ' 电影上映地址:', move_gbs, ' 电影时长:', times, ' 电影上映时间:', move_times,
' 电影评分:', numders)
# name,move_gbs,times,move_times,numders
# 写入csv文件
csv_save.writerow([name, move_gbs, times, move_times, numders])
将数据爬取到本地查看内部具体内容
对电影名进行分词以及词频统计,使用jieba分词,nltk词频统计,停用此表.txt可以自己创建一个里面放一些无意义的字,比如:的、不是、不然这些,每个字独占一行.
# -*- coding: utf-8 -*-
# @Time : 2024/7/2 21:19
# @Author : jianjian
# @File : Movie_wordCloud.py
# @Software: PyCharm
import pandas as pd #读取csv文件以及操作数据
from pyecharts.charts import * #可视化库
import jieba
#from win32comext.shell.demos.IActiveDesktop import opts
data=pd.read_csv('电影数据.csv', encoding='utf-8')
#print(data)
title_list = []
for name in data['电影名']:
# 进行精准分词
lcut = jieba.lcut(name, cut_all=False)
# print(lcut)
for i in lcut:
# print(i)
# 去除无意义的词
# 打开停用词表文件
file_path = open('停用词表.txt', encoding='utf-8')#使用jieba分词,nltk词频统计,这里的停用此表.txt可以自己创建一个 里面放无意义的字,比如:的、不是、不然这些,每个字独占一行即可
# 将读取的数据赋值给stop_words变量
stop_words = file_path.read()
# 遍历后的值 如果没有在停用词表里面 则添加到net_data列表里面
if i not in stop_words:
title_list.append(i)
# print(title_list)
# 计算词语出现的频率
from nltk import FreqDist # 该模块提供了计算频率分布的功能
# FreqDist对象将计算net_data中每个单词的出现频率,,并将结果存储在freq_list中
freq_list = FreqDist(title_list)
print(freq_list) # 结果:FreqDist 有1321个样本和5767个结果
# 该方法返回一个包含最常出现单词及其出现频率的列表。将该列表赋值给most_common_words变量。
most_common_words = freq_list.most_common()
print(most_common_words) # 结果:
#### #####
######## <<<<词云可视化>>> ########
#### #####
# 创建一个 WordCloud类(词云) 实例
word_cloud = WordCloud()
# 添加数据和词云大小范围 add('标题', 数据, word_size_range=将出现频率最高的单词添加到词云图中,并设置单词的大小范围为 20 到 100。)
word_cloud.add('词云图', most_common_words, word_size_range=[20, 100])
# # 渲染词云图
word_cloud.render()
# 也可以生成html文件观看
word_cloud.render('电影数据词云图.html')
# 设置全局选项,包括标题
#word_cloud.set_global_opts(title_opts=opts.TitleOpts(title='电影数据词云图'))
该代码中的停词表可以自己填写几个,电影介绍中很少有过多无用词:如下:
若以后会用到,例如文章篇级的数据可以使用整理好的:
如:
github上包括哈工大停用词、四川大学机器智能实验室停用词、百度停用词、中文停用https://github.com/goto456/stopwords
以及最全中文停用词表(1893)https://blog.csdn.net/shijiebei2009/article/details/39696571进行整合得到新的中文停用词表,总共2462个
具体参考>>>>>>>>停词表原文链接:https://blog.csdn.net/qq_33772192/article/details/91886847
词频统计结果如下:
进行词云图可视化:>>>>>>原作者词云图进行了渲染,更加好看>>>>>>>>>原作者地址<<<<<<<<<
原作者是使用ipynb文件,是在 vscode安装jupyter插件下,进行的渲染,字体的颜色更加绚丽多彩
本文是在pycharm中运行,无插件,专业版有插件
对电影时长进行统计并做柱形图可视化,可以通过统计不同电影的时长,可以了解市场上电影的平均时长、最长和最短电影的时长等信息,从而分析电影类型、风格或导演的风格偏好等,对电影时长进行统计并做折线图可视化,提供决策依据:对于电影制作公司、发行商和投资者来说,了解电影时长的分布情况可以帮助他们制定更合理的电影制作计划,例如决定拍摄哪种类型的电影、确定电影的长度等。用户选择参考:对于观众来说,了解电影时长的分布情况可以帮助他们更好地安排观影时间
# -*- coding: utf-8 -*-
# @Time : 2024/7/3 9:11
# @Author : jianjian
# @File : Analysis of movie_time.py
# @Software: PyCharm
import pandas as pd #读取csv文件以及操作数据
from lxml import etree #解析html库
from pyecharts.charts import * #可视化库
data=pd.read_csv('电影数据.csv', encoding='utf-8')
#################### ################
####################<<<<<电影时长数据柱形图可视化>>>>>>################
#################### ################
# 电影时长 去除分钟和,号这个 转为int 然后再转为列表 只提取20条数据,总共100条
move_time = data['电影时长'].apply(lambda x: x.replace('分钟', '').replace(',', '')).astype('int').tolist()[0:20]
# print(move_time)
# 电影名 只提取20条数据
move_name = data['电影名'].tolist()[0:20]
# print(move_name)
# 创建Bar实例
Bar_obj = Bar()
# 添加x轴数据标题
Bar_obj.add_xaxis(move_name)
# 添加y轴数据
Bar_obj.add_yaxis('电影时长数据(单位:分钟)', move_time)
# 设置标题
Bar_obj.set_global_opts(title_opts={'text': '电影时长数据柱形图可视化'})
# 显示图表
Bar_obj.render("电影时长数据柱形图可视化.html")
#
#################### ################
####################<<<<<电影时长数据折线图可视化>>>>>>################
#################### ################
# 去除分钟和,号这个 转为int 然后再转为列表 只提取25条数据
move_time = data['电影时长'].apply(lambda x: x.replace('分钟', '').replace(',', '')).astype('int').tolist()[0:25]
# print(move_time)
# 电影名 只提取25条数据
move_name = data['电影名'].tolist()[0:25]
# print(move_name)
# 创建Bar实例
Bar_obj = Line()
# 添加x轴数据标题
Bar_obj.add_xaxis(move_name)
# 添加y轴数据
Bar_obj.add_yaxis('电影时长数据(单位:分钟)', move_time)
# 设置标题
Bar_obj.set_global_opts(title_opts={'text': '电影时长数据折线图可视化'})
# 显示图表
Bar_obj.render("电影时长数据折线图可视化.html")
可以看到
统计每个国家电影上映的数量,并对对每个国家电影上映数量饼图可视化,人们可以迅速了解不同国家在全球电影市场中的占比,从而分析各国电影产业的竞争力。这种可视化方式不仅便于比较各国电影数量的差异,还能帮助观众和从业者快速把握国际电影市场的格局。同时,这也为电影制作公司、发行商和投资者提供了重要的市场信息,有助于制定更加精准的市场策略。
# -*- coding: utf-8 -*-
# @Time : 2024/7/3 9:08
# @Author : jianjian
# @File : Analysis of film release regions.py
# @Software: PyCharm
import jieba
import pandas as pd #读取csv文件以及操作数据
from pyecharts.charts import * #可视化库
data=pd.read_csv('电影数据.csv', encoding='utf-8')
title_list = []
# 遍历电影上映地这一列
for name in data['电影上映地']:
# 进行精准分词
lcut = jieba.lcut(name, cut_all=False)
# print(lcut)
for i in lcut:
# print(i)
# 去除无意义的词
# 打开停用词表文件
file_path = open('停用词表.txt', encoding='utf-8')
# 将读取的数据赋值给stop_words变量
stop_words = file_path.read()
# 遍历后的值 如果没有在停用词表里面 则添加到net_data列表里面
if i not in stop_words:
title_list.append(i)
# print(title_list)
# 计算词语出现的频率
from nltk import FreqDist # 该模块提供了计算频率分布的功能
# FreqDist对象将计算net_data中每个单词的出现频率,,并将结果存储在freq_list中
freq_list = FreqDist(title_list)
print(freq_list) # 结果:FreqDist 有1321个样本和5767个结果
# 该方法返回一个包含最常出现单词及其出现频率的列表。将该列表赋值给most_common_words变量。
most_common_words = freq_list.most_common()
print(most_common_words) # 结果:('单人这个词',出现185次)
# 电影名 使用列表推导式来提取most_common_words中每个元素中的第一个元素,即出现次数,然后将它们存储在一个新的列表中
map_data_title = [count[0] for count in most_common_words]
print(map_data_title)
# 电影数
map_data = [count[1] for count in most_common_words]
print(map_data)
# 获取map_data_title的长度,决定循环次数,赋值给遍历i 在通过下标取值
result = [[map_data_title[i], map_data[i]] for i in range(len(map_data_title))]
print(result)
# 创建Pie实例
chart = Pie()
# 添加标题和数据 radius=['圆形空白处百分比','色块百分比(大小)'] 可不写
chart.add('电影上映数饼图(单位:个)', result, radius=['50%', '60%'])
# 显示
chart.render("电影上映地区饼状图占比分析.html")
最终看到
通过实训过程,深入了解和学习了Scrapy爬虫框架提供了丰富的功能,包括数据抓取、数据处理、数据存储等,可以满足各种复杂的网络爬虫需求。采用了异步IO(Twisted)框架,能够高效地处理大量的并发请求,提高爬取速度。提供了丰富的中间件和扩展机制,可以根据需要定制和扩展爬虫的功能。提供了简洁的API和命令行工具,使得编写和维护爬虫变得简单。Scrapy有详细的官方文档和社区支持,方便用户学习和解决问题。支持多种编程语言,如Python、Ruby、JavaScript等,方便开发者根据自己的喜好选择合适的语言进行开发。y拥有庞大的用户社区和丰富的第三方库,可以方便地与其他工具和库集成,如Selenium、BeautifulSoup等。
requests库的API设计简洁,易于理解和使用。支持多种HTTP请求方法(GET、POST、PUT、DELETE等),并可以轻松处理cookies和会话。会自动处理响应内容的编码,无需手动解码。可以设置请求超时时间,避免长时间等待无响应的请求。提供了丰富的异常类,方便捕获和处理网络错误。可以配置是否验证服务器的SSL证书,提高安全性。
BeautifulSoup库使用C语言编写的解析器,解析速度较快。容错性强,即使HTML文档格式不规范,BeautifulSoup也能正确解析。可以使用CSS选择器或XPath表达式来查找特定的元素。可以通过自定义过滤器和函数来扩展其功能。
Selenium是一个用于自动化Web应用程序测试的工具,它可以模拟用户操作浏览器的行为。而Chromedriver是Google Chrome浏览器的驱动程序,它允许Selenium与Chrome浏览器进行交互。了掌握Selenium和Chromedriver的基本使用,通过实际的项目来应用Selenium和Chromedriver,例如爬取网站数据、自动化测试等。更好地理解和掌握这两个工具的使用。
以及通过爬虫得到的数据进行可视化,可以直观展示数据:将爬取到的数据以图表、图形等形式展示出来,可以更直观地理解和分析数据。可以更容易地发现数据中的趋势和模式。可以为决策者提供更直观的信息,帮助他们做出更准确的决策。可视化数据可以帮助分析师更快地发现异常值、离群点等重要信息,从而提高数据分析的效率。通过将数据以吸引人的方式展示出来,可以吸引更多观众的注意力,提高信息的传达效果。例如,在社交媒体上发布数据可视化内容,可以吸引更多用户关注和分享,具有很重要的意义。
最后:本次小学期的健康数据采集技术综合实验实训的项目工程结构如下:
本次小学期健康数据采集技术综合实验课程实训的相关代码具体如下:
Github 链接 :https://github.com/Moment-jianjain/Spyder.git
百度网盘 链接:https://pan.baidu.com/s/1_pp9J2QLalwCDxrxl9uZmg?pwd=1234
提取码:1234
百度网盘二维码直接查看:
希望有帮助,可以点个小赞赞!!!!!