python爬蟲抓取時(shí)常見(jiàn)的小問(wèn)題總結(jié)
前言:
現(xiàn)在寫爬蟲,入門已經(jīng)不是一件門檻很高的事情了,網(wǎng)上教程一大把,但很多爬蟲新手在爬取數(shù)據(jù)的過(guò)程中依舊會(huì)遇到這樣那樣的問(wèn)題。
今天整理了部分新手在爬蟲過(guò)程中遇到的問(wèn)題,希望可以給大家提供一點(diǎn)問(wèn)題解決的思路和參考。
01 無(wú)法正常顯示中文?
使用requests庫(kù)或者urllib庫(kù)獲取源代碼時(shí)無(wú)法正常顯示中文;
r = requests.get('http://xxx')print r.text
使用requests解析中文網(wǎng)頁(yè)時(shí),上述語(yǔ)句在ipython中一直打印的都是亂碼.......
試過(guò)如下代碼:
import sys reload(sys) sys.setdefaultencoding('utf8')
還有類似:
r.text.decode('coding1').encoding('coding2')
都不能湊效!
解決方法
① requests庫(kù)的文本中有兩種類型
- 一種是文本類型,使用text屬性,一種是針對(duì)音頻、視頻、圖片等二進(jìn)制數(shù)據(jù)類型,使用content屬性。
- 一般返回的是text屬性時(shí)會(huì)出現(xiàn)中文亂碼現(xiàn)象,因此在輸出返回之前需要顯示的修改屬性encoding,將其賦值為“utf-8”或者是apparent_encoding即可。
② urllib庫(kù)的文本只有一種就是使用read()方法進(jìn)行讀取
因此要解決中文問(wèn)題,一定要在讀取后加入.decode(“utf-8”),進(jìn)行顯示的轉(zhuǎn)碼之后便不會(huì)出現(xiàn)亂碼問(wèn)題了。
02 加密問(wèn)題
爬蟲一般怎么解決加密問(wèn)題?
① 對(duì)于網(wǎng)頁(yè)端來(lái)說(shuō)通常加密的算法是寫在 js 代碼里的,所以首先你要對(duì) js 語(yǔ)言有所了解。
至少知道 js 基礎(chǔ)的內(nèi)容,其次找到對(duì)應(yīng) js 加密代碼,然后找出關(guān)鍵的函數(shù)。
把 js 代碼在 node.js 環(huán)境進(jìn)行調(diào)試,最后在 Python 環(huán)境下利用 execjs 庫(kù)去執(zhí)行調(diào)試好的代碼。
② 就是模擬瀏覽器環(huán)境直接獲取渲染后的數(shù)據(jù),最常用的手段就是利用 Selenium 框架了。
這種方式非常便利,當(dāng)然對(duì)應(yīng)的缺點(diǎn)就是效率非常低下。不過(guò)現(xiàn)在有新的框架來(lái)取代 Selenium,即 Puppeteer,這個(gè)框架你可以看出是異步版的 Selenium。
對(duì)于爬蟲程序,一個(gè)萬(wàn)能公式:
爬蟲程序 = 網(wǎng)絡(luò)請(qǐng)求 + 數(shù)據(jù)解析 + 數(shù)據(jù)存儲(chǔ)
這三部分就對(duì)應(yīng)這爬蟲的基礎(chǔ),任何一個(gè)爬蟲程序都會(huì)保存這三部分的內(nèi)容,一些復(fù)雜的爬蟲無(wú)非是在此基礎(chǔ)上添加些別的內(nèi)容。一個(gè)爬蟲工程師反爬能力有多強(qiáng),他的爬蟲實(shí)力就有多高。
03 獲取不到網(wǎng)頁(yè)的全部代碼?
問(wèn)題:通過(guò)request方法獲取的網(wǎng)頁(yè)代碼與在瀏覽器看到的網(wǎng)頁(yè)源碼不一致;
解決方法:由于很多網(wǎng)頁(yè)的數(shù)據(jù)傳輸是通過(guò)js命令傳到網(wǎng)頁(yè)的,因此使用request()方法不能獲取通過(guò)js傳遞過(guò)來(lái)的信息代碼。此時(shí)通過(guò)使用selenium庫(kù)來(lái)模擬瀏覽器運(yùn)行,就像真正的用戶在操作一樣,可通過(guò)此方法可獲得該網(wǎng)頁(yè)的源碼。
from selenium.webdriver.support.wait import WebDriverWaitbrowser = webdriver.Chrome()browser.get(Url)html = browser.page_source
04 點(diǎn)擊下一頁(yè)時(shí)網(wǎng)頁(yè)網(wǎng)頁(yè)不變
問(wèn)題:
在爬取的過(guò)程中,由于要爬取每個(gè)律師詳細(xì)信息所對(duì)應(yīng)的網(wǎng)址,因此涉及到翻頁(yè)的問(wèn)題,但在網(wǎng)頁(yè)上實(shí)時(shí)點(diǎn)擊下一頁(yè)時(shí)發(fā)現(xiàn)網(wǎng)址并沒(méi)有發(fā)生變化。
解決方法:
通過(guò)使用selenium中nextpagebutton.click()方法來(lái)模擬跳轉(zhuǎn)到下一頁(yè),從而對(duì)下一頁(yè)的內(nèi)容進(jìn)行獲取。
nextpagebutton = browser.find_element_by_xpath('//*[@class="next_page"]') # 定位到“下一頁(yè)”按鈕 nextpagebutton.click() # 模擬點(diǎn)擊下一頁(yè) wait = WebDriverWait(browser, 10) # 瀏覽器等待10s
05 文本節(jié)點(diǎn)問(wèn)題
首先看兩個(gè)HTML代碼,這是你眼中的HTML代碼:
這是計(jì)算機(jī)眼中的HTML代碼:
解決方法:
在BS4中,我們?cè)贖TML中看到的換行符以及空格都是NavigableString 也就是文本節(jié)點(diǎn)。
06 如何快速找到提取數(shù)據(jù)?
解析網(wǎng)頁(yè)時(shí),如何快速找到數(shù)據(jù)存放的位置,并提取其中的數(shù)據(jù)?
這是很多新手會(huì)遇到的一個(gè)問(wèn)題;就是雖然運(yùn)行我的代碼沒(méi)有問(wèn)題,大概邏輯也能讀得懂,但是想修改一下爬取同類網(wǎng)站,或者同一個(gè)網(wǎng)站的其他數(shù)據(jù)時(shí)卻不知從何下手。
這個(gè)其實(shí)是對(duì)工具使用不熟悉而已;我這里簡(jiǎn)單講解一下(beautifulSoup)常用的使用技巧,當(dāng)然它有很多強(qiáng)大便捷的功能。我這里只介紹幾個(gè)常用的函數(shù),這幾個(gè)用好了一樣可以應(yīng)付幾乎所有網(wǎng)站。首先,爬取之前需要定位到數(shù)據(jù)所在的標(biāo)簽,這個(gè)使用 F12 開(kāi)發(fā)者工具中的這個(gè)按鈕,點(diǎn)一下按鈕,然后點(diǎn)一下網(wǎng)頁(yè),可以很快定位到頁(yè)面中的相應(yīng)標(biāo)簽。這步就不詳細(xì)說(shuō)了,很簡(jiǎn)單的,自己摸索一下。
接下來(lái)介紹如何用代碼獲取那個(gè)標(biāo)簽;
首先你觀察你要找到的標(biāo)簽,是什么標(biāo)簽?是否有 class 或者 id 這樣的屬性(如果沒(méi)有就找找它父標(biāo)簽有沒(méi)有,盡量找這樣的)因?yàn)?class 和 id 這兩個(gè)屬性作為篩選條件的話,查找到的干擾項(xiàng)極少,運(yùn)氣好的話,基本上可以一擊必中。
這里介紹 beautifulSoup 中的兩個(gè)函數(shù),find 和 find_all 函數(shù);
比如我們要獲取上圖中箭頭所指的,id 為 ozoom 的 div 標(biāo)簽時(shí),我們可以這樣:
# html 是之前發(fā)起請(qǐng)求獲取到的網(wǎng)頁(yè)內(nèi)容 bsobj = bs4.BeautifulSoup(html,'html.parser') # 獲取 id 為 ozoom 的 div 標(biāo)簽 # 根據(jù) id 查找標(biāo)簽 div = bsobj.find('div', attrs = {'id' : 'ozoom'}) # 繼續(xù)獲取 div 下的 class 為 list_t 的 div 標(biāo)簽 # 根據(jù) class 查找標(biāo)簽 title = div.find('div', attrs = {'class': 'list_t'})
注意:
如果標(biāo)簽有 id 屬性的話盡量用 id 來(lái)查找,因?yàn)檎麄€(gè)頁(yè)面 id 是唯一的。用 class 查找的話,最好現(xiàn)在瀏覽器的網(wǎng)頁(yè)源碼中 Ctrl + F 搜索一下,相同 class 的標(biāo)簽有多少。(如果比較多的話,可以嘗試先查找他的父標(biāo)簽,縮小范圍之后再查找)然后我們?cè)僦v講 find_all 函數(shù),適用于一次性查找一類型的很多標(biāo)簽的情況,
比如下圖這種情況:
列表中的每一個(gè) li 標(biāo)簽中,都是一條數(shù)據(jù),我們需要將它們都獲取到,如果是用前面的 find 函數(shù)的話,每次只能獲取一個(gè) li 標(biāo)簽。
所以我們需要使用 find_all 函數(shù),一次性獲取所有符合條件的標(biāo)簽,存儲(chǔ)為數(shù)組返回。
由于 li 標(biāo)簽沒(méi)有 id 也沒(méi)有 class ,而頁(yè)面中存在很多無(wú)關(guān)的干擾的 li 標(biāo)簽,所以我們需要先從它的父標(biāo)簽往上找,縮小查找范圍。
找到 id 為 titleList 的 div 標(biāo)簽之后,觀察一下,里面的 li 標(biāo)簽都是需要的,直接 find_all 函數(shù)一下都獲取完。
# html 是獲取的目標(biāo)網(wǎng)頁(yè)內(nèi)容 html = fetchUrl(pageUrl) bsobj = bs4.BeautifulSoup(html,'html.parser') pDiv = bsobj.find('div', attrs = {'id': 'titleList'}) titleList = pDiv.find_all('li')
基本上把 find 和 find_all 函數(shù)組合使用,用熟練
了可以應(yīng)付幾乎所有的 html 網(wǎng)頁(yè)了。
07 獲取標(biāo)簽中的數(shù)據(jù)
查找到標(biāo)簽之后,又該如何獲取標(biāo)簽中的數(shù)據(jù)呢?
標(biāo)簽中的數(shù)據(jù)位置,一般有兩種情況:
<!--第一種,位于標(biāo)簽內(nèi)容里--> <p>這是數(shù)據(jù)這是數(shù)據(jù)</p> <!--第二種,位于標(biāo)簽屬性里--> <a href="/xxx.xxx_xx_xx.html" rel="external nofollow" ></a>
如果是第一種情況很簡(jiǎn)單,直接 pTip.text 即可;(pTip 是前面已經(jīng)獲取好的 p 標(biāo)簽)
如果是第二種情況,需要看它是在哪一個(gè)屬性里的數(shù)據(jù),比如我們要獲取上面 a 標(biāo)簽中的 href 屬性中的鏈接,可以 link = aTip["href"] 即可。(aTip 是前面已經(jīng)獲取好的 a 標(biāo)簽)。
08 去除指定內(nèi)容
去除獲取內(nèi)容首尾的指定字符串;
問(wèn)題:
有時(shí)我們?cè)谂老x過(guò)程中,獲取到的信息并不是全部都是我們想要獲取的內(nèi)容,如果想要去除指定內(nèi)容。
例如:字符串 a = [“aaaa”],但是只想獲取中間的aaaa
解決:
可以通過(guò)使用正則表達(dá)式來(lái)提取文本內(nèi)容,去除符號(hào),但如果使用此方法,字符串中間包含的符號(hào)也會(huì)被去掉。如果確定想要獲取的文本中間不含有符號(hào),可以選用正則表達(dá)式。
x = strTemp.xpath('./div[3]/div[1]/div/div/div[1]/div/ul/li[14]//text()') xx = str(x) email = re.search(r'[\u4e00-\u9fa5a-zA-Z0-9]+', xx)
第二種方法是使用strip()方法來(lái)去除首尾的符號(hào);
a = td[1].get_text().strip('[""]')
09 轉(zhuǎn)化為字符串類型
通過(guò)正則表達(dá)式獲取的內(nèi)容是match類型,如何轉(zhuǎn)化為字符串str類型?
解決辦法:使用group(0)來(lái)轉(zhuǎn)化為字符串類型
email = email.group(0)
10 濫用遍歷文檔樹(shù)
常見(jiàn)的方法有:
- contents
- descendants
- parent
- next_sibling
- next_element
這些方法都會(huì)遍歷文檔樹(shù)中的所有節(jié)點(diǎn),包括文本節(jié)點(diǎn)。也就是說(shuō)只要你使用這些方法,你就一定會(huì)選擇出許多文本節(jié)點(diǎn),因?yàn)槲谋竟?jié)點(diǎn)無(wú)處不在,換行、空格等。
解決方法:使用過(guò)濾器find等方法;
soup.find(name=‘tagname')
當(dāng)我們一旦在過(guò)濾器中指定了name關(guān)鍵字,那么返回的結(jié)果就一定是tag對(duì)象,因?yàn)槲臋n節(jié)點(diǎn)沒(méi)有name屬性。
結(jié)論:大多數(shù)情況下,你需要的是find 這一類過(guò)濾器,而不是遍歷所有節(jié)點(diǎn)。
11 數(shù)據(jù)庫(kù)保存問(wèn)題
在將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)的過(guò)程中,遇到的一些問(wèn)題如下:
1)爬取后的內(nèi)容是列表形式,如何轉(zhuǎn)化為字符串類型?
解決辦法:使用str()方法
b = strTemp.xpath('./div[3]/div[1]/div/div/div[1]/div/ul/li[3]//text()') agee = str(b)
注意:數(shù)據(jù)庫(kù)中對(duì)對(duì)應(yīng)的字段類型要與python中一致;
2)python 與 mysql 數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(host='localhost', user='root', password='zaizaizai', db='layer', charset='utf8mb4') try: # 獲取會(huì)話指針 with connection.cursor() as cursor: # 創(chuàng)建SQL語(yǔ)句 sql = "insert into layer(namee,organization,sex,age,nation,edu,leixing,zhengzhi,numberr,first_time,get_time,status,paizhu,sifaju,email) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) " # 執(zhí)行SQL語(yǔ)句 cursor.execute(sql, (namee, organization, sex, age, nation, edu, leixing, zhengzhi, numberr, first_time, get_time, status, paizhu, sifaju, email)) # 提交 connection.commit() finally: connection.close()
3)保存在一個(gè)文件夾里的圖片不停的被后來(lái)抓取的圖片覆蓋掉?可能是變量放在for 循環(huán)內(nèi)外出現(xiàn)的問(wèn)題,修改后解決此問(wèn)題,用一些小例子做測(cè)試:
#測(cè)試一 x=0 for i in range(0,10): for j in range(0,10): print x x+=1 for i in range(0,10): x=0 for j in range(0,10): print x x+=1 #測(cè)試二 >>> x=0 >>> for i in range(0,10): print('the i is',i) x=0 for j in range(0,10): print('the j is',j) print('the x is',x) x+=1 >>> for i in range(0,10): print('the i is',i) x=0 for j in range(0,10): print('the j is',j) print('the x is',x) x=x+1
12 爬蟲采集遇到的墻問(wèn)題
主要表現(xiàn)就是訪問(wèn)不了了、訪問(wèn)幾次就斷了,然后手動(dòng)訪問(wèn),或者換個(gè)終端以后完全沒(méi)問(wèn)題。?
面對(duì)這種情況,我們首先先想一下以下這幾個(gè)問(wèn)題:
- 爬蟲是否過(guò)于頻繁訪問(wèn)?影響了對(duì)方服務(wù)器的業(yè)務(wù)?
- 爬蟲采集是否觸犯了對(duì)方的防御機(jī)制?
- 爬蟲是否有bug導(dǎo)致對(duì)方不堪重負(fù)?
以上這些主觀問(wèn)題是紅線問(wèn)題,是要考慮到的,自己要把握好爬蟲的分寸,不能損壞他人合法利益??偨Y(jié)了一下遇到一些被管理員和防火墻攔截的問(wèn)題和原因;
1)管理員不想讓你訪問(wèn),這種情況分兩種:
第一種:管理員登錄后臺(tái)一看,有個(gè)家伙10個(gè)小時(shí)就訪問(wèn)了我的1萬(wàn)次,不帶停的?。∪绻俏?,第一反應(yīng)就是封了再說(shuō),肯定有問(wèn)題,都不用分析。
第二種:我感覺(jué)有人在爬數(shù)據(jù),我要把他找出來(lái)。
2)網(wǎng)站配置不讓你訪問(wèn)這個(gè)主要是網(wǎng)站限制;比如tomcat或者Nginx,限制某個(gè)連接訪問(wèn)時(shí)間,因?yàn)槿绻@個(gè)連接一直在這里,然后不斷有新的連接進(jìn)來(lái),那么連接池遲早滿了,最終完蛋。
你這就是要DDOS攻擊我,所以我可以設(shè)置多長(zhǎng)時(shí)間你沒(méi)動(dòng)靜,我就給你斷了。
3)防火墻配置
這個(gè)就難了,因?yàn)榉阑饓艿暮芗?xì),如果是服務(wù)器WAF那就很頭疼,他在攔截DDOS的時(shí)候,就非常容易把爬蟲也攔截掉。如果要繞過(guò)WAF,那就是一種入侵行為了,要從頁(yè)面采集數(shù)據(jù)就只能欺騙WAF,繼續(xù)刷新數(shù)據(jù)頁(yè)面。
4)如何避開(kāi)以上策略,主要就是欺騙和偽裝。
逃避IP識(shí)別
通過(guò)采用或者構(gòu)建IP代理,變換IP地址,減少單IP對(duì)規(guī)則的觸發(fā),封禁惡意IP是網(wǎng)站管理過(guò)程中最常用的方式。
變換請(qǐng)求內(nèi)容
雖然你的IP變了,但還是這個(gè)瀏覽器、還是這個(gè)cookies記錄,也會(huì)被識(shí)別。這個(gè)可以通過(guò)變換cookies和header進(jìn)行偽裝。
降低訪問(wèn)頻率
一般如果單位時(shí)間內(nèi),訪問(wèn)網(wǎng)站的次數(shù)過(guò)高,很容易被判斷為是CC攻擊。并且會(huì)對(duì)服務(wù)器帶來(lái)很大的壓力,影響正常業(yè)務(wù)。這就背離了我們進(jìn)行數(shù)據(jù)采集的初衷了,所以設(shè)置一個(gè)sleep(),降低一下刷新頻率,減少一些對(duì)服務(wù)器資源的占用。
慢速攻擊判別
慢了也會(huì)被干掉的!?慢速攻擊是 http 慢速攻擊是利用http合法機(jī)制,在建立連接后盡量長(zhǎng)時(shí)間保持連接,不釋放,達(dá)到對(duì)HTTP服務(wù)攻擊。攻擊者發(fā)送POST請(qǐng)求,自行構(gòu)造報(bào)文向服務(wù)器提交數(shù)據(jù),將報(bào)文長(zhǎng)度設(shè)置一個(gè)很大的值。
且在隨后每次發(fā)送中,每次只發(fā)送一個(gè)很小的報(bào)文,這樣導(dǎo)致服務(wù)器一直等待數(shù)據(jù),連接始終一直被占用。如果攻擊者使用多線程或傀儡機(jī)子去做同樣操作,服務(wù)器WEB容器很快就被占滿TCP連接而不再接受新請(qǐng)求,從而導(dǎo)致服務(wù)器崩潰、服務(wù)失效。這個(gè)最好就是采用多線程異步采集,同時(shí)及時(shí)把之前的連接關(guān)閉,并且控制數(shù)量進(jìn)行。
總之,在采集數(shù)據(jù)的時(shí)候,多站在別人的角度上思考,采用別人能接受的方式獲取數(shù)據(jù),別人才能讓你好好的獲取數(shù)據(jù)。這是一個(gè)雙贏的行為,不然就只能從入門到入牢的轉(zhuǎn)變了,大家都不容易,互相給口飯吃。
13 驗(yàn)證碼問(wèn)題
驗(yàn)證碼的問(wèn)題一般如何解決?大體的思路有兩種:
- 正向破解
- 逆向破解
正向破解
比如常見(jiàn)的圖形驗(yàn)證碼,你可以首先把圖片保存下來(lái),然后利用一些圖文識(shí)別圖去識(shí)別相應(yīng)的內(nèi)容。對(duì)于滑塊驗(yàn)證碼,你可以利用 Selenium 框架去計(jì)算缺口的距離,然后模擬鼠標(biāo)拖動(dòng)滑塊。
逆向破解
這個(gè)就涉及到驗(yàn)證碼的實(shí)現(xiàn)邏輯,你需要看懂對(duì)方驗(yàn)證碼實(shí)現(xiàn)的邏輯??纯窗l(fā)送驗(yàn)證碼請(qǐng)求的時(shí)候需要哪些參數(shù),而這些參數(shù)又是怎么生成的,模擬請(qǐng)求。
逆向破解屬于短暫型的省力做法,但相應(yīng)的難度非常的大。-> 直接使用打碼平臺(tái)上面說(shuō)兩種方式都屬于非常耗時(shí)耗力的行為,而且一旦對(duì)方網(wǎng)站反爬策略更新,你的代碼就會(huì)失效。所以能花錢解決的事,大家就選擇直接使用打碼平臺(tái)就好。?
學(xué)會(huì)Python爬蟲需要具備三部分的內(nèi)容:
- Python 基礎(chǔ)
- 爬蟲基礎(chǔ)
- 反爬的學(xué)習(xí)
這三部分內(nèi)容是做爬蟲的必備基礎(chǔ),主流語(yǔ)言是使用Python,Python有非常豐富的爬蟲庫(kù)可以直接使用,非常的方便。
到此這篇關(guān)于python爬蟲抓取時(shí)常見(jiàn)的小問(wèn)題總結(jié)的文章就介紹到這了,更多相關(guān)python問(wèn)題總結(jié)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)普通圖片轉(zhuǎn)ico圖標(biāo)的方法詳解
ICO是一種圖標(biāo)文件格式,圖標(biāo)文件可以存儲(chǔ)單個(gè)圖案、多尺寸、多色板的圖標(biāo)文件。本文將利用Python實(shí)現(xiàn)普通圖片轉(zhuǎn)ico圖標(biāo),感興趣的小伙伴可以了解一下2022-11-11Python+uiautomator2實(shí)現(xiàn)自動(dòng)刷抖音視頻功能
這篇文章主要介紹了Python+uiautomator2實(shí)現(xiàn)自動(dòng)刷抖音視頻功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04python實(shí)現(xiàn)IOU計(jì)算案例
這篇文章主要介紹了python實(shí)現(xiàn)IOU計(jì)算案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python使用參數(shù)對(duì)嵌套字典進(jìn)行取值的方法
這篇文章主要介紹了python使用參數(shù)對(duì)嵌套字典進(jìn)行取值,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04基于Python實(shí)現(xiàn)模擬三體運(yùn)動(dòng)的示例代碼
此前所做的一切三體和太陽(yáng)系的動(dòng)畫,都是基于牛頓力學(xué)的,而且直接對(duì)微分進(jìn)行差分化,從而精度非常感人,用不了幾年就得撞一起去。所以本文來(lái)用Python重新模擬一下三體運(yùn)動(dòng),感興趣的可以了解一下2023-03-03python wav模塊獲取采樣率 采樣點(diǎn)聲道量化位數(shù)(實(shí)例代碼)
這篇文章主要介紹了python wav模塊獲取采樣率 采樣點(diǎn)聲道量化位數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01