python课程设计——当当网Python图书数据分析
一、数据获取
本次项目数据来源为爬虫获取,目标为为当当网上关于python的书籍
爬虫主要思路:通过观察当当网,观察结构,选用适合的方法。先进行单页的数据爬取,再进行多页爬取;解析方法为xpath方法,爬取目标为:书名、价格、作业、出版社、出版时间、商品链接、评论数量;最后将爬取的数据保存到csv文件当中。
爬虫代码如下:
import requests
from lxml import etree
import re
import csv
def get_page():# 数据的多页爬取,经过观察,所有页面地址中,有一个唯一的参数page_index发生改变# 通过对参数page_index的for循环,遍历每一页的页面,实现多页爬取for page in range(1, 101):url = 'http://search.dangdang.com/?key=python&act=input&page_index=1' + str(page + 1) + '#J_tab'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}response = requests.get(url=url, headers=headers)parse_page(response)# 可以在操作页面实时观察爬取的进度print('page %s' % page)
def parse_page(response):# 通过etree将图书的七项信息封装为一条数据,保存到data列表当中tree = etree.HTML(response.text)li_list = tree.xpath('//ul[@class="bigimg"]/li')for li in li_list:data = []try:# 通过xpath的方法对所需要的信息进行解析# 1、获取书的标题,并添加到列表中title = li.xpath('./a/@title')[0].strip()data.append(title)# 2、获取价格,并添加到列表中price = li.xpath('./p[@class="price"]/span[1]/text()')[0]data.append(price)# 3、获取作者,并添加到列表中author = ''.join(li.xpath('./p[@class="search_book_author"]/span[1]//text()')).strip()data.append(author)# 4、获取出版社publis = ''.join(li.xpath('./p[@class="search_book_author"]/span[3]//text()')).strip()data.append(publis)# 5、获取出版时间,并添加到列表中time = li.xpath('./p[@class="search_book_author"]/span[2]/text()')[0]pub_time = re.sub('/', '', time).strip()data.append(pub_time)# 6、获取商品链接,并添加到列表中commodity_url = li.xpath('./p[@class="name"]/a/@href')[0]data.append(commodity_url)# 7、获取评论数量,并添加到列表中comment = li.xpath('./p[@class="search_star_line"]/a/text()')[0].strip()data.append(comment)except:passsave_data(data)def save_data(data):writer.writerow(data)
def main():key = 'python书籍222' # input('Please input key:')
get_page(key)
# 将所有的数据储存到csv文件当中
fp = open('python书籍3.csv', 'w', encoding='utf-8-sig', newline='')
writer = csv.writer(fp)
header = ['书名', '价格', '作者', '出版社', '出版时间', '商品链接', '评论数量']
writer.writerow(header)
main()
fp.close()
爬虫部分结果展示:
二、数据整理分析
本项目对价格、出版社以及评论进行分析
1、价格
(1)数据预处理
通过观察爬取下来的数据发现,部分数据存在空值,影响分析,所以多价格列进行简单的数据预处理操作,将有空值的整条数据删除
利用pandas库中的null函数查询是否有空值,有空值就将其整条数据删除
import pandas as pd
# 读取文件
df = pd.read_csv(r'D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\python书籍.csv')
# 对价格列进行操作
index = df['价格'].notnull()
df = df[index]
# 将处理好的文件保存为python书籍2
df.to_csv(r'D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\python书籍2.csv')
(2)数据分类操作
然后对价格列进行分类,将其分为三个类别,分别为价格在30元以下的,价格在30元到70元之间的,价格在70元以上的,注意数据的数据的类型是什么,是否需要类型的转换。
import csv
# 打开存放书籍的文档并读取
file = open('D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\python书籍2.csv', encoding='utf-8')
fileReader = csv.reader(file)
data = []
# s1、s2、s3分别为30元以下,30到70元,70元以上
s1 = []
s2 = []
s3 = []
filedata = list(fileReader)
for i in filedata:# 选中价格的一列m = i[1:2]data.append(''.join(m))
for m in range(1,6000):# 将价格强制转换为float类型if float(data[m]) < 30.00:# 将价格低于30元的存放到s1s1.append(data[m])elif float(data[m]) > 70.00:# 价格将高于70元的存放到s3s3.append(data[m])else:# 将价格在30到70元的存放到s2s2.append(data[m])
# 同时输出s1、s2、s3的长度来代表其数量
print(len(s1))
print(len(s2))
print(len(s3))
(3)数据的聚类算法
同时对价格进行一个聚类算法的运用,主要作用为练习使用聚类算法
import jieba
import collections
import wordcloud
import matplotlib.pyplot as plt# 存放去停用词
stopword_list = []
# 存放分词
object_list = []
# 去停用词
for word in open("D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\stopwords.txt", 'rb'):stopword_list.append(word.strip())
# 文本分词
fn = open("D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\Comment_Data.txt", "rb").read()
seg_list_exaut = jieba.cut(fn)
for i in seg_list_exaut:if i.encode("utf-8") not in stopword_list:object_list.append(i)
# 词频统计、排序
word_counts = collections.Counter(object_list)
word_counts_top10 = word_counts.most_common(10)
print(word_counts_top10)
# 词图云展示
wc = wordcloud.WordCloud(font_path=r'C:\Windows\Fonts\simhei.ttf',background_color="white",margin=5, width=1000,height=800,max_words=1000,max_font_size=200)
wc.generate_from_frequencies(word_counts)
wc.to_file('DangDangWang_WordCloud_show.jpg')
plt.imshow(wc)
plt.axis("off")
plt.show()
聚类算法的结果
2、出版社
对于出版社的分析主要为统计出版社的数量,并对每个出版社出版关于python的书籍的数量进行统计分析,因此需要对数据进行去重处理
(1)数据预处理
数据的去重处理
file = open('D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\python书籍.csv', encoding='utf-8')
fileReader = csv.reader(file)
filedata = list(fileReader)
data = []for i in filedata:# 数据表第四列为出版社t = i[3:4]data.append(''.join(t))# 去重
punlish_Number = len(set(data))
print('出版社共'+str(punlish_Number)+'个')
punlish_data = list(set(data))
(2)统计
对出版社的种类以及数量进行统计
# 统计出版社
dict = {}
for i in data:
dict[i] = dict.get(i,0)+1
# 输出所有的出版社以及个数
print(dict)
# print(len(dict))
结果展示
由结果可知出版社共有50个,选取前十名的出版社进行保存
3、评论数量
通过观察处理,发现存在很多数据没有评论,因此需要进行预处理
对没有评论数量的数据进行删除操作
import pandas as pd
# 读取文件
df = pd.read_csv(r'D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\python书籍.csv')
# 对价格列进行操作
index = df['评论数量'].notnull()
df = df[index]
df.to_csv(r'D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\python书籍3.csv')
结果展示
对评论数量进行排序,选取评论数量前十的书籍进行展示
三、数据可视化
1、价格
结果展示
代码
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
labels = '30元以下', '30到70元', '70元以上'
fraces = [125, 3427, 2447]
# 使画出来的图形为标准圆
plt.axes(aspect=1)
# 突出分离出数量最多的第二部分
explode = [0, 0.1, 0]
colors = ['skyblue', 'pink', 'yellow']
plt.pie(x=fraces,labels=labels,colors=colors,# 显示比例autopct='%0f%%',explode=explode,# 显示阴影,使图形更加美观shadow=True)
plt.show()
2、出版社
结果展示
代码
import matplotlib.pyplot as plt# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = Falsenum_list = [1530, 1390, 1255, 625,194,100,99,95,93,93]
name_list = ['人民邮电出版社','机械工业出版社','电子工业出版社','清华大学出版社','北京大学出版社','中国水利水电出版社','中国铁道出版社','东南大学出版社','华中科技大学出版社','重庆大学出版社']
plt.barh(range(len(num_list)),num_list,align="center",# 设置标签tick_label=name_list,)
plt.title('出版社前十柱状图')
plt.show()
3、评论
本项分析选取评论数量第一的书,将其所有的评论进行了爬取,并制作词云图进行展示
评论爬取代码
file = open('D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\python书籍4.csv', encoding='utf-8')
fileReader = csv.reader(file)
filedata = list(fileReader)
books_number = []
for i in filedata:t = (i[5:6])books_number.append(''.join(t))
print(books_number)
for j in range(1, 6):for i in range(1, 21):url = 'http://product.dangdang.com/index.php?r=comment%2Flist&productId=' + books_number[j] + \ '&categoryPath=01.54.06.19.00.00&mainProductId=25580336&mediumId=0&pageIndex=' + str(i) + \ '&sortType=1&filterType=1&isSystem=1&tagId=0&tagFilterCount=0&template=publish'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/''87.0.4280.88 Safari/537.36'}print(url)req = urllib.request.Request(url, headers=headers)response = urllib.request.urlopen(req)unicodester = json.load(response)html = unicodester["data"]["list"]["html"]pattern = re.compile('<span><a href.*?>(.*?)<\/a><\/span>', re.S)comments = re.findall(pattern, html)print("正在爬取第" + str(i) + "页评论")with open('Comment_Data.txt', 'a') as txt:txt.write(str(comments) + "\n")
结果展示
因为我的停用词没有筛选好,导致制作出来的词云图不够规范,大家可以根据自己的需要对停用词进行添加
代码
import jieba
import collections
import wordcloud
import matplotlib.pyplot as plt# 存放去停用词
stopword_list = []
# 存放分词
object_list = []
# 去停用词
for word in open("D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\stopwords.txt", 'rb'):stopword_list.append(word.strip())
# 文本分词
fn = open("D:\pythonApp\pyproject\我的python\网络大数据采集\dangdang\Comment_Data.txt", "rb").read()
seg_list_exaut = jieba.cut(fn)
for i in seg_list_exaut:if i.encode("utf-8") not in stopword_list:object_list.append(i)
# 词频统计、排序
word_counts = collections.Counter(object_list)
word_counts_top10 = word_counts.most_common(10)
print(word_counts_top10)
# 词图云展示
wc = wordcloud.WordCloud(font_path=r'C:\Windows\Fonts\simhei.ttf',background_color="white",margin=5, width=1000,height=800,max_words=1000,max_font_size=200)
wc.generate_from_frequencies(word_counts)
wc.to_file('DangDangWang_WordCloud_show.jpg')
plt.imshow(wc)
plt.axis("off")
plt.show()
四、总结
本次项目做的比较仓租,看上去有些粗糙,有些细节和部分没有完全实现,以后有时间会对本项目进行完善翻新。同时欢迎大家与我进行交流,希望本次项目内容会对大家有所帮助。
参考:https://blog.csdn.net/qq_48967283/article/details/120898557
python课程设计——当当网Python图书数据分析相关推荐
- 在当当买了python怎么下载源代码-Python爬取当当网最受欢迎的 500 本书
想看好书?想知道哪些书比较多人推荐,最好的方式就是看数据,接下来用 Python 爬取当当网五星图书榜 TOP500 的书籍,或许能给我们参考参考! Python爬取目标 爬取当当网前500本受欢迎的 ...
- python爬虫beautifulsoup爬当当网_利用python爬虫可视化分析当当网的图书数据!
导语 这周末就分享个小爬虫吧.利用Python爬取并简单地可视化分析当当网的图书数据. 开发工具 Python版本:3.6.4 相关模块: requests模块: bs4模块: wordcloud模块 ...
- 利用python爬虫可视化分析当当网的图书数据
导语 这周末就分享个小爬虫吧.利用Python爬取并简单地可视化分析当当网的图书数据. 开发工具 **Python版本:**3.6.4 相关模块: requests模块: bs4模块: wordclo ...
- Python课程设计-图书管理系统
Python课程设计-图书管理系统 摘要 第一章 绪论 1.1 开发环境及技术 1.2 系统实现功能描述 第二章 功能详细设计与实现 2.1 系统框架各层次实现 2.1.1 可视页面设计 2 数据库设 ...
- python课程设计博客网_python 课程设计
原博文 2019-12-09 14:56 − 泉州信息工程学院 软件学院 课程设计报告书 课 程 名: python课程设计 课程设计项目名称: &nb... 相关推荐 2019-09-28 ...
- Python课程设计大作业:获取比赛数据并进行机器学习智能预测NBA的比赛结果
前言 该篇是之前遗漏的大三上的Python课程设计.刚好今天有空就补发了一篇文章.全部的代码在最后附录中.爬虫类的代码直接全部放到一起了,读者可以自行研究.百度网盘可以私聊我进行获取. 一.课程设计项 ...
- 北京交通大学Python课程设计大作业(四)——典籍词频统计
北京交通大学Python课程设计大作业(四)--典籍词频统计 文章目录 北京交通大学Python课程设计大作业(四)--典籍词频统计 一.词频统计任务介绍 二.典籍词频统计python源代码如下 三. ...
- 夏敏捷第29本著作《Python课程设计》(微课视频版)
Python课程设计-微课视频版 本书以Python 3.7为编程环境,逐步展开Python语言教学,是一本面向广大编程学习者的程序设计类图书.本书以案例为驱动介绍知识点,将Python知识点分解到不 ...
- python网络爬虫课程设计题目_山东建筑大学计算机网络课程设计《基于Python的网络爬虫设计》...
山东建筑大学计算机网络课程设计<基于Python的网络爬虫设计> 山东建筑大学 课 程 设 计 成 果 报 告 题 目: 基于Python的网络爬虫设计 课 程: 计算机网络A 院 (部) ...
- Python课程设计:图书馆管理系统
图书馆管理系统: 基于python系统 引用库进行操作 系统主要实现: 添加书 删除书 借书 还书 查询图书信息 查询马上要归还的图书信息 按照借阅次序排序 源码简介: 对已图书信息进行更新操作,包括 ...
最新文章
- 我发现了一个非常酷的软件,用自然语言编程!
- V5SHOP网店系统V 8.0 仿京东模板
- FAST UA API
- JavaScript创建对象几种形式
- 如何为SharePoint添加一个简单地SMTP邮件发送服务器?
- 跟踪oracle中sql语句运行过程及相关知识拓展
- -Visual Studio 2010- IntelliTrace(智能跟踪)优化c盘
- javascript鼠标效果
- 什么是代码评审(Code Review)
- pl sql面试题_PL SQL面试问答
- VB.net chart 控件使用
- [Android] 【极其罕见】【安卓】视频转换器【支持18种格式转换!】
- Qt学习(一)ui界面的设计
- 微信小程序开发之动图小游戏是实现(代码篇)
- Nginx灰度升级实现说明
- JAVA 将byte数组类型的图片转换成换成JPEG格式
- VMware View中智能卡和证书身份验证
- 火车票服务端集成总结
- GitHub上传教程,图文并茂
- html 语言怎么弄英语,HTML语言,HTML language,音标,读音,翻译,英文例句,英语词典