一、寫在前面
兄弟們,你們的熱情讓我都不敢斷更了,沖!
爬妹子什么的,雖然大家都很喜歡,但是也不能經常去爬對吧,身體重要,當然如果你們有什么好的網站,都可以推薦下,下次我爬完了給你們分享~
網友:其實就是你自己想看吧
- requests 發送網絡請求
- parsel 解析數據
- csv 保存數據
- 環境版本: python3.8
- 編輯器版本:pycharm2021.2
不會安裝軟件的看我之前發的:Python入門合集
Python安裝/環境配置/pycharm安裝/基本操作/快捷鍵/永久使用都有
- requests
- parsel
這些是需要安裝的第三方庫,直接pip安裝就好了。
pip install requests pip install parsel
安裝慢就使用鏡像源安裝
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/
鏡像源有很多,我這里用的清華的。
實在不會安裝模塊看我以前的文章:Python安裝第三方模塊及解決pip下載慢/安裝報錯
- 找到 目標網址
https://www.dongchedi.com/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=1
a 確定我們要采集的目標 年份 品牌…
b 確定數據來源 (靜態頁面True 和 動態頁面) - 發送請求
- 獲取數據 html網頁源代碼
- 解析數據 re css xpath bs4 …
- 保存數據
- 數據分析 簡單的數據可視化 推薦功能
工具是不一樣的 anaconda(python解釋器) 里面的 jupyter notebook
import requests # 發送網絡請求 import parsel # 解析數據 import csv # 保存數據 csv_dcd = open('dcd.csv', mode='a', encoding='utf-8', newline='') csv_write = csv.writer(csv_dcd) csv_write.writerow(['品牌', '車齡', '里程(萬公里)', '城市', '認證', '售價(萬元)', '原價(萬元)', '鏈接']) for page in range(1, 168): # 1. 找到 目標網址 url = f'https://www.dongchedi.com/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網頁源代碼 # <Response [200]>: 請求成功的狀態碼 訪問這個網站成功了 html_data = requests.get(url).text # 4. 解析數據 re css xpath bs4 ... selector = parsel.Selector(html_data) # get(): 獲取一個 # getall(): 獲取全部 lis = selector.css('#__next > div:nth-child(2) > div.new-main.new > div > div > div.wrap > ul li') for li in lis: # 二次提取 # ::text: 提取文本內容 # 品牌 title = li.css('a dl dt p::text').get() # 信息 年份 里程 城市 # :nth-child(2):偽類選擇器 info = li.css('a dl dd: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 = 'https://www.dongchedi.com' + li.css('a::attr(href)').get() dds = li.css('a dl dd') # 如果當前 有 4個dd標簽 if len(dds) == 4: # 懂車帝認證 dcd_auth = li.css('a dl dd:nth-child(3) span::text').get() price = li.css('a dl dd:nth-child(4)::text').get() original_price = li.css('a dl dd:nth-child(5)::text').get() else: dcd_auth = '無認證' price = li.css('a dl dd:nth-child(3)::text').get() original_price = li.css('a dl dd: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()
#兄弟們學習python,有時候不知道怎么學,從哪里開始學。掌握了基本的一些語法或者做了兩個案例后,不知道下一步怎么走,不知道如何去學習更加高深的知識。 #那么對於這些大兄弟們,我准備了大量的免費視頻教程,PDF電子書籍,以及視頻源的源代碼! #還會有大佬解答! #都在這個群里了 924040232 #歡迎加入,一起討論 一起學習!
用pycharm打印出來有點亂碼,它這個地方是有字體加密了,加密的部分就不顯示,解密今天就先不分享了。
這是保存在Excel里面的數據,等下分析就分析這里面保存好的數據。
import pandas as pd from pyecharts.charts import * from pyecharts.commons.utils import JsCode from pyecharts import options as opts
pyecharts 沒有的話需要安裝一下
3.21 讀取數據
df = pd.read_csv('dcd.csv', encoding = 'utf-8') df.head()
3.22 查看表格數據描述
df.describe()

一共有10000條數據
3.23 查看表格是否有數據缺失
df.isnull().sum()

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("""new echarts.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("""new echarts.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(lambda x:x.split(' ')[0]) df['品牌'] = dcd_pinpai pinpai = df['品牌'].value_counts() pinpai = pinpai[:5] datas_pair_1 = [[i, int(j)] for i, j in zip(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 二手車里程區間
def tranform_price(x): if x <= 5.0: return '0~5萬公里' elif x <= 10.0: return '5~10萬公里' elif x <= 15.0: return '10~15萬公里' elif x <= 20.0: return '15~20萬公里' else: return '20萬公里以上' df['里程分級'] = df['里程(萬公里)'].apply(lambda x:tranform_price(x)) price_1 = df['里程分級'].value_counts() datas_pair_1 = [(i, int(j)) for i, j in zip(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公里以內的里程,還是非常有搞頭的。看得我都想去沖兩台了~
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
哈哈 長沙居然沒有奧迪 ,不給力啊
數據分析代碼的話,一般都是ipynb格式的,對於剛學數據分析的兄弟來說,就比較迷茫了,我簡單分享下。
首先打開我們存放代碼的文件夾,然后在地址欄輸入 jupyter notebook 然后按回車。
如果你實在找不到代碼存放的位置,右鍵點擊代碼打開屬性。
比如我是放在C:\Users\Administrator\Desktop
然后打開一個新的文件窗口,把這個地址粘貼進去按回車進入這個位置。
繼續前面講的,我們按回車之后就會彈出這個窗口。
找到你要運行的代碼點進去就打開這個代碼了
運行都是一樣的 點 run 就好了,運行之前你下載的數據一定要准備好,沒數據怎么分析呢,對吧~
兄弟們,文章看不會的話,我把視頻教程放在評論區置頂了。