今天暑期实践的最终项目就正式结束了,下面来进行一下总结
首先是汇总一下代码
爬虫代码
from bs4 import BeautifulSoup
import re
import urllib.request,urllib.error
import xlwt
def main():
baseurl = "https://book.douban.com/top250?start="
#爬取网页,解析数据
datalist = getdata(baseurl)
savepath = r"豆瓣图书Top250.xls"
#保存数据
saveData(datalist, savepath)
#askURL(baseurl)
#图书名字
findtitle = re.compile(r'<a href=.*title="(.*)">')
#详细信息
findinf = re.compile(r'<p class="pl">(.*)</p>')
#评分
findscr = re.compile(r'<span class="rating_nums">(.*)</span>')
#概述
findinq = re.compile(r'<span class="inq">(.*)</span>')
#爬取网页
def getdata(baseurl):
datalist = []
for i in range(0, 10): #查询十次
url = baseurl + str(i*25)
html = askURL(url) #保存源码
#print(html)
#逐一解析数据
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('tr', class_="item"): #查找符号要求的字符串
#print(item) #测试
data = []
item = str(item)
#图书名字
title = re.findall(findtitle,item)[0]
data.append(title.strip())
#详细信息
inf = re.findall(findinf, item)
data.append(inf)
#评分
scr = re.findall(findscr, item)
data.append(scr)
#概述
inq = re.findall(findinq, item)
data.append(inq)
datalist.append(data)
return datalist
#得到一个URL网页内容
def askURL(url):
head = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}
request = urllib.request.Request(url, headers=head)
html = ""
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
#print(html)
return html
#保存数据
def saveData(datalist, savepath):
print('save')
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('sheet1', cell_overwrite_ok=True)
col = ('图书名字', '详细信息', '评分', '概述')
for i in range(0, 4):
sheet.write(0, i, col[i])
for i in range(0, 250):
print(f"第{i+1}条")
data = datalist[i]
for j in range(0, 4):
sheet.write(i+1, j, data[j])
book.save(savepath)
main()
print('爬取完毕!')
数据切割代码
import pandas as pd
pd.set_option('display.max_columns', 500) #设置显示列数
pd.set_option('display.width', 1000) #设置显示宽度
pd.set_option('display.max_rows', 500) #设置显示行数
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('豆瓣图书Top250.xls')
df.index = range(1, 251) #重新设置索引
#分割详细信息
series = df['详细信息'].str.split('/', expand=True)
df['作家'] = series[0]
df['译者'] = series[1]
df['出版社'] = series[2]
df['出版日期'] = series[3]
df['价格'] = series[4]
#导出为excel
df.to_excel('数据分析.xlsx', sheet_name='douban')
数据分析代码
import matplotlib.pyplot as plt
import pandas as pd
import re
import matplotlib.pyplot as plt
pd.set_option('display.max_columns', 500) #设置显示列数
pd.set_option('display.width', 1000) #设置显示宽度
pd.set_option('display.max_rows', 500) #设置显示行数
pd.set_option('display.unicode.east_asian_width', True)
#df1 = pd.read_excel('数据分析.xlsx', usecols=['评分'])
# maxscr = df1.max(axis=0)
# minscr = df1.min(axis=0)
# meanscr = df1.mean(axis=0)
# print(maxscr, minscr, meanscr)
#使用matplotlib绘制评分直方图
# plt.rcParams['font.sans-serif'] = ['SimHei']
# x = df1['评分']
# plt.xlabel('评分')
# plt.ylabel('数量')
# plt.title('豆瓣图书评分分布统计直方图')
# plt.hist(x, bins = [8.5, 8.8, 9.1, 9.4, 9.7], facecolor='cyan', edgecolor='black', alpha=0.7)
# plt.show()
# df1 = pd.read_excel('数据分析.xlsx', usecols=['图书名字', '评分'])
# df = df1.sort_values(by='评分', ascending=False, ignore_index=True)
# print(df)
df1 = pd.read_excel('数据分析.xlsx', usecols=['图书名字', '价格'])
list1 = df1['价格'].values.tolist()
list2 = []
for i in list1:
i = re.sub('元', '', i)
i = float(i)
list2.append(i)
# data = list2
# df2 = pd.DataFrame(index=range(1, 251), columns=['价格'], data=data)
# a = df2.max(axis=0)
# b = df2.min(axis=0)
# c = df2.mean(axis=0)
# print(a)
# print(b)
# print(c)
# plt.rcParams['font.sans-serif']=['SimHei']
# x = list2
# plt.xlabel('价格')
# plt.ylabel('图书数量')
# plt.title('图书价格分布直方图')
# plt.hist(x, bins=[0, 10, 20, 30, 40, 50, 60, 70, 80], facecolor='red', alpha=0.7)
# plt.show()
df = pd.read_excel('数据分析.xlsx', usecols=['图书名字', '价格', '出版日期'])
df1 = df['出版日期']
df1 = pd.to_datetime(df1)
df2 = pd.DataFrame(index=df1, columns=['价格'], data=list2)
# df2 = df2.to_period('A')
# a = df1.min(axis=0)
# b = df1.max(axis=0)
# print(a)
# print(b)
year1 = 1962
year2 = year1 + 10
list3 = []
for i in range(0, 6):
if year2 > 2021:
year1 = 2012
year2 = 2022
#print(df2[f'{year1}':f'{year2}'])
dfx = df2[f'{year1}':f'{year2}']
#print(f'{year1}~{year2}数量:', dfx.shape[0]) #获取每十年数量
list3.append(dfx.shape[0])
year1 = year1 + 10
year2 = year2 + 10
#print(df2)
plt.rcParams['font.sans-serif']=['SimHei']
x=['62~72', '72~82', '82~92', '92~02', '02~12', '12~22']
height = list3
plt.grid(axis='y', which='major')
plt.xlabel('年份')
plt.ylabel('数量')
plt.title('图书出版年份分布分析图')
plt.bar(x,height, width=0.5, align='center', color='b', alpha=0.5)
plt.show()
输出结果见前面几篇文章
在进行项目的过程中还是体会到了实践与学习之间极大的区别,在实践过程中遇到了报错或者思路中断的情况往往要付出数倍于学习的实践去查找与解决,在这个过程中,我收获了许多新的知识,也查漏补缺了许多之前学习过程中囫囵吞枣的知识。
由于时间比较紧张,学习的内容量很大,在爬虫方面还有许多待解决的问题,所以爬取的数据相对有限,尤其是在写正则表达式的时候,一定要有灵活的思维,以及严谨的操作,能够复制粘贴的地方就一定不要自己手写代码,很容易出现错误,同时不能在一棵树上吊着,一个地方不通就换一种形式,也许就可以完成。
在数据分析方面,由于可选的函数还有参数太多太杂,在写代码的过程中往往会遇到不知道使用哪一个函数的困境,只能回过头来去翻书本,有的时候知识储备跟不上思路,就只能去网上找方法,再将其运用到自己的代码之中,这个过程让我受益匪浅。
总之,暑期的最终项目到此就告一段落了,之后将会对暑期实践所学到知识进行回顾复习,巩固自己的基础。