基于Python的澳康達(dá)二手車(chē)網(wǎng)數(shù)據(jù)采集與分析_第1頁(yè)
基于Python的澳康達(dá)二手車(chē)網(wǎng)數(shù)據(jù)采集與分析_第2頁(yè)
基于Python的澳康達(dá)二手車(chē)網(wǎng)數(shù)據(jù)采集與分析_第3頁(yè)
基于Python的澳康達(dá)二手車(chē)網(wǎng)數(shù)據(jù)采集與分析_第4頁(yè)
基于Python的澳康達(dá)二手車(chē)網(wǎng)數(shù)據(jù)采集與分析_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論