版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
目錄
1引言1
1.1項(xiàng)目背景1
1.2開(kāi)發(fā)環(huán)境與工具1
1.2.1Python簡(jiǎn)介1
1.2.2Pandas簡(jiǎn)介2
1.2.3pyecharts簡(jiǎn)介2
2需求分析2
2.1可行性需求分析2
2.2采集目標(biāo)功能分析3
2.3關(guān)鍵技術(shù)分析3
2.3.1網(wǎng)絡(luò)爬蟲(chóng)技術(shù)3
2.3.2文件存取技術(shù)3
2.3.3可視化技術(shù)3
3數(shù)據(jù)采集4
3.1采集頁(yè)面分析4
3.2數(shù)據(jù)解析策略5
3.3翻頁(yè)策略分析6
3.4多線程爬蟲(chóng)策略8
3.5Main方法9
4數(shù)據(jù)清洗與處理11
4.1數(shù)據(jù)清洗的意義11
4.2數(shù)據(jù)清洗需求11
4.3數(shù)據(jù)清洗操作12
4.4數(shù)據(jù)清洗結(jié)果13
5數(shù)據(jù)統(tǒng)計(jì)與分析13
5.1數(shù)據(jù)分析13
5.2數(shù)據(jù)分析與展示14
I
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
5.2.1統(tǒng)計(jì)各個(gè)品牌的汽車(chē)數(shù)量和價(jià)格14
5.2.2分析行駛里程與價(jià)格的關(guān)系15
5.2.3統(tǒng)計(jì)燃油與驅(qū)動(dòng)方式的數(shù)量15
5.2.4統(tǒng)計(jì)每年上牌的汽車(chē)的數(shù)量和價(jià)格17
5.3綜述18
6設(shè)計(jì)小結(jié)18
參考資料19
II
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
基于Python的澳康達(dá)二手車(chē)網(wǎng)數(shù)據(jù)采集與分析
1引言
二手車(chē)市場(chǎng)是一個(gè)龐大的市場(chǎng),數(shù)據(jù)采集和分析對(duì)于了解市場(chǎng)動(dòng)態(tài)、分析
市場(chǎng)趨勢(shì)和制定決策非常重要。本文選取了澳康達(dá)網(wǎng)站的二手車(chē)數(shù)據(jù)進(jìn)行采集
和分析,旨在探索二手車(chē)市場(chǎng)的情況和趨勢(shì)。數(shù)據(jù)采集使用Python編寫(xiě)爬蟲(chóng)程
序,通過(guò)HTTP請(qǐng)求獲取澳康達(dá)網(wǎng)站的數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)在本地CSV文件中。
數(shù)據(jù)分析主要使用Pandas等Python數(shù)據(jù)處理庫(kù)進(jìn)行數(shù)據(jù)清洗和分析,同時(shí)使
用pyecharts等可視化庫(kù)繪制圖表進(jìn)行數(shù)據(jù)展示和分析。通過(guò)數(shù)據(jù)采集和分析,
我們可以了解二手車(chē)市場(chǎng)的整體情況和趨勢(shì),比如不同品牌的銷(xiāo)量和平均售價(jià)、
不同上牌年份車(chē)輛的分布、不同車(chē)型的價(jià)格分布等。這些信息對(duì)于二手車(chē)市場(chǎng)
從業(yè)者和消費(fèi)者都具有參考價(jià)值。
1.1項(xiàng)目背景
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,越來(lái)越多的消費(fèi)者開(kāi)始通過(guò)互聯(lián)網(wǎng)平臺(tái)購(gòu)買(mǎi)二手
車(chē)。澳康達(dá)是中國(guó)領(lǐng)先的二手車(chē)電商平臺(tái)之一,為消費(fèi)者提供高質(zhì)量的二手車(chē)
交易服務(wù)。在這個(gè)背景下,對(duì)于澳康達(dá)網(wǎng)站的二手車(chē)數(shù)據(jù)進(jìn)行采集和分析可以
幫助消費(fèi)者更好地了解二手車(chē)市場(chǎng)的行情和趨勢(shì),為他們做出更明智的購(gòu)車(chē)決
策提供參考。同時(shí),對(duì)于澳康達(dá)來(lái)說(shuō),通過(guò)分析二手車(chē)市場(chǎng)數(shù)據(jù),他們可以更
好地了解市場(chǎng)需求和消費(fèi)者需求的變化,并根據(jù)分析結(jié)果做出更好的戰(zhàn)略決策,
提高企業(yè)的市場(chǎng)競(jìng)爭(zhēng)力。因此,對(duì)于澳康達(dá)網(wǎng)站的二手車(chē)數(shù)據(jù)進(jìn)行采集和分析
具有重要意義。
1.2開(kāi)發(fā)環(huán)境與工具
1.2.1Python簡(jiǎn)介
Python提供了高效的高級(jí)數(shù)據(jù)結(jié)構(gòu),還能簡(jiǎn)單有效地面向?qū)ο缶幊?。Python
語(yǔ)法和動(dòng)態(tài)類(lèi)型,以及解釋型語(yǔ)言的本質(zhì),使它成為多數(shù)平臺(tái)上寫(xiě)腳本和快速
開(kāi)發(fā)應(yīng)用的編程語(yǔ)言,隨著版本的不斷更新和語(yǔ)言新功能的添加,逐漸被用于
獨(dú)立的、大型項(xiàng)目的開(kāi)發(fā)。
Python解釋器易于擴(kuò)展,可以使用C語(yǔ)言或C++(或者其他可以通過(guò)C調(diào)
用的語(yǔ)言)擴(kuò)展新的功能和數(shù)據(jù)類(lèi)型。Python也可用于可定制化軟件中的擴(kuò)展
1
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
程序語(yǔ)言。Python豐富的標(biāo)準(zhǔn)庫(kù),提供了適用于各個(gè)主要系統(tǒng)平臺(tái)的源碼或機(jī)
器碼。
1.2.2Pandas簡(jiǎn)介
pandas是基于NumPy的一種工具,該工具是為解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。
Pandas納入了大量庫(kù)和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效地操作大型數(shù)據(jù)集所
需的工具。pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。你
很快就會(huì)發(fā)現(xiàn),它是使Python成為強(qiáng)大而高效的數(shù)據(jù)分析環(huán)境的重要因素之一。
1.2.3pyecharts簡(jiǎn)介
Pyecharts是一款將python與echarts結(jié)合的強(qiáng)大的數(shù)據(jù)可視化工具。使用pyecharts可
以生成獨(dú)立的網(wǎng)頁(yè),也可以在flask,Django中集成使用。
echarts是百度開(kāi)源的一個(gè)數(shù)據(jù)可視化JS庫(kù),主要用于數(shù)據(jù)可視化。pyecharts是一個(gè)
用于生成Echarts圖表的類(lèi)庫(kù),實(shí)際上就是Echarts與Python的對(duì)接。
2需求分析
2.1可行性需求分析
在進(jìn)行澳康達(dá)網(wǎng)站二手車(chē)數(shù)據(jù)采集與分析之前,需要進(jìn)行可行性需求分析。
主要包括以下幾個(gè)方面:
數(shù)據(jù)獲取可行性:澳康達(dá)網(wǎng)站二手車(chē)數(shù)據(jù)是否可以被獲取,獲取的方式是
否合法。
數(shù)據(jù)存儲(chǔ)可行性:采集到的數(shù)據(jù)需要存儲(chǔ)到數(shù)據(jù)庫(kù)中,需要評(píng)估數(shù)據(jù)庫(kù)的
存儲(chǔ)容量和性能是否滿足需求。
數(shù)據(jù)清洗可行性:采集到的數(shù)據(jù)可能存在重復(fù)、缺失或錯(cuò)誤等問(wèn)題,需要
進(jìn)行清洗和處理,評(píng)估數(shù)據(jù)清洗的難度和可行性。
數(shù)據(jù)分析可行性:分析二手車(chē)數(shù)據(jù)的目的是為了了解市場(chǎng)行情、車(chē)型價(jià)格、
銷(xiāo)售趨勢(shì)等信息,需要評(píng)估數(shù)據(jù)分析的可行性和可靠性。
技術(shù)可行性:進(jìn)行數(shù)據(jù)采集和分析需要使用相應(yīng)的技術(shù)和工具,需要評(píng)估
技術(shù)的可行性和適用性,是否需要進(jìn)行技術(shù)儲(chǔ)備和培訓(xùn)。
經(jīng)過(guò)可行性需求分析:我們可以初步確定澳康達(dá)網(wǎng)站二手車(chē)數(shù)據(jù)采集與分
析的可行性,并在此基礎(chǔ)上進(jìn)行后續(xù)的技術(shù)方案和實(shí)施計(jì)劃的制定。
2
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
2.2采集目標(biāo)功能分析
澳康達(dá)網(wǎng)站二手車(chē)數(shù)據(jù)采集與分析的采集目標(biāo)功能分析如下:
采集二手車(chē)的基本信息:品牌、車(chē)系、上牌時(shí)間、里程、價(jià)格等信息。
采集車(chē)輛的詳細(xì)信息:車(chē)輛顏色、排量、變速箱、車(chē)型等詳細(xì)信息。
采集車(chē)輛圖片和描述信息。
對(duì)采集到的數(shù)據(jù)進(jìn)行清洗和整合,使其符合分析要求。
將采集到的數(shù)據(jù)存儲(chǔ)在本地?cái)?shù)據(jù)庫(kù)或云端數(shù)據(jù)庫(kù)中,方便后續(xù)數(shù)據(jù)處理和
分析。
實(shí)現(xiàn)數(shù)據(jù)可視化界面,對(duì)采集到的數(shù)據(jù)進(jìn)行展示和分析,包括價(jià)格分布、
里程分布、品牌占比等分析。
通過(guò)以上采集目標(biāo)功能,我們可以獲取到全面且詳細(xì)的二手車(chē)信息,同時(shí)
也可以方便地進(jìn)行數(shù)據(jù)分析和可視化,為后續(xù)的決策提供支持和參考。
2.3關(guān)鍵技術(shù)分析
2.3.1網(wǎng)絡(luò)爬蟲(chóng)技術(shù)
網(wǎng)絡(luò)爬蟲(chóng)(又稱為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱
為網(wǎng)頁(yè)追逐者),是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者
腳本。另外一些不常使用的名字還有螞蟻、自動(dòng)索引、模擬程序或者蠕蟲(chóng)。
2.3.2文件存取技術(shù)
JSON是一種輕量級(jí)的數(shù)據(jù)交換格式。歐洲計(jì)算機(jī)協(xié)會(huì)制定的js規(guī)范的一個(gè)
子集,采用完全獨(dú)立于編程語(yǔ)言的文本格式來(lái)存儲(chǔ)和表示數(shù)據(jù)。簡(jiǎn)潔和清晰的
層次結(jié)構(gòu)使得JSON成為理想的數(shù)據(jù)交換語(yǔ)言。易于人閱讀和編寫(xiě),同時(shí)也易
于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。
2.3.3可視化技術(shù)
可視化是利用計(jì)算機(jī)圖形學(xué)和圖像處理技術(shù),將數(shù)據(jù)轉(zhuǎn)換成圖形或圖像在
屏幕上顯示出來(lái),再進(jìn)行交互處理的理論、方法和技術(shù)??梢暬抢糜?jì)算機(jī)
圖形學(xué)和圖像處理技術(shù),將數(shù)據(jù)轉(zhuǎn)換成圖形或圖像在屏幕上顯示出來(lái),并進(jìn)行
交互處理的理論、方法和技術(shù)。
3
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
3數(shù)據(jù)采集
3.1采集頁(yè)面分析
進(jìn)入澳康達(dá)官網(wǎng),點(diǎn)擊頁(yè)面上方選項(xiàng)欄,選擇”我要買(mǎi)車(chē)”進(jìn)入二手汽車(chē)搜
索結(jié)果頁(yè),其中選擇欄中列舉了很多熱門(mén)品牌,價(jià)格等選項(xiàng),為了能夠爬取全
量的數(shù)據(jù),這里選擇全部品牌和全部城市,如圖3-1所示:
圖3-1澳康達(dá)二手汽車(chē)
通過(guò)初步瀏覽汽車(chē)搜索結(jié)果頁(yè),頁(yè)面中包含汽車(chē)的基本信息,比如:汽車(chē)名
稱、新舊、行駛里程、售價(jià)、原價(jià)、城市;這些字段都需要進(jìn)行采集。如圖3-2
所示:
4
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-2汽車(chē)關(guān)鍵字段
通過(guò)瀏覽器自帶的開(kāi)發(fā)者工具分析頁(yè)面的html文檔,可以看到大部分字段
在html都有顯示,如圖3-3所示:
圖3-3html分析
a標(biāo)簽中的href屬性代表該汽車(chē)的詳情頁(yè)url,進(jìn)入詳情頁(yè)后對(duì)汽車(chē)的詳細(xì)
字段進(jìn)行采集,如圖3-4所示:
圖3-4汽車(chē)詳情頁(yè)
在詳情頁(yè)中有汽車(chē)詳細(xì)字段的描述,如車(chē)輛顏色、驅(qū)動(dòng)形式、座位數(shù)等。此
時(shí)已經(jīng)基本明確了頁(yè)面跳轉(zhuǎn)流程,首先請(qǐng)求搜索結(jié)果頁(yè),獲取到每一頁(yè)中所有
的汽車(chē)詳情頁(yè)url,并對(duì)詳情頁(yè)url進(jìn)行請(qǐng)求。將搜索結(jié)果頁(yè)和詳情頁(yè)采集到的
字段進(jìn)行匯總,并使用json格式保存。
3.2數(shù)據(jù)解析策略
在前面的小結(jié)中已經(jīng)提到,汽車(chē)的有關(guān)字段都保存在html文檔中,使用
etree庫(kù)的xpath方法即可獲取到每個(gè)字段。編寫(xiě)AkdSpider類(lèi),該類(lèi)用于解析
并保存字段。該類(lèi)包含以下三個(gè)方法:(詳細(xì)代碼參考AkdSpider.py)
clean方法,該方法用于清洗數(shù)據(jù),將文本中的空格和換行符等無(wú)用字符去
掉。它接受一個(gè)列表作為參數(shù),將列表中的元素連接起來(lái),并通過(guò)replace方
法替換掉無(wú)用字符。最后返回處理后的字符串。如下圖3-5所示:
5
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-5字段中的無(wú)效字符
get_car_detail方法,該方法用于從汽車(chē)詳細(xì)頁(yè)面的HTML中提取車(chē)輛詳細(xì)
信息。它接受一個(gè)response對(duì)象作為參數(shù),這個(gè)對(duì)象是requests庫(kù)返回的HTTP
響應(yīng)對(duì)象。使用etree.HTML將HTML字符串轉(zhuǎn)換為可解析的HTML對(duì)象,然后通
過(guò)XPath表達(dá)式從HTML中提取數(shù)據(jù)。最后,將提取的數(shù)據(jù)存儲(chǔ)到一個(gè)字典對(duì)
象detail_dict中,并返回這個(gè)字典。
get_car_info方法,這個(gè)方法用于從汽車(chē)列表頁(yè)面的HTML中提取汽車(chē)的基
本信息和鏈接,然后調(diào)用get_car_detail方法獲取車(chē)輛的詳細(xì)信息,并將基本
信息和詳細(xì)信息合并到一個(gè)字典中,最后將這個(gè)字典存儲(chǔ)到JSON文件中。它接
受一個(gè)response對(duì)象作為參數(shù),這個(gè)對(duì)象是requests庫(kù)返回的HTTP響應(yīng)對(duì)象。
它首先使用etree.HTML將HTML字符串轉(zhuǎn)換為可解析的HTML對(duì)象,然后通過(guò)
XPath表達(dá)式從HTML中提取基本信息。接著,從每個(gè)汽車(chē)的鏈接中獲取汽車(chē)詳
細(xì)信息,并調(diào)用get_car_detail方法獲取詳細(xì)信息。最后,將基本信息和詳細(xì)
信息合并到一個(gè)字典中,并將這個(gè)字典存儲(chǔ)到JSON文件中。
3.3翻頁(yè)策略分析
為了能夠采集到全量數(shù)據(jù),還需要進(jìn)行翻頁(yè)處理。前面已經(jīng)提到,每一頁(yè)中
有32條記錄,如果該頁(yè)面是最后一頁(yè),那么該頁(yè)中最多只有32條記錄,大多
數(shù)情況下最后一頁(yè)中的記錄數(shù)都會(huì)小于32。根據(jù)這個(gè)規(guī)律可以判斷當(dāng)前頁(yè)是否
為最后一頁(yè)。
在每一頁(yè)的最下方有頁(yè)數(shù)的選擇欄,點(diǎn)擊對(duì)應(yīng)的數(shù)字可以跳轉(zhuǎn)到相應(yīng)的頁(yè)面,
跳轉(zhuǎn)之后可以觀察url參數(shù)的變化。如圖3-6所示:
圖3-6下一頁(yè)url
其中pg后的數(shù)字代表當(dāng)前的頁(yè)數(shù),改變?cè)搮?shù)即可輕松的構(gòu)造出下一頁(yè)的
url,然后再根據(jù)最后一頁(yè)的判定方式即可結(jié)束翻頁(yè)。
在工具類(lèi)Helper中實(shí)現(xiàn)翻頁(yè),代碼如下所示:
classHelper:
queue=Queue()
6
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
@staticmethod
defrequest_car_url(url:str):
headers={
"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36
(KHTML,likeGecko)Chrome/Safari/537.36"
}
response=requests.get(url,headers=headers)
returnresponse
@staticmethod
defstorage_res(response):
cur_url=response.url
Helper.queue.put(response)
re_li=re.findall('pg(\d+)',cur_url)
next_page=cur_page=int(re_li[0]ifre_lielse0)
print(f"保存第{cur_page}頁(yè)response對(duì)象")
html=etree.HTML(response.text)
field_list=html.xpath('//div[@class="CarList_main"]/a')
print(cur_url)
print(len(field_list))
iffield_list:
next_page=next_page+1
next_url=re.sub('pg\d+','pg'+str(next_page),cur_url)
Helper.storage_res(Helper.request_car_url(next_url))
Helper類(lèi)的靜態(tài)成員queue是一個(gè)Queue對(duì)象,表示一個(gè)隊(duì)列。這個(gè)隊(duì)列
被用于存儲(chǔ)從網(wǎng)站中抓取到的HTML響應(yīng)對(duì)象,以便后續(xù)的數(shù)據(jù)采集線程可以從
隊(duì)列中獲取響應(yīng)對(duì)象進(jìn)行數(shù)據(jù)處理。
Helper類(lèi)中的第一個(gè)靜態(tài)方法request_car_url接收一個(gè)URL字符串作為
參數(shù),使用Python的requests庫(kù)向該URL發(fā)送HTTP請(qǐng)求,并返回響應(yīng)對(duì)
象response。這里使用了一個(gè)user-agen來(lái)模擬瀏覽器訪問(wèn),避免被服務(wù)器拒
絕訪問(wèn)。
Helper類(lèi)中的第二個(gè)靜態(tài)方法storage_res接收一個(gè)響應(yīng)對(duì)象response作
7
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
為參數(shù)。它首先使用XPath解析器etree將響應(yīng)對(duì)象的HTML文本解析成一個(gè)
Element對(duì)象html,然后使用XPath表達(dá)式獲取HTML中的車(chē)輛信息列表
field_list,并將其打印出來(lái)。如果列表非空,則解析出下一頁(yè)的URL,并遞歸
調(diào)用Helper類(lèi)的request_car_url方法,將下一頁(yè)的響應(yīng)對(duì)象存入隊(duì)列queue
中,并繼續(xù)遞歸調(diào)用storage_res方法。這樣,就可以遞歸地獲取所有頁(yè)面的
響應(yīng)對(duì)象并存入隊(duì)列中。
3.4多線程爬蟲(chóng)策略
由于該網(wǎng)站采集頁(yè)面較多,為了達(dá)到最高的數(shù)據(jù)采集效率,考慮使用多線程
爬蟲(chóng)策略。在主線程中進(jìn)行翻頁(yè)處理,并將搜索結(jié)果頁(yè)的response對(duì)象保存到
隊(duì)列中,翻頁(yè)處理完畢之后,再開(kāi)啟多個(gè)子線程,并行處理每一頁(yè)response。
定義數(shù)據(jù)采集線程類(lèi)CrawlerThread,繼承Thread類(lèi)。詳細(xì)代碼如下所示:
#數(shù)據(jù)采集線程
classCrawlerThread(threading.Thread):
def__init__(self,thread_id,response_list,akdSpider:AkdSpider):
threading.Thread.__init__(self)
self.thread_id=thread_id
self.response_list=response_list
self.akdSpider=akdSpider
defrun(self):
whilenotself.response_list.empty():
try:
response=self.response_list.get()
exceptIndexError:
break
else:
self.akdSpider.get_car_info(response)
采集線程中包含一個(gè)response_list隊(duì)列,主線程負(fù)責(zé)將待采集的URL加入
到該隊(duì)列中。采集線程使用while循環(huán),不斷從response_list隊(duì)列中獲取URL
并進(jìn)行采集。如果隊(duì)列為空,則該線程退出。在獲取到URL后,采集線程調(diào)用
爬蟲(chóng)類(lèi)中的get_car_info方法,將response作為參數(shù)傳入,獲取并保存數(shù)據(jù)。
8
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
由于線程之間共享response_list隊(duì)列,需要使用線程安全的隊(duì)列,以避免多
個(gè)線程同時(shí)操作隊(duì)列引起的異常。
該多線程爬蟲(chóng)使用Python的threading庫(kù)實(shí)現(xiàn)。在創(chuàng)建采集線程時(shí),傳入
線程ID、response_list隊(duì)列和爬蟲(chóng)類(lèi)實(shí)例作為參數(shù),并重寫(xiě)run方法。在run
方法中,調(diào)用get_car_info方法進(jìn)行數(shù)據(jù)采集。
使用多線程可以提高爬蟲(chóng)的效率,因?yàn)榭梢酝瑫r(shí)采集多個(gè)URL的數(shù)據(jù),而不
是一個(gè)一個(gè)地進(jìn)行采集。同時(shí),由于采集和解析是分開(kāi)進(jìn)行的,所以可以避免
解析過(guò)程阻塞采集過(guò)程的問(wèn)題。
最后,整個(gè)程序的控制流程可以在__main__函數(shù)中找到。這個(gè)函數(shù)首先調(diào)
用Helper類(lèi)的request_car_url方法獲取第一頁(yè)的響應(yīng)對(duì)象,并將其傳入
Helper類(lèi)的storage_res方法中。在storage_res方法中,遞歸地調(diào)用
request_car_url方法獲取其他頁(yè)面的響應(yīng)對(duì)象,并將它們存入隊(duì)列中。在所有
頁(yè)面的響應(yīng)對(duì)象都被存入隊(duì)列后,__main__函數(shù)創(chuàng)建多個(gè)數(shù)據(jù)采集線程并啟動(dòng)
它們。這些線程從隊(duì)列中獲取響應(yīng)對(duì)象,并調(diào)用akdSpider對(duì)象的get_car_info
方法進(jìn)行數(shù)據(jù)處理。如下圖3-7所示:
圖3-7保存response對(duì)象
3.5Main方法
在main方法編寫(xiě)相關(guān)代碼啟動(dòng)多線程爬蟲(chóng)。如下所示:
if__name__=='__main__':
spider=AkdSpider()
queue=Helper.queue
start_response=Helper.request_car_url('/carlist/ar0pg1/')
Helper.storage_res(start_response)
num_crawler_threads=8
crawler_threads=[]
#啟動(dòng)數(shù)據(jù)采集線程
foriinrange(num_crawler_threads):
9
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
print(f"啟動(dòng)線程{str(i)}")
thread=CrawlerThread(i,queue,spider)
crawler_threads.append(thread)
thread.start()
#等待所有數(shù)據(jù)采集線程完成
forthreadincrawler_threads:
thread.join()
程序開(kāi)始時(shí),創(chuàng)建了spider的對(duì)象,該對(duì)象的類(lèi)是AkdSpider。接著,從
Helper類(lèi)中獲取queue的隊(duì)列,并請(qǐng)求了start_response的網(wǎng)頁(yè)響應(yīng),該響應(yīng)
是通過(guò)Helper.request_car_url方法獲取的,并將響應(yīng)存儲(chǔ)在Helper類(lèi)中。
然后,定義num_crawler_threads變量,該變量表示要啟動(dòng)的線程數(shù)量。之后,
啟動(dòng)了多個(gè)CrawlerThread線程來(lái)執(zhí)行數(shù)據(jù)采集操作,并將它們存儲(chǔ)在
crawler_threads列表中。最后,等待所有線程完成執(zhí)行。如圖3-8所示
圖3-8啟動(dòng)子線程
程序運(yùn)行結(jié)束之后會(huì)在當(dāng)前文件夾生成akdData.json文件,文件內(nèi)容如圖
3-9所示:
圖3-9數(shù)據(jù)采集結(jié)果展示
10
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
4數(shù)據(jù)清洗與處理
4.1數(shù)據(jù)清洗的意義
數(shù)據(jù)采集下來(lái)之后還需要對(duì)數(shù)據(jù)進(jìn)行清洗和處理,比如date_and_mileage
字段,從“2017年06月上牌/10876公里“提取出上牌時(shí)間和行駛里程數(shù);
new_car_price字段,從”40.00萬(wàn)為您節(jié)省8.70萬(wàn)“提取出新車(chē)價(jià)和節(jié)省金
額;將價(jià)格字段轉(zhuǎn)換成浮點(diǎn)類(lèi)型等。數(shù)據(jù)清洗是數(shù)據(jù)預(yù)處理的重要步驟之一,
數(shù)據(jù)清洗可以提高數(shù)據(jù)質(zhì)量,減少數(shù)據(jù)分析中的誤差和偏差,增加數(shù)據(jù)可靠性
和有效性,從而提高數(shù)據(jù)分析和決策的準(zhǔn)確性和可信度。此外,數(shù)據(jù)清洗也可
以節(jié)省數(shù)據(jù)存儲(chǔ)空間,加速數(shù)據(jù)分析和處理的速度。
4.2數(shù)據(jù)清洗需求
爬蟲(chóng)采集的數(shù)據(jù)以json格式進(jìn)行保存,如下圖所示:
圖4-1json數(shù)據(jù)格式
1)使用pandas讀取文件
2)由于photo字段沒(méi)有數(shù)據(jù)分析價(jià)值,將其刪除
3)從date_and_mileage字段和new_car_price字段中提取出有效字段,并剔
除掉單位字符,最后刪除原有字段。
4)剔除price字段中的單位。
5)從name字段中提取出汽車(chē)的上市時(shí)間。
11
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
4.3數(shù)據(jù)清洗操作
使用python讀取akdData.json文件,從中提取出便于分析的字段,比如品
牌、上牌時(shí)間、售價(jià)、新車(chē)價(jià)、城市等。如下圖所示:
圖4-2讀取akdData.json文件
使用pandas從date_and_mileage字段和new_car_price字段中提取出有
效字段。如下圖所示:
圖4-3切分復(fù)合字段
將date_and_mileage列按照"日期上牌/公里數(shù)"的格式進(jìn)行切分,并將新
的兩列分別命名為date和mileage。切分時(shí)使用了正則表達(dá)式(.+)上牌/(.+)
公里,其中.表示匹配任意字符,+表示匹配前面的字符一次或多次,括號(hào)內(nèi)
的表達(dá)式表示將匹配到的內(nèi)容提取出來(lái)。new_car_price列也按照相同的方式進(jìn)
行處理。
為了便于數(shù)據(jù)分析,將price字段中的”萬(wàn)”字刪除,如下圖所示:
圖4-4處理price字段
12
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
從name字段中提取出汽車(chē)上市時(shí)間,如下圖所示:
圖4-5從name字段中提取上市時(shí)間
4.4數(shù)據(jù)清洗結(jié)果
通過(guò)數(shù)據(jù)清洗使得數(shù)據(jù)更加準(zhǔn)確、一致、完整、可靠、可用,從而提高數(shù)據(jù)
的質(zhì)量和價(jià)值。清洗之后的數(shù)據(jù)結(jié)果如下所示:
圖4-6數(shù)據(jù)清洗結(jié)果
后續(xù)可以直接使用pandas對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和分析。Pandas提供了強(qiáng)大的數(shù)
據(jù)結(jié)構(gòu),如Series和DataFrame,以及豐富的數(shù)據(jù)操作和轉(zhuǎn)換函數(shù)。為數(shù)據(jù)分
析提供了強(qiáng)有力的支持。
5數(shù)據(jù)統(tǒng)計(jì)與分析
5.1數(shù)據(jù)分析
二手汽車(chē)數(shù)據(jù)是包含了各種汽車(chē)信息的數(shù)據(jù),例如品牌、型號(hào)、年份、里
程、價(jià)格等等。利用pandas對(duì)二手汽車(chē)數(shù)據(jù)進(jìn)行數(shù)據(jù)分析,可以發(fā)現(xiàn)很多有趣
的信息。
首先,我們可以通過(guò)對(duì)二手汽車(chē)價(jià)格的分析,發(fā)現(xiàn)二手汽車(chē)價(jià)格的分布情
況以及各個(gè)品牌、排量的平均價(jià)格。此外,我們還可以比較不同品牌、排量之
間的價(jià)格差異以及價(jià)格與年份、里程等因素之間的關(guān)系。
其次,我們還可以通過(guò)對(duì)二手汽車(chē)?yán)锍痰姆治?,了解不同品牌、型?hào)的平
均里程以及不同年份、價(jià)格區(qū)間的車(chē)輛平均里程等等。此外,我們還可以通過(guò)
13
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
繪制里程和價(jià)格之間的散點(diǎn)圖,發(fā)現(xiàn)二手車(chē)價(jià)格和里程之間的關(guān)系。
最后,我們還可以通過(guò)對(duì)二手汽車(chē)的品牌、型號(hào)、車(chē)齡、里程等信息進(jìn)行
匯總統(tǒng)計(jì),發(fā)現(xiàn)二手汽車(chē)市場(chǎng)上最受歡迎的品牌、型號(hào)、車(chē)齡等等。這些信息
可以對(duì)二手汽車(chē)買(mǎi)賣(mài)市場(chǎng)的發(fā)展趨勢(shì)進(jìn)行分析,并對(duì)二手車(chē)市場(chǎng)上的交易價(jià)格
提供參考。
5.2數(shù)據(jù)分析與展示
5.2.1統(tǒng)計(jì)各個(gè)品牌的汽車(chē)數(shù)量和價(jià)格
在pandas中,首先使用pd.to_numeric()函數(shù)將data中price列轉(zhuǎn)換為浮
點(diǎn)數(shù)類(lèi)型,同時(shí)通過(guò)errors='coerce'參數(shù)將無(wú)法轉(zhuǎn)換的值替換為NaN。然后使
用了dropna()函數(shù)刪除price列中包含NaN的行。最后,使用groupby()函數(shù)
對(duì)Brand列進(jìn)行分組,統(tǒng)計(jì)每個(gè)品牌的汽車(chē)數(shù)量和價(jià)格的平均值,其中agg()函
數(shù)用于對(duì)每個(gè)分組進(jìn)行聚合操作。{'Brand':'count','price':'mean'}指定
了需要聚合的列及聚合方式,其中'Brand':'count'表示統(tǒng)計(jì)每個(gè)品牌的汽車(chē)數(shù)
量,'price':'mean'表示計(jì)算每個(gè)品牌的汽車(chē)價(jià)格的平均值。最終得到的結(jié)果
是一個(gè)DataFrame,包含兩列:Brand和price,其中Brand列為品牌名,price
列為對(duì)應(yīng)品牌的汽車(chē)價(jià)格平均值。
將品牌數(shù)量和平均價(jià)格傳入pyecharts中bar方法中繪制柱狀圖,如下圖
5-1所示:
圖5-1統(tǒng)計(jì)各個(gè)品牌的汽車(chē)數(shù)量和價(jià)格
14
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
保時(shí)捷、奔馳、寶馬、雷克薩斯等豪華車(chē)品牌的二手車(chē)均價(jià)較高,分別為
73.78、45.55、39.36、47.05萬(wàn)元。勞斯萊斯、蘭博基尼等豪華車(chē)品牌的二手
車(chē)均價(jià)更高,但是數(shù)量較少。豐田品牌的二手車(chē)數(shù)量最多,達(dá)到32輛,但是均
價(jià)并不高,為48.16萬(wàn)元。有一些品牌的二手車(chē)數(shù)量較少,且均價(jià)較高,如阿
斯頓馬丁、法拉利等。
據(jù)此,購(gòu)買(mǎi)二手車(chē)時(shí)應(yīng)該根據(jù)自己的需求和經(jīng)濟(jì)實(shí)力進(jìn)行選擇。如果追求豪
華車(chē)品牌,應(yīng)該選擇保時(shí)捷、奔馳、寶馬、雷克薩斯等品牌,但需要承受較高
的價(jià)格。如果追求性價(jià)比,可以考慮豐田等品牌的二手車(chē)。
5.2.2分析行駛里程與價(jià)格的關(guān)系
完成該需求首先需要使用to_numeric方法將行駛里程數(shù)和價(jià)格轉(zhuǎn)換成數(shù)值
類(lèi)型,再利用sort_values方法對(duì)價(jià)格升序排序,將價(jià)格作為橫坐標(biāo),將行駛
里程數(shù)作為縱坐標(biāo),再通過(guò)pyecharts中的Scatter方法繪制散點(diǎn)圖。如下圖
5-2所示:
圖5-2分析行駛里程與價(jià)格的關(guān)系
價(jià)格在7萬(wàn)元到23萬(wàn)元之前的車(chē)型的行駛里程都比較長(zhǎng),也說(shuō)明性價(jià)比的
車(chē)型多用于代步和出行;25萬(wàn)元以上的車(chē)型行駛里程數(shù)在3萬(wàn)公里以下,也說(shuō)
明了豪華車(chē)型的使用頻率較少。在考慮購(gòu)買(mǎi)二手車(chē)時(shí)可以對(duì)照里程數(shù)與價(jià)格的
關(guān)系圖,從而購(gòu)買(mǎi)最適合自己的二手車(chē)。
5.2.3統(tǒng)計(jì)燃油與驅(qū)動(dòng)方式的數(shù)量
按燃油類(lèi)型和驅(qū)動(dòng)方式分組,統(tǒng)計(jì)數(shù)量和平均價(jià)格,結(jié)果保存為兩個(gè)pandas
15
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
DataFrame對(duì)象(ret1和ret2)。將結(jié)果轉(zhuǎn)換為pyecharts所需的數(shù)據(jù)格式,
包括餅圖的標(biāo)簽和數(shù)據(jù)。利用pyecharts的Pie類(lèi)繪制兩個(gè)餅圖,并分別保存
為html文件。
代碼的執(zhí)行過(guò)程中,利用pandas庫(kù)的groupby方法按燃油類(lèi)型和驅(qū)動(dòng)方式
對(duì)數(shù)據(jù)進(jìn)行分組,再用agg方法對(duì)分組后的數(shù)據(jù)進(jìn)行聚合操作,統(tǒng)計(jì)每組的數(shù)
量和平均價(jià)格。然后利用pyecharts庫(kù)的Pie類(lèi)繪制餅圖,并分別設(shè)置了標(biāo)題
和標(biāo)簽的樣式,最后分別保存為html文件。如下圖5-3和5-4所示
圖5-3驅(qū)動(dòng)方式分布
圖5-4燃油類(lèi)型分布
16
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
從驅(qū)動(dòng)方式上看,4驅(qū)驅(qū)動(dòng)形式的車(chē)型數(shù)量最多,價(jià)格也最高,為61.66萬(wàn)
元;后驅(qū)驅(qū)動(dòng)形式的車(chē)型數(shù)量位于中間,價(jià)格也較高,為58.38萬(wàn)元;前驅(qū)驅(qū)
動(dòng)形式的車(chē)型數(shù)量最少,價(jià)格也最低,為24.95萬(wàn)元;
從燃油類(lèi)型上看,汽油是最為常見(jiàn)的能源類(lèi)型,有著高達(dá)793個(gè)數(shù)據(jù)點(diǎn),平
均價(jià)格為55.44。其次是(汽油)48V輕混系統(tǒng)和插電式(汽油)混合動(dòng)力,分
別擁有69和31個(gè)數(shù)據(jù)點(diǎn),平均價(jià)格分別為70.10和39.55。值得注意的是,雖
然插電式(汽油)混合動(dòng)力只有31個(gè)數(shù)據(jù)點(diǎn),但其平均價(jià)格仍然比汽油低很多,
表明其有著相對(duì)較高的性價(jià)比。柴油的數(shù)據(jù)點(diǎn)最少,僅有1個(gè),而平均價(jià)格為
33.80,相對(duì)來(lái)說(shuō)價(jià)格較低。
5.2.4統(tǒng)計(jì)每年上牌的汽車(chē)的數(shù)量和價(jià)格
按照年份分組,統(tǒng)計(jì)數(shù)量和平均價(jià)格,并將結(jié)果按照年份升序排序。同樣的,
需要對(duì)價(jià)格字段轉(zhuǎn)換成數(shù)值類(lèi)型,也需要對(duì)年份字段進(jìn)行統(tǒng)一格式化處理。最
后,使用Pyecharts繪制折線圖,展示上牌時(shí)間的分布情況。圖中包含了數(shù)量
和平均價(jià)格兩個(gè)指標(biāo),橫軸為年份,縱軸為數(shù)量和平均價(jià)格。折線圖中間的兩
條橫線代表數(shù)量和價(jià)格的平均數(shù)。如下圖所示:
圖5-5統(tǒng)計(jì)每年上牌的汽車(chē)數(shù)量和價(jià)格
根據(jù)上牌年份劃分,2019年的車(chē)型數(shù)量最多,有144輛,平均售價(jià)也相對(duì)
較高,為68.30萬(wàn)元。從2014年到2018年,車(chē)型數(shù)量有所增加,平均售價(jià)也
有所波動(dòng),但總體趨勢(shì)呈現(xiàn)穩(wěn)定的上漲。2020年和2021年的車(chē)型數(shù)量最多,但
17
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
平均售價(jià)相對(duì)較低,分別為56.34萬(wàn)元和52.30萬(wàn)元。
5.3綜述
從“品牌”分析報(bào)告可以看出,價(jià)格排名前三的品牌依次為奧迪、寶馬和
奔馳,它們的平均價(jià)格分別為56.28萬(wàn)元、57.75萬(wàn)元和63.63萬(wàn)元。此外,在
品牌分布中,國(guó)產(chǎn)品牌數(shù)量較多,而豪華進(jìn)口品牌數(shù)量較少。
從“能源類(lèi)型”分析報(bào)告可以看出,插電式(汽油)混合動(dòng)力和柴油車(chē)的
平均價(jià)格較低,分別為39.55萬(wàn)元和33.80萬(wàn)元;而(汽油)48V輕混系統(tǒng)和
(汽油)輕混系統(tǒng)的平均價(jià)格較高,分別為70.10萬(wàn)元和56.75萬(wàn)元。
從“驅(qū)動(dòng)形式”分析報(bào)告可以看出,四驅(qū)車(chē)的平均價(jià)格最高,為61.66萬(wàn)
元,后驅(qū)車(chē)的平均價(jià)格為58.38萬(wàn)元,前驅(qū)車(chē)的平均價(jià)格最低,為24.95萬(wàn)元。
從“上牌年份”分析報(bào)告可以看出,從
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年紡織企業(yè)間產(chǎn)品買(mǎi)賣(mài)合同
- 2024年電動(dòng)車(chē)零部件制造與技術(shù)許可合同3篇
- 2024簡(jiǎn)易工程裝修合同
- 2025年度環(huán)保設(shè)施維護(hù)與升級(jí)補(bǔ)充合同模板3篇
- 專業(yè)化海運(yùn)出口物流合作合同(2024年版)版
- 2024樁基破樁頭作業(yè)服務(wù)協(xié)議版B版
- 2024年旅游業(yè)務(wù)合作合同詳細(xì)條款
- 2024年水資源開(kāi)發(fā)與利用合作協(xié)議
- 2024皮草產(chǎn)品定制加工及銷(xiāo)售合作協(xié)議3篇
- 2024青島裝修工程糾紛解決合同范本3篇
- 大使涂料(安徽)有限公司年產(chǎn)6萬(wàn)噸科技型工業(yè)涂料、水性環(huán)保涂料生產(chǎn)項(xiàng)目環(huán)境影響報(bào)告書(shū)
- 利樂(lè)包和康美包的比較
- 法院執(zhí)行庭長(zhǎng)供職報(bào)告1400字
- 推動(dòng)架機(jī)械加工工序卡片
- 重慶市綦江區(qū)篆塘鎮(zhèn)白坪村建筑用砂巖礦采礦權(quán)評(píng)估報(bào)告
- 甘肅社火100首歌詞
- 行政查房情況記錄表
- GB/T 2315-2000電力金具標(biāo)稱破壞載荷系列及連接型式尺寸
- 腹主動(dòng)脈瘤的護(hù)理查房
- 星級(jí)酒店每日防火巡查記錄本
- 中石化erp系統(tǒng)操作手冊(cè)
評(píng)論
0/150
提交評(píng)論