當前位置:首頁 > 科技 > 正文

Python爬蟲+數據分析:分析一下懂車帝現階段哪款車值得我們去沖

Python爬蟲+數據分析:分析一下懂車帝現階段哪款車值得我們去沖

2021-11-27 13:15 ·

文章目錄

一、寫在前面

兄弟們,你們的熱情讓我都不敢斷更了,沖!

爬妹子什麼的,雖然大家都很喜歡,但是也不能經常去爬對吧,身體重要,當然如果你們有什麼好的網站,都可以推薦下,下次我爬完了給你們分享~

網友:其實就是你自己想看吧

二、準備工作

1、知識點

  • requests 發送網絡請求

  • parsel 解析數據

  • csv 保存數據

2、使用的軟件

  • 環境版本: python3.8

  • 編輯器版本:pycharm2021.2

不會安裝軟件的看我之前發的:Python入門合集

Python安裝/環境配置/pycharm安裝/基本操作/快捷鍵/永久使用都有

3、第三方庫

  • requests

  • parsel
    這些是需要安裝的第三方庫,直接pip安裝就好了。
    pip install requests
    pip install parsel

安裝慢就使用鏡像源安裝

pip install requests -i /simple/

鏡像源有很多,我這裡用的清華的。

實在不會安裝模塊看我以前的文章: Python安裝第三方模塊及解決pip下載慢/安裝報錯

三、大緻流程

  1. 找到 目标網址
    /usedcar/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x?sh_city_name=%E5%85%A8%E5%9B%BD&page=1a 确定我們要采集的目标 年份 品牌…b 确定數據來源 (靜态頁面True 和 動态頁面)

  2. 發送請求

  3. 獲取數據 html網頁源代碼

  4. 解析數據 re css xpath bs4 …

  5. 保存數據

  6. 數據分析 簡單的數據可視化 推薦功能
    工具是不一樣的 anaconda(python解釋器) 裡面的 jupyter notebook

四、代碼展示分析

1、爬蟲部分

1.1 代碼展示

importrequests#發送網絡請求importparsel#解析數據importcsv#保存數據csv_dcd=open('dcd.csv',mode='a',encoding='utf-8',newline='')
csv_write=csv.writer(csv_dcd)
csv_write.writerow(['品牌','車齡','裡程(萬公裡)','城市','認證','售價(萬元)','原價(萬元)','鍊接'])forpageinrange(1,168):#1.找到目标網址
url=f'/usedcar/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x?sh_city_name=%E5%85%A8%E5%9B%BD&page={
page}'
#2.發送請求
#3.獲取數據html網頁源代碼
#:請求成功的狀态碼訪問這個網站成功了
html_data=requests.get(url).text#4.解析數據recssxpathbs4...
selector=parsel.Selector(html_data)#get():獲取一個
#getall():獲取全部
lis=selector.css('#__next>div:nth-child(2)>div.new-main.new>div>div>div.wrap>ulli')forliinlis:#二次提取
#::text:提取文本内容
#品牌
title=li.css('adldtp::text').get()#信息年份裡程城市
#:nth-child(2):僞類選擇器
info=li.css('adldd:nth-child(2)::text').getall()#info列表裡面有兩個元素
#列表合并為字符串
info_str=''.join(info)#字符串的分割
info_list=info_str.split('|')
car_age=info_list[0]
mileage=info_list[1].replace('萬公裡','')
city=info_list[2].strip()#鍊接
link=''+li.css('a::attr(href)').get()
dds=li.css('adldd')#如果當前有4個dd标簽
iflen(dds)==4:#懂車帝認證
dcd_auth=li.css('adldd:nth-child(3)span::text').get()
price=li.css('adldd:nth-child(4)::text').get()
original_price=li.css('adldd:nth-child(5)::text').get()else:
dcd_auth='無認證'
price=li.css('adldd:nth-child(3)::text').get()
original_price=li.css('adldd:nth-child(4)::text').get()
price=price.replace('萬','')
original_price=original_price.replace('新車含稅價:','').replace('萬','')print(title,car_age,mileage,city,dcd_auth,price,original_price,link)
csv_write.writerow([title,car_age,mileage,city,dcd_auth,price,original_price,link])
csv_dcd.close()

2、效果展示

2.1 爬取中

用pycharm打印出來有點亂碼,它這個地方是有字體加密了,加密的部分就不顯示,解密今天就先不分享了。

2.2 保存的數據

這是保存在Excel裡面的數據,等下分析就分析這裡面保存好的數據。

3、數據分析部分

3.1 導入模塊

importpandasaspdfrompyecharts.chartsimport*frompyecharts.commons.utilsimportJsCodefrompyechartsimportoptionsasopts

pyecharts 沒有的話需要安裝一下

3.2 Pandas數據處理

3.21 讀取數據

df=pd.read_csv('dcd.csv',encoding='utf-8')
df.head()

3.22 查看表格數據描述

df.describe()

一共有10000條數據

3.23 查看表格是否有數據缺失

df.isnull().sum()

3.3 Pyecharts可視化

3.31 Pyecharts可視化

counts=df.groupby('城市')['品牌'].count().sort_values(ascending=False).head(20)
bar=(
Bar(init_opts=opts.InitOpts(height='500px',width='1000px',theme='dark'))
.add_xaxis(counts.index.tolist())
.add_yaxis('城市二手車數量',
counts.values.tolist(),
label_opts=opts.LabelOpts(is_show=True,position='top'),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode("""newecharts.graphic.LinearGradient(
0,0,0,1,[{offset:0,color:'rgb(255,99,71)'},{offset:1,color:'rgb(32,178,170)'}])
"""
)
)
)
.set_global_opts(
title_opts=opts.TitleOpts(
title='各個城市二手車數量柱狀圖'),
xaxis_opts=opts.AxisOpts(name='書籍名稱',
type_='category',
axislabel_opts=opts.LabelOpts(rotate=90),
),
yaxis_opts=opts.AxisOpts(
name='數量',
min_=0,
max_=1400.0,
splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_='dash'))
),
tooltip_opts=opts.TooltipOpts(trigger='axis',axis_pointer_type='cross')
)

.set_series_opts(
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_='average',name='均值'),
opts.MarkLineItem(type_='max',name='最大值'),
opts.MarkLineItem(type_='min',name='最小值'),
]
)
)
)
bar.render_notebook()

可以看到成都的二手車數量是最多的,遠超第二。

3.32 各省市二手車平均價格柱狀圖

means=df.groupby('城市')['售價(萬元)'].mean().astype('int64').head(20)
bar=(
Bar(init_opts=opts.InitOpts(height='500px',width='1000px',theme='dark'))
.add_xaxis(means.index.tolist())
.add_yaxis('城市二手車平均價格',
means.values.tolist(),
label_opts=opts.LabelOpts(is_show=True,position='top'),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode("""newecharts.graphic.LinearGradient(
0,0,0,1,[{offset:0,color:'rgb(255,99,71)'},{offset:1,color:'rgb(32,178,170)'}])
"""
)
)
)
.set_global_opts(
title_opts=opts.TitleOpts(
title='各個城市二手車平均價格柱狀圖'),
xaxis_opts=opts.AxisOpts(name='城市名稱',
type_='category',
axislabel_opts=opts.LabelOpts(rotate=90),
),
yaxis_opts=opts.AxisOpts(
name='平均價格',
min_=0,
max_=40.0,
splitline_opts=opts.SplitLineOpts(is_show=True,linestyle_opts=opts.LineStyleOpts(type_='dash'))
),
tooltip_opts=opts.TooltipOpts(trigger='axis',axis_pointer_type='cross')
)

.set_series_opts(
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_='average',name='均值'),
opts.MarkLineItem(type_='max',name='最大值'),
opts.MarkLineItem(type_='min',name='最小值'),
]
)
)
)
bar.render_notebook()

不過價格的話,成都就比較平均,帝都遙遙領先。

3.33 二手車品牌占比情況

dcd_pinpai=df['品牌'].apply(lambdax:x.split('')[0])
df['品牌']=dcd_pinpai
pinpai=df['品牌'].value_counts()
pinpai=pinpai[:5]
datas_pair_1=[[i,int(j)]fori,jinzip(pinpai.index,pinpai.values)]
datas_pair_1
pie1=(
Pie(init_opts=opts.InitOpts(theme='dark',width='1000px',height='600px'))
.add('',datas_pair_1,radius=['35%','60%'])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
.set_global_opts(
title_opts=opts.TitleOpts(
title="懂車帝二手車\n\n數量占比區間",
pos_left='center',
pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(
color='#F0F8FF',
font_size=20,
font_weight='bold'
),
)
)
)
pie1.render_notebook()

以寶馬奧迪這幾款車型來看,二手車品牌占比情況,寶馬比奧迪勝出一籌。

2.34 二手車裡程區間

deftranform_price(x):
ifx<=5.0:return'0~5萬公裡'
elifx<=10.0:return'5~10萬公裡'
elifx<=15.0:return'10~15萬公裡'
elifx<=20.0:return'15~20萬公裡'
else:return'20萬公裡以上'
df['裡程分級']=df['裡程(萬公裡)'].apply(lambdax:tranform_price(x))
price_1=df['裡程分級'].value_counts()
datas_pair_1=[(i,int(j))fori,jinzip(price_1.index,price_1.values)]
pie1=(
Pie(init_opts=opts.InitOpts(theme='dark',width='1000px',height='600px'))
.add('',datas_pair_1,radius=['35%','60%'])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%"))
.set_global_opts(
title_opts=opts.TitleOpts(
title="懂車帝二手車\n\n裡程占比區間",
pos_left='center',
pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(
color='#F0F8FF',
font_size=20,
font_weight='bold'
),
)
)
)
pie1.render_notebook()

基本上都是10公裡以内的裡程,還是非常有搞頭的。看得我都想去沖兩台了~

3.4 二手車推薦

k_list=[]
the_list=[]
keyword=input('請輸入品牌:')
data5=df.loc[df['品牌'].str.contains(str(keyword))]
keyword1=eval(input('請輸入裡程(萬公裡)上限:'))
data6=data5[data5['裡程(萬公裡)']<=keyword1]
city=input('請輸入城市:')
data7=data6[data6['城市']==str(city)]
day1=eval(input('請輸入售價(萬元)下限:'))
day2=eval(input('請輸入售價(萬元)上限:'))
data8=data7[(data7['售價(萬元)']>=day1)&(data7['售價(萬元)']<=day2)]
data8

哈哈 長沙居然沒有奧迪 ,不給力啊

4、數據分析代碼運行

數據分析代碼的話,一般都是ipynb格式的,對于剛學數據分析的兄弟來說,就比較迷茫了,我簡單分享下。

首先打開我們存放代碼的文件夾,然後在地址欄輸入 jupyter notebook 然後按回車。

如果你實在找不到代碼存放的位置,右鍵點擊代碼打開屬性。

比如我是放在C:\Users\Administrator\Desktop

然後打開一個新的文件窗口,把這個地址粘貼進去按回車進入這個位置。

繼續前面講的,我們按回車之後就會彈出這個窗口。

找到你要運行的代碼點進去就打開這個代碼了

運行都是一樣的 點 run 就好了,運行之前你下載的數據一定要準備好,沒數據怎麼分析呢,對吧~

兄弟們,文章看不會的話,我把視頻教程放在評論區置頂了。

原文
https://blog.csdn.net/fei347795790/article/details/121516389

你可能想看:

有話要說...

取消
掃碼支持 支付碼