手把手教你Python抓取數(shù)據(jù)并可視化
前言
大家好,這次寫作的目的是為了加深對數(shù)據(jù)可視化pyecharts的認識,也想和大家分享一下。如果下面文章中有錯誤的地方還請指正,哈哈哈?。?!
本次主要用到的第三方庫:
- requests
- pandas
- pyecharts
之所以數(shù)據(jù)可視化選用pyecharts,是因為它含有豐富的精美圖表,地圖,也可輕松集成至 Flask,Django 等主流 Web 框架中,并且在html渲染網(wǎng)頁時把圖片保存下來(這里好像截屏就可以了,),任君挑選?。?!
這次的數(shù)據(jù)采集是從招聘網(wǎng)址上抓取到的python招聘崗位信息,嗯……其實這抓取到的數(shù)據(jù)有點少(只有1200條左右,也沒辦法,崗位太少了…),所以在后面做可視化圖表的時候會導(dǎo)致不好看,駭。本來也考慮過用java(數(shù)據(jù)1萬+)的數(shù)據(jù)來做測試的,但是想到寫的是python,所以也就只能將就用這個數(shù)據(jù)了,當然如果有感興趣的朋友,你們可以用java,前端這些崗位的數(shù)據(jù)來做測試,下面提供的數(shù)據(jù)抓取方法稍微改一下就可以抓取其它崗位了。
好了,廢話不多說,直接開始吧!
一、數(shù)據(jù)抓取篇
1.簡單的構(gòu)建反爬措施
這里為大家介紹一個很好用的網(wǎng)站,可以幫助我們在寫爬蟲時快速構(gòu)建請求頭、cookie這些。但是這個網(wǎng)站也不知為什么,反正在訪問時也經(jīng)常訪問不了!額……,介紹下它的使用吧!首先,我們只需要根據(jù)下面圖片上步驟一樣。
完成之后,我們就復(fù)制好了請求頭里面的內(nèi)容了,然后打開網(wǎng)址https://curlconverter.com/進入后直接在輸入框里Ctrl+v粘貼即可。然后就會在下面解析出內(nèi)容,我們直接復(fù)制就完成了,快速,簡單,哈哈哈。
2.解析數(shù)據(jù)
這里我們請求網(wǎng)址得到的數(shù)據(jù)它并沒有在html元素標簽里面,所以就不能用lxml,css選擇器等這些來解析數(shù)據(jù)。這里我們用re正則來解析數(shù)據(jù),得到的數(shù)據(jù)看到起來好像字典類型,但是它并不是,所以我們還需要用json來把它轉(zhuǎn)化成字典類型的數(shù)據(jù)方便我們提取。
這里用json轉(zhuǎn)化為字典類型的數(shù)據(jù)后,不好查看時,可以用pprint來打印查看。
import pprint pprint.pprint(parse_data_dict)
3.完整代碼
import requests import re import json import csv import time from random import random from fake_useragent import UserAgent def spider_python(key_word): headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-User': '?1', 'Upgrade-Insecure-Requests': '1', 'User-Agent': UserAgent().Chrome, 'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } params = { 'lang': 'c', 'postchannel': '0000', 'workyear': '99', 'cotype': '99', 'degreefrom': '99', 'jobterm': '99', 'companysize': '99', 'ord_field': '0', 'dibiaoid': '0', 'line': '', 'welfare': '', } save_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()).replace(' ', '_').replace(':','_') file_path = f'./testDataPython-{save_time}.csv' f_csv = open(file_path, mode='w', encoding='utf-8', newline='') fieldnames = ['公司名字', '職位名字', '薪資', '工作地點', '招聘要求', '公司待遇','招聘更新時間', '招聘發(fā)布時間', '公司人數(shù)', '公司類型', 'companyind_text', 'job_href', 'company_href'] dict_write = csv.DictWriter(f_csv, fieldnames=fieldnames) dict_write.writeheader() page = 0 #頁數(shù) error_time = 0 #在判斷 職位名字中是否沒有關(guān)鍵字的次數(shù),這里定義出現(xiàn)200次時,while循環(huán)結(jié)束 # (因為在搜索崗位名字時(如:搜索python),會在網(wǎng)站20多頁時就沒有關(guān)于python的崗位了,但是仍然有其它的崗位出現(xiàn),所以這里就需要if判斷,使其while循環(huán)結(jié)束) flag = True while flag: page += 1 print(f'第{page}抓取中……') try: time.sleep(random()*3) #這里隨機休眠一下,簡單反爬處理,反正我們用的是單線程爬取,也不差那一點時間是吧 url='這里你們自己構(gòu)建url吧,從上面的圖片應(yīng)該能看出,我寫出來的話實在是不行,過不了審核,難受?。?!' ###這里還是要添加cookies的好,我們要偽裝好不是?防止反爬,如果你用上面提供的方法,也就很快的構(gòu)建出cookies。 response = requests.get(url=url,params=params, headers=headers) except: print(f'\033[31m第{page}請求異常!033[0m') flag = False parse_data = re.findall('"engine_jds":(.*?),"jobid_count"',response.text) parse_data_dict = json.loads(parse_data[0]) # import pprint # pprint.pprint(parse_data_dict) # exit() for i in parse_data_dict: ###在這里要處理下異常,因為在爬取多頁時,可能是網(wǎng)站某些原因會導(dǎo)致這里的結(jié)構(gòu)變化 try: companyind_text = i['companyind_text'] except Exception as e: print(f'\033[31m異常:{e}033[0m') companyind_text = None dic = { '公司名字': i['company_name'], '職位名字': i['job_name'], '薪資': i['providesalary_text'], '工作地點': i['workarea_text'], '招聘要求': ' '.join(i['attribute_text']), '公司待遇': i['jobwelf'], '招聘更新時間': i['updatedate'], '招聘發(fā)布時間': i['issuedate'], '公司人數(shù)': i['companysize_text'], '公司類型': i['companytype_text'], 'companyind_text': companyind_text, 'job_href': i['job_href'], 'company_href': i['company_href'], } if 'Python' in dic['職位名字'] or 'python' in dic['職位名字']: dict_write.writerow(dic) print(dic['職位名字'], '——保存完畢!') else: error_time += 1 if error_time == 200: flag = False print('抓取完成!') f_csv.close() if __name__ == '__main__': key_word = 'python' # key_word = 'java' ##這里不能輸入中文,網(wǎng)址做了url字體加密,簡單的方法就是直接從網(wǎng)頁url里面復(fù)制下來用(如:前端) # key_word = '%25E5%2589%258D%25E7%25AB%25AF' #前端 spider_python(key_word)
二、數(shù)據(jù)可視化篇
1.數(shù)據(jù)可視化庫選用
本次數(shù)據(jù)可視化選用的是pyecharts第三方庫,它制作圖表是多么的強大與精美?。?!想要對它進行一些簡單地了解話可以前往這篇博文:
http://www.dbjr.com.cn/article/247122.htm
安裝: pip install pyecharts
2.案例實戰(zhàn)
本次要對薪資、工作地點、招聘要求里面的經(jīng)驗與學歷進行數(shù)據(jù)處理并可視化。
(1).柱狀圖Bar
按住鼠標中間滑輪或鼠標左鍵可進行調(diào)控。
import pandas as pd from pyecharts import options as opts python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv') python_data['工作地點'] = [i.split('-')[0] for i in python_data['工作地點']] city = python_data['工作地點'].value_counts() ###柱狀圖 from pyecharts.charts import Bar c = ( Bar() .add_xaxis(city.index.tolist()) #城市列表數(shù)據(jù)項 .add_yaxis("Python", city.values.tolist())#城市對應(yīng)的崗位數(shù)量列表數(shù)據(jù)項 .set_global_opts( title_opts=opts.TitleOpts(title="Python招聘崗位所在城市分布情況"), datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], xaxis_opts=opts.AxisOpts(name='城市'), # 設(shè)置x軸名字屬性 yaxis_opts=opts.AxisOpts(name='崗位數(shù)量'), # 設(shè)置y軸名字屬性 ) .render("bar_datazoom_both.html") )
(2).地圖Map
省份
這里對所在省份進行可視化。
import pandas as pd import copy from pyecharts import options as opts python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv') python_data_deepcopy = copy.deepcopy(python_data) #深復(fù)制一份數(shù)據(jù) python_data['工作地點'] = [i.split('-')[0] for i in python_data['工作地點']] city = python_data['工作地點'].value_counts() city_list = [list(ct) for ct in city.items()] def province_city(): '''這是從接口里爬取的數(shù)據(jù)(不太準,但是誤差也可以忽略不計?。?'' area_data = {} with open('./中國省份_城市.txt', mode='r', encoding='utf-8') as f: for line in f: line = line.strip().split('_') area_data[line[0]] = line[1].split(',') province_data = [] for ct in city_list: for k, v in area_data.items(): for i in v: if ct[0] in i: ct[0] = k province_data.append(ct) area_data_deepcopy = copy.deepcopy(area_data) for k in area_data_deepcopy.keys(): area_data_deepcopy[k] = 0 for i in province_data: if i[0] in area_data_deepcopy.keys(): area_data_deepcopy[i[0]] = area_data_deepcopy[i[0]] +i[1] province_data = [[k,v]for k,v in area_data_deepcopy.items()] best = max(area_data_deepcopy.values()) return province_data,best province_data,best = province_city() #地圖_中國地圖(帶省份)Map-VisualMap(連續(xù)型) c2 = ( Map() .add( "Python",province_data, "china") .set_global_opts( title_opts=opts.TitleOpts(title="Python招聘崗位——全國分布情況"), visualmap_opts=opts.VisualMapOpts(max_=int(best / 2)), ) .render("map_china.html") )
這是 中國省份_城市.txt 里面的內(nèi)容,通過[接口]抓取到的中國地區(qū)信息。
源碼:
import requests import json header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36", } response = requests.get('https://j.i8tq.com/weather2020/search/city.js',headers=header) result = json.loads(response.text[len('var city_data ='):]) print(result) each_province_data = {} f = open('./中國省份_城市.txt',mode='w',encoding='utf-8') for k,v in result.items(): province = k if k in ['上海', '北京', '天津', '重慶']: city = ','.join(list(v[k].keys())) else: city = ','.join(list(v.keys())) f.write(f'{province}_{city}\n') each_province_data[province] = city f.close() print(each_province_data)
城市
這里對所在城市進行可視化。
import pandas as pd import copy from pyecharts import options as opts python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv') python_data_deepcopy = copy.deepcopy(python_data) #深復(fù)制一份數(shù)據(jù) python_data['工作地點'] = [i.split('-')[0] for i in python_data['工作地點']] city = python_data['工作地點'].value_counts() city_list = [list(ct) for ct in city.items()] ###地圖_中國地圖(帶城市)——Map-VisualMap(分段型) from pyecharts.charts import Map c1 = ( Map(init_opts=opts.InitOpts(width="1244px", height="700px",page_title='Map-中國地圖(帶城市)', bg_color="#f4f4f4")) .add( "Python", city_list, "china-cities", #地圖 label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts( title_opts=opts.TitleOpts(title="Python招聘崗位——全國分布情況"), visualmap_opts=opts.VisualMapOpts(max_=city_list[0][1],is_piecewise=True), ) .render("map_china_cities.html") )
地區(qū)
這里對上海地區(qū)可視化。
import pandas as pd import copy from pyecharts import options as opts python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv') python_data_deepcopy = copy.deepcopy(python_data) #深復(fù)制一份數(shù)據(jù) shanghai_data = [] sh = shanghai_data.append for i in python_data_deepcopy['工作地點']: if '上海' in i: if len(i.split('-')) > 1: sh(i.split('-')[1]) shanghai_data = pd.Series(shanghai_data).value_counts() shanghai_data_list = [list(sh) for sh in shanghai_data.items()] #上海地圖 c3 = ( Map() .add("Python", shanghai_data_list, "上海") ###這個可以更改地區(qū)(如:成都)這里改了的話,上面的數(shù)據(jù)處理也要做相應(yīng)的更改 .set_global_opts( title_opts=opts.TitleOpts(title="Map-上海地圖"), visualmap_opts=opts.VisualMapOpts(max_=shanghai_data_list[0][1]) ) .render("map_shanghai.html") )
(3).餅圖Pie
Pie1
from pyecharts import options as opts from pyecharts.charts import Pie import pandas as pd python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv') require_list = [] rl = require_list.append for i in python_data['招聘要求']: if '經(jīng)驗' in i: rl(i.split(' ')[1]) else: rl('未知') python_data['招聘要求'] = require_list require = python_data['招聘要求'].value_counts() require_list = [list(ct) for ct in require.items()] print(require_list) c = ( Pie() .add( "", require_list, radius=["40%", "55%"], label_opts=opts.LabelOpts( position="outside", formatter="{a|{a}}{abg|}\n{hr|}\n {b|: }{c} {per|vvxyksv9kd%} ", background_color="#eee", border_color="#aaa", border_width=1, border_radius=4, rich={ "a": {"color": "#999", "lineHeight": 22, "align": "center"}, "abg": { "backgroundColor": "#e3e3e3", "width": "100%", "align": "right", "height": 22, "borderRadius": [4, 4, 0, 0], }, "hr": { "borderColor": "#aaa", "width": "100%", "borderWidth": 0.5, "height": 0, }, "b": {"fontSize": 16, "lineHeight": 33}, "per": { "color": "#eee", "backgroundColor": "#334455", "padding": [2, 4], "borderRadius": 2, }, }, ), ) .set_global_opts( title_opts=opts.TitleOpts(title="工作經(jīng)驗要求"), legend_opts=opts.LegendOpts(padding=20, pos_left=500), ) .render("pie_rich_label.html") )
Pie2
from pyecharts import options as opts from pyecharts.charts import Pie import pandas as pd python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv') xueli_list = [] xl = xueli_list.append for i in python_data['招聘要求']: if len(i.split(' ')) == 3: xl(i.split(' ')[2]) else: xl('未知') python_data['招聘要求'] = xueli_list xueli_require = python_data['招聘要求'].value_counts() xueli_require_list = [list(ct) for ct in xueli_require.items()] c = ( Pie() .add( "", xueli_require_list, radius=["30%", "55%"], rosetype="area", ) .set_global_opts(title_opts=opts.TitleOpts(title="學歷要求")) .render("pie_rosetype.html") )
(4).折線圖Line
這里對薪資情況進行可視化。
import pandas as pd import re python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv') sal = python_data['薪資'] xin_zi1 = [] xin_zi2 = [] xin_zi3 = [] xin_zi4 = [] xin_zi5 = [] xin_zi6 = [] for s in sal: s = str(s) if '千' in s: xin_zi1.append(s) else: if re.findall('-(.*?)萬',s): s = float(re.findall('-(.*?)萬',s)[0]) if 1.0<s<=1.5: xin_zi2.append(s) elif 1.5<s<=2.5: xin_zi3.append(s) elif 2.5<s<=3.2: xin_zi4.append(s) elif 3.2<s<=4.0: xin_zi5.append(s) else: xin_zi6.append(s) xin_zi = [['<10k',len(xin_zi1)],['10~15k',len(xin_zi2)],['15<25k',len(xin_zi3)], ['25<32k',len(xin_zi4)],['32<40k',len(xin_zi5)],['>40k',len(xin_zi6),]] import pyecharts.options as opts from pyecharts.charts import Line x, y =[i[0] for i in xin_zi],[i[1] for i in xin_zi] c2 = ( Line() .add_xaxis(x) .add_yaxis( "Python", y, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(name="max", coord=[x[2], y[2]], value=y[2])] #name='自定義標記點' ), ) .set_global_opts(title_opts=opts.TitleOpts(title="薪資情況"), xaxis_opts=opts.AxisOpts(name='薪資范圍'), # 設(shè)置x軸名字屬性 yaxis_opts=opts.AxisOpts(name='數(shù)量'), # 設(shè)置y軸名字屬性 ) .render("line_markpoint_custom.html") )
(5).組合圖表
最后,將多個html上的圖表進行合并成一個html圖表。
首先,我們執(zhí)行下面這串格式的代碼(只寫了四個圖表,自己做相應(yīng)添加即可)
import pandas as pd from pyecharts.charts import Bar,Map,Pie,Line,Page from pyecharts import options as opts python_data = pd.read_csv('./testDataPython-2022-05-01_11_48_36.csv') python_data['工作地點'] = [i.split('-')[0] for i in python_data['工作地點']] city = python_data['工作地點'].value_counts() city_list = [list(ct) for ct in city.items()] ###柱狀圖 def bar_datazoom_slider() -> Bar: c = ( Bar() .add_xaxis(city.index.tolist()) #城市列表數(shù)據(jù)項 .add_yaxis("Python", city.values.tolist())#城市對應(yīng)的崗位數(shù)量列表數(shù)據(jù)項 .set_global_opts( title_opts=opts.TitleOpts(title="Python招聘崗位所在城市分布情況"), datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")], xaxis_opts=opts.AxisOpts(name='城市'), # 設(shè)置x軸名字屬性 yaxis_opts=opts.AxisOpts(name='崗位數(shù)量'), # 設(shè)置y軸名字屬性 ) ) return c # 地圖_中國地圖(帶省份)Map-VisualMap(連續(xù)型) def map_china() -> Map: import copy area_data = {} with open('./中國省份_城市.txt', mode='r', encoding='utf-8') as f: for line in f: line = line.strip().split('_') area_data[line[0]] = line[1].split(',') province_data = [] for ct in city_list: for k, v in area_data.items(): for i in v: if ct[0] in i: ct[0] = k province_data.append(ct) area_data_deepcopy = copy.deepcopy(area_data) for k in area_data_deepcopy.keys(): area_data_deepcopy[k] = 0 for i in province_data: if i[0] in area_data_deepcopy.keys(): area_data_deepcopy[i[0]] = area_data_deepcopy[i[0]] + i[1] province_data = [[k, v] for k, v in area_data_deepcopy.items()] best = max(area_data_deepcopy.values()) c = ( Map() .add("Python", province_data, "china") .set_global_opts( title_opts=opts.TitleOpts(title="Python招聘崗位——全國分布情況"), visualmap_opts=opts.VisualMapOpts(max_=int(best / 2)), ) ) return c #餅圖 def pie_rich_label() -> Pie: require_list = [] rl = require_list.append for i in python_data['招聘要求']: if '經(jīng)驗' in i: rl(i.split(' ')[1]) else: rl('未知') python_data['招聘要求'] = require_list require = python_data['招聘要求'].value_counts() require_list = [list(ct) for ct in require.items()] c = ( Pie() .add( "", require_list, radius=["40%", "55%"], label_opts=opts.LabelOpts( position="outside", formatter="{a|{a}}{abg|}\n{hr|}\n {b|: }{c} {per|vvxyksv9kd%} ", background_color="#eee", border_color="#aaa", border_width=1, border_radius=4, rich={ "a": {"color": "#999", "lineHeight": 22, "align": "center"}, "abg": { "backgroundColor": "#e3e3e3", "width": "100%", "align": "right", "height": 22, "borderRadius": [4, 4, 0, 0], }, "hr": { "borderColor": "#aaa", "width": "100%", "borderWidth": 0.5, "height": 0, }, "b": {"fontSize": 16, "lineHeight": 33}, "per": { "color": "#eee", "backgroundColor": "#334455", "padding": [2, 4], "borderRadius": 2, }, }, ), ) .set_global_opts( title_opts=opts.TitleOpts(title="工作經(jīng)驗要求"), legend_opts=opts.LegendOpts(padding=20, pos_left=500), ) ) return c #折線圖 def line_markpoint_custom() -> Line: import re sal = python_data['薪資'] xin_zi1 = [] xin_zi2 = [] xin_zi3 = [] xin_zi4 = [] xin_zi5 = [] xin_zi6 = [] for s in sal: s = str(s) if '千' in s: xin_zi1.append(s) else: if re.findall('-(.*?)萬',s): s = float(re.findall('-(.*?)萬',s)[0]) if 1.0<s<=1.5: xin_zi2.append(s) elif 1.5<s<=2.5: xin_zi3.append(s) elif 2.5<s<=3.2: xin_zi4.append(s) elif 3.2<s<=4.0: xin_zi5.append(s) else: xin_zi6.append(s) xin_zi = [['<10k',len(xin_zi1)],['10~15k',len(xin_zi2)],['15<25k',len(xin_zi3)], ['25<32k',len(xin_zi4)],['32<40k',len(xin_zi5)],['>40k',len(xin_zi6),]] x, y =[i[0] for i in xin_zi],[i[1] for i in xin_zi] c = ( Line() .add_xaxis(x) .add_yaxis( "Python", y, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(name="MAX", coord=[x[2], y[2]], value=y[2])] ), ) .set_global_opts(title_opts=opts.TitleOpts(title="薪資情況"), xaxis_opts=opts.AxisOpts(name='薪資范圍'), # 設(shè)置x軸名字屬性 yaxis_opts=opts.AxisOpts(name='數(shù)量'), # 設(shè)置y軸名字屬性 ) ) return c #合并 def page_draggable_layout(): page = Page(layout=Page.DraggablePageLayout) page.add( bar_datazoom_slider(), map_china(), pie_rich_label(), line_markpoint_custom(), ) page.render("page_draggable_layout.html") if __name__ == "__main__": page_draggable_layout()
執(zhí)行完后,會在當前目錄下生成一個page_draggable_layout.html。
然后我們用瀏覽器打開,就會看到下面這樣,我們可以隨便拖動虛線框來進行組合,組合好后點擊Save Config就會下載一個chart_config.json,然后在文件中找到它,剪切到py當前目錄。
文件放置好后,可以新建一個py文件來執(zhí)行以下代碼,這樣就會生成一個resize_render.html,也就完成了。
from pyecharts.charts import Page Page.save_resize_html('./page_draggable_layout.html',cfg_file='chart_config.json')
最后,點擊打開resize_render.html,我們合并成功的圖表就是這樣啦!
總結(jié)
到此這篇關(guān)于Python抓取數(shù)據(jù)并可視化的文章就介紹到這了,更多相關(guān)Python抓取數(shù)據(jù)可視化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用 Python 玩轉(zhuǎn) GitHub 的貢獻板(推薦)
這篇文章主要介紹了使用 Python 玩轉(zhuǎn) GitHub 的貢獻板的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04Python中利用pyqt5制作指針鐘表顯示實時時間(指針時鐘)
這篇文章主要介紹了Python中利用pyqt5制作指針鐘表顯示實時時間(動態(tài)指針時鐘),本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02在keras中model.fit_generator()和model.fit()的區(qū)別說明
這篇文章主要介紹了在keras中model.fit_generator()和model.fit()的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06