Python⾼级应⽤课程设计作业——⼆⼿车市场数据爬取分析
⼀、选题的背景为什么要选择此选题?要达到的数据分析的预期⽬标是什么?(10 分)从社会、经济、技术、数据来源等⽅⾯进⾏描述(200 字以内)
通过爬取数据后数据分析能够直观的看到⼆⼿车市场中某⼀品牌的相对数据,能够了解到现在的⼆⼿车市场情况,通过分析数据看到⼆⼿车的⾛势,车商就可以利⽤这些数据进⾏定价,让想买⼆⼿车却不了解市场的⼈了解到⼤概的价格⾛势,到了店⾥不会被骗。
⼆、主题式⽹络爬⾍设计⽅案(10 分)
1.主题式⽹络爬⾍名称
基于BeautifulSoup的⼆⼿车信息爬取和分析
2.主题式⽹络爬⾍爬取的内容与数据特征分析
利⽤requests和BeautifulSoup爬取⽠⼦⼆⼿车⽹信息,爬取内容包括⼆⼿车的型号、价格、车龄、⾥程,然后清洗数据后获得⾃⼰想要的数据信息。其数据特征表现为:经过数据清洗后获得的数据没有重复值和⽆效值,让数据更具有说服⼒。
3.主题式⽹络爬⾍设计⽅案概述(包括实现思路与技术难点)
实现思路:绕过反爬获取⽹页资源,使⽤etree解析⽹页,⽤xpath定位爬取内容标签后爬取资源并将数据保存到csv⽂件中。
技术难点:设置请求头,for循环实现重复爬取
三、主题页⾯的结构特征分析(10 分)
1.主题页⾯的结构与特征分析
链接如下:www.guazi/fz/audi/
2.Htmls 页⾯解析
3.节点(标签)查⽅法与遍历⽅法(必要时画出节点树结构)
查⽅法:find_all
遍历⽅法:for循环遍历
四、⽹络爬⾍程序设计(60 分)
爬⾍程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后⾯提供输出结果的截图。
1. 数据爬取与采集
1#导⼊库
2import requests
3from lxml import etree
4import time
5import re
6import pandas as pd
7
8#初始化空列表
9 carname_lis,carage_lis, price_lis, mileage_lis = [], [], [], []
10
11
12for a in range(10):
13#爬取⽹站的⽹址并且循环爬取前10页的内容
14    url = "www.guazi/fz/audi/{}/#bread".format(a*10)
15
16#设置请求头
17    headers = {
18"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
19    }
20#requests请求链接
21    resp = (url,headers=headers).text
22
23#使⽤lxml模块中的etree⽅法讲字符串转化为html标签
24    html = etree.HTML(resp)
25
26#⽤xpath定位标签位置
27    lis = html.xpath("/html/body/div[6]/ul/li")
28
29#获取要爬取内容的详情链接
30for li in lis:
31#爬取车名
32        carname = li.xpath("./a/h2/text()")[0]
33#爬取车龄
34        carage = li.xpath("./a/div[1]/text()")[0]
35#爬取⾥程
36        milrage = li.xpath("./a/div[1]/text()[2]")[0]
37#爬取价格
38        price = li.xpath("./a/div[2]/p/text()")[0]
39
40#输出
41print(carname)
42print(carage)
43print(milrage)
44print(price)
45# 将字段存⼊初始化的列表中
46        carname_lis.append(carname)
47        carage_lis.append(carage)
48        mileage_lis.append(milrage)
49        price_lis.append(price)
50
51#pandas中的模块将数据存⼊
52 df = pd.DataFrame({
53"型号" : carname_lis,
54"车龄" : carage_lis,
55"⾥程" : mileage_lis,
56"价格" : price_lis,
57 })
58#储存为csv⽂件
_csv("aodi.csv" , encoding='utf_8_sig', index=False)
2.对数据进⾏清洗和处理
1#导⼊库
2import pandas as pd
3import numpy as mp
4import sklearn
5import seaborn as sns
6import matplotlib.pyplot as plt
7#读取csv⽂件
8 aodi = pd.ad_csv('aodi.csv'))
9 aodi.head()
1#检查重复值
2 aodi.duplicated()
1#删除重复值
2 aodi = aodi.drop_duplicates()
3 aodi.head()
1#清洗⽂字左右空格
2 aodi['型号'] = aodi['型号'].map(str.strip)
3 aodi['车龄'] = aodi['车龄'].map(str.strip)
4 aodi['⾥程'] = aodi['⾥程'].map(str.strip)
5 aodi.head()
3.⽂本分析(可选):jieba 分词、wordcloud 的分词可视化
4.数据分析与可视化(例如:数据柱形图、直⽅图、散点图、盒图、分布图)
1#价格直⽅图
2 sns.distplot(aodi['价格'])
1#车龄占⽐饼图
Params['font.sans-serif'] = ['SimHei']#解决乱码问题
3 df_score = aodi['车龄'].value_counts() #统计评分情况
4 plt.title("车龄占⽐图") #设置饼图标题
5 plt.pie(df_score.values,labels = df_score.index,autopct='%1.1f%%') #绘图
6#autopct表⽰圆⾥⾯的⽂本格式,在python⾥%操作符可⽤于格式化字符串操作
7 plt.show()
5.根据数据之间的关系,分析两个变量之间的相关系数,画出散点图,并建⽴变量之间的回归⽅程(⼀元或多元)。1#绘制散点图查看关系
plot(x = '价格',y = '车龄',data=aodi)
1import pandas as pd
2import numpy as mp
3import sklearn
4import seaborn as sns
5import matplotlib.pyplot as plt
6from scipy.optimize import leastsq
Params['font.sans-serif'] = ['SimHei']#解决乱码问题
8#读取⽂件
9 aodi = pd.ad_csv('aodi.csv'))
10#定义变量
二手汽车网11 price=aodi.loc[:,'价格']
12 year=aodi.loc[:,'年']
16return a*x*x+b*x+c
17def error_func(params,x,y):
18return func(params,x)-y
19 P0=[1,9.0]
20def main():
21    plt.figure(figsize=(8,6))
22    P0=[1,9.0,1]
23    Para=leastsq(error_func,P0,args=(price,year))
24    a,b,c=Para[0]
25print("a=",a, "b=",b, "c=",c)
26#绘图
27    plt.scatter(price,year,color="green",label="样本数据",linewidth=2)
28    x=mp.linspace(1,50,40)
29    y=a*x*x+b*x+c
30#右上⾓标
31    plt.plot(x,y,color="red",label="拟合曲线",linewidth=2)
32#x,y轴名称
33    plt.xlabel('价格')
34    plt.ylabel('车龄')
35#标题
36    plt.title("价格与车龄回归⽅程")
37    id()
38    plt.legend()
39    plt.show()
40 main()
6.数据持久化
1#储存为csv
_csv("aodi.csv" , encoding='utf_8_sig', index=False)
7.将以上各部分的代码汇总,附上完整程序代码
1#导⼊库
2import requests
3from lxml import etree
4import time
5import re
6import pandas as pd
7
8#初始化空列表
9 carname_lis,carage_lis, price_lis, mileage_lis = [], [], [], []
10
11
12for a in range(10):
13#爬取⽹站的⽹址并且循环爬取前10页的内容
14    url = "www.guazi/fz/audi/{}/#bread".format(a*10)
15
16#设置请求头
17    headers = {
18"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
19    }
20#requests请求链接
21    resp = (url,headers=headers).text
22
23#使⽤lxml模块中的etree⽅法讲字符串转化为html标签
24    html = etree.HTML(resp)
25
26#⽤xpath定位标签位置
27    lis = html.xpath("/html/body/div[6]/ul/li")
28
29#获取要爬取内容的详情链接
30for li in lis:
31#爬取车名
32        carname = li.xpath("./a/h2/text()")[0]
33#爬取车龄
34        carage = li.xpath("./a/div[1]/text()")[0]
35#爬取⾥程
36        milrage = li.xpath("./a/div[1]/text()[2]")[0]
37#爬取价格
38        price = li.xpath("./a/div[2]/p/text()")[0]
39