100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > python课程设计——当当网Python图书数据分析

python课程设计——当当网Python图书数据分析

时间:2022-08-26 08:19:33

相关推荐

python课程设计——当当网Python图书数据分析

一、数据获取

本次项目数据来源为爬虫获取,目标为为当当网上关于python的书籍

爬虫主要思路:通过观察当当网,观察结构,选用适合的方法。先进行单页的数据爬取,再进行多页爬取;解析方法为xpath方法,爬取目标为:书名、价格、作业、出版社、出版时间、商品链接、评论数量;最后将爬取的数据保存到csv文件当中。

爬虫代码如下:

import requestsfrom lxml import etreeimport reimport csvdef get_page():# 数据的多页爬取,经过观察,所有页面地址中,有一个唯一的参数page_index发生改变# 通过对参数page_index的for循环,遍历每一页的页面,实现多页爬取for page in range(1, 101):url = '/?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书籍2df.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 jiebaimport collectionsimport wordcloudimport 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'] = Falselabels = '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 = '/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 = pile('<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 jiebaimport collectionsimport wordcloudimport 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()

四、总结

本次项目做的比较仓租,看上去有些粗糙,有些细节和部分没有完全实现,以后有时间会对本项目进行完善翻新。同时欢迎大家与我进行交流,希望本次项目内容会对大家有所帮助。

参考:/qq_48967283/article/details/120898557

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。