精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

爬蟲與反爬蟲技術(shù)簡介

安全
本文一方面從爬蟲與反反爬的角度來說明如何高效的對網(wǎng)絡(luò)上的公開數(shù)據(jù)進(jìn)行爬取,另一方面也會介紹反爬蟲的技術(shù)手段,為防止外部爬蟲大批量的采集數(shù)據(jù)的過程對服務(wù)器造成超負(fù)載方面提供些許建議。

作者 | vivo 互聯(lián)網(wǎng)安全團(tuán)隊(duì)- Xie Peng

互聯(lián)網(wǎng)的大數(shù)據(jù)時(shí)代的來臨,網(wǎng)絡(luò)爬蟲也成了互聯(lián)網(wǎng)中一個(gè)重要行業(yè),它是一種自動獲取網(wǎng)頁數(shù)據(jù)信息的爬蟲程序,是網(wǎng)站搜索引擎的重要組成部分。通過爬蟲,可以獲取自己想要的相關(guān)數(shù)據(jù)信息,讓爬蟲協(xié)助自己的工作,進(jìn)而降低成本,提高業(yè)務(wù)成功率和提高業(yè)務(wù)效率。

本文一方面從爬蟲與反反爬的角度來說明如何高效的對網(wǎng)絡(luò)上的公開數(shù)據(jù)進(jìn)行爬取,另一方面也會介紹反爬蟲的技術(shù)手段,為防止外部爬蟲大批量的采集數(shù)據(jù)的過程對服務(wù)器造成超負(fù)載方面提供些許建議。

爬蟲指的是按照一定規(guī)則自動抓取萬維網(wǎng)信息的程序,本次主要會從爬蟲的技術(shù)原理與實(shí)現(xiàn),反爬蟲與反反爬蟲兩個(gè)方面進(jìn)行簡單的介紹,介紹的案例均只是用于安全研究和學(xué)習(xí),并不會進(jìn)行大量爬蟲或者應(yīng)用于商業(yè)。

一、爬蟲的技術(shù)原理與實(shí)現(xiàn)

1.1 爬蟲的定義

爬蟲分為通用爬蟲和聚焦爬蟲兩大類,前者的目標(biāo)是在保持一定內(nèi)容質(zhì)量的情況下爬取盡可能多的站點(diǎn),比如百度這樣的搜索引擎就是這種類型的爬蟲,如圖1是通用搜索引擎的基礎(chǔ)架構(gòu):

  • 首先在互聯(lián)網(wǎng)中選出一部分網(wǎng)頁,以這些網(wǎng)頁的鏈接地址作為種子URL;
  • 將這些種子URL放入待抓取的URL隊(duì)列中,爬蟲從待抓取的URL隊(duì)列依次讀?。?/li>
  • 將URL通過DNS解析,把鏈接地址轉(zhuǎn)換為網(wǎng)站服務(wù)器對應(yīng)的IP地址;
  • 網(wǎng)頁下載器通過網(wǎng)站服務(wù)器對網(wǎng)頁進(jìn)行下載,下載的網(wǎng)頁為網(wǎng)頁文檔形式;
  • 對網(wǎng)頁文檔中的URL進(jìn)行抽取,并過濾掉已經(jīng)抓取的URL;
  • 對未進(jìn)行抓取的URL繼續(xù)循環(huán)抓取,直至待抓取URL隊(duì)列為空。

圖片

圖1.通用搜索引擎的基礎(chǔ)架構(gòu)

爬蟲通常從一個(gè)或多個(gè) URL 開始,在爬取的過程中不斷將新的并且符合要求的 URL 放入待爬隊(duì)列,直到滿足程序的停止條件。

而我們?nèi)粘R姷降呐老x基本為后者,目標(biāo)是在爬取少量站點(diǎn)的情況下盡可能保持精準(zhǔn)的內(nèi)容質(zhì)量。典型的比如圖2搶票軟件所示,就是利用爬蟲來登錄售票網(wǎng)絡(luò)并爬取信息,從而輔助商業(yè)。

圖片

圖2.搶票軟件

了解了爬蟲的定義后,那么應(yīng)該如何編寫爬蟲程序來爬取我們想要的數(shù)據(jù)呢。我們可以先了解下目前常用的爬蟲框架,因?yàn)樗梢詫⒁恍┏R娕老x功能的實(shí)現(xiàn)代碼寫好,然后留下一些接口,在做不同的爬蟲項(xiàng)目時(shí),我們只需要根據(jù)實(shí)際情況,手寫少量需要變動的代碼部分,并按照需要調(diào)用這些接口,即可以實(shí)現(xiàn)一個(gè)爬蟲項(xiàng)目。

1.2 爬蟲框架介紹

常用的搜索引擎爬蟲框架如圖3所示,首先Nutch是專門為搜索引擎設(shè)計(jì)的爬蟲,不適合用于精確爬蟲。Pyspider和Scrapy都是python語言編寫的爬蟲框架,都支持分布式爬蟲。另外Pyspider由于其可視化的操作界面,相比Scrapy全命令行的操作對用戶更加友好,但是功能不如Scrapy強(qiáng)大。

圖片

圖3.爬蟲框架對比

1.3 爬蟲的簡單示例

 除了使用爬蟲框架來進(jìn)行爬蟲,也可以從頭開始來編寫爬蟲程序,步驟如圖4所示:

圖片

圖4.爬蟲的基本原理

接下來通過一個(gè)簡單的例子來實(shí)際演示上述的步驟,我們要爬取的是某應(yīng)用市場的榜單,以這個(gè)作為例子,是因?yàn)檫@個(gè)網(wǎng)站沒有任何的反爬蟲手段,我們通過上面的步驟可以輕松爬取到內(nèi)容。

圖片

圖片


圖5.網(wǎng)頁與其對應(yīng)的源代碼

網(wǎng)頁與其對應(yīng)的源代碼如圖5所示,對于網(wǎng)頁上的數(shù)據(jù),假定我們想要爬取排行榜上每個(gè)app的名稱以及其分類。

我們首先分析網(wǎng)頁源代碼,發(fā)現(xiàn)可以直接在網(wǎng)頁源代碼中搜索到“抖音”等app的名稱,接著看到app名稱、app類別等都是在一個(gè)<li>標(biāo)簽里,所以我們只需要請求網(wǎng)頁地址,拿到返回的網(wǎng)頁源代碼,然后對網(wǎng)頁源代碼進(jìn)行正則匹配,提取出想要的數(shù)據(jù),保存下來即可,如圖6所示。

#獲取網(wǎng)頁源碼
def get_one_page(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
#正則匹配提取目標(biāo)信息并形成字典
def parse_one_page(html):
pattern = re.compile('<li>.*?data-src="(.*?)".*?<h5>.*?det.*?>(.*?)</a>.*?p.*?<a.*?>(.*?)</a>.*?</li>',re.S)
items = re.findall(pattern, html)
j = 1
for item in items[:-1]:
yield {'index': str(j),
'name': item[1],
'class':item[2]
}
j = j+1
#結(jié)果寫入txt
def write_to_file(content):
with open(r'test.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False)+'\n')

圖片

圖6.爬蟲的代碼以及結(jié)果

二、反爬蟲相關(guān)技術(shù)

在了解具體的反爬蟲措施之前,我們先介紹下反爬蟲的定義和意義,限制爬蟲程序訪問服務(wù)器資源和獲取數(shù)據(jù)的行為稱為反爬蟲。爬蟲程序的訪問速率和目的與正常用戶的訪問速率和目的是不同的,大部分爬蟲會無節(jié)制地對目標(biāo)應(yīng)用進(jìn)行爬取,這給目標(biāo)應(yīng)用的服務(wù)器帶來巨大的壓力。爬蟲程序發(fā)出的網(wǎng)絡(luò)請求被運(yùn)營者稱為“垃圾流量”。開發(fā)者為了保證服務(wù)器的正常運(yùn)轉(zhuǎn)或降低服務(wù)器的壓力與運(yùn)營成本,不得不使出各種各樣的技術(shù)手段來限制爬蟲對服務(wù)器資源的訪問。

所以為什么要做反爬蟲,答案是顯然的,爬蟲流量會提升服務(wù)器的負(fù)載,過大的爬蟲流量會影響到服務(wù)的正常運(yùn)轉(zhuǎn),從而造成收入損失,另一方面,一些核心數(shù)據(jù)的外泄,會使數(shù)據(jù)擁有者失去競爭力。

常見的反爬蟲手段,如圖7所示。主要包含文本混淆、頁面動態(tài)渲染、驗(yàn)證碼校驗(yàn)、請求簽名校驗(yàn)、大數(shù)據(jù)風(fēng)控、js混淆和蜜罐等,其中文本混淆包含css偏移、圖片偽裝文本、自定義字體等,而風(fēng)控策略的制定則往往是從參數(shù)校驗(yàn)、行為頻率和模式異常等方面出發(fā)的。

圖片

圖7.常見的反爬蟲手段

2.1 CSS偏移反爬蟲

在搭建網(wǎng)頁的時(shí)候,需要用CSS來控制各類字符的位置,也正是如此,可以利用CSS來將瀏覽器中顯示的文字,在HTML中以亂序的方式存儲,從而來限制爬蟲。CSS偏移反爬蟲,就是一種利用CSS樣式將亂序的文字排版成人類正常閱讀順序的反爬蟲手段。這個(gè)概念不是很好理解,我們可以通過對比兩段文字來加深對這個(gè)概念的理解:

  • HTML 文本中的文字:我的學(xué)號是 1308205,我在北京大學(xué)讀書。
  • 瀏覽器顯示的文字:我的學(xué)號是 1380205,我在北京大學(xué)讀書。

以上兩段文字中瀏覽器顯示的應(yīng)該是正確的信息,如果我們按之前提到的爬蟲步驟,分析網(wǎng)頁后正則提取信息,會發(fā)現(xiàn)學(xué)號是錯(cuò)的。

接著看圖8所示的例子,如果我們想爬取該網(wǎng)頁上的機(jī)票信息,首先需要分析網(wǎng)頁。紅框所示的價(jià)格467對應(yīng)的是中國民航的從石家莊到上海的機(jī)票,但是分析網(wǎng)頁源代碼發(fā)現(xiàn)代碼中有 3 對 b 標(biāo)簽,第 1 對 b 標(biāo)簽中包含 3 對 i 標(biāo)簽,i 標(biāo)簽中的數(shù)字都是 7,也就是說第 1 對 b 標(biāo)簽的顯示結(jié)果應(yīng)該是 777。而第 2 對 b 標(biāo)簽中的數(shù)字是 6,第 3 對 b 標(biāo)簽中的數(shù)字是 4,這樣的話我們會無法直接通過正則匹配得到正確的機(jī)票價(jià)格。

圖片

圖8.CSS 偏移反爬蟲例子

2.2 圖片偽裝反爬蟲

圖片偽裝反爬蟲,它的本質(zhì)就是用圖片替換了原來的內(nèi)容,從而讓爬蟲程序無法正常獲取,如圖9所示。這種反爬蟲的原理十分簡單,就是將本應(yīng)是普通文本內(nèi)容的部分在前端頁面中用圖片來進(jìn)行替換,遇到這種案例可以直接用ocr識別圖片中的文字就可以繞過。而且因?yàn)槭怯脠D片替換文本顯示,所以圖片本身會相對比較清晰,沒有很多噪聲干擾,ocr識別的結(jié)果會很準(zhǔn)確。

圖片

圖9. 圖片偽裝反爬蟲例子

2.3 自定義字體反爬蟲

在 CSS3 時(shí)代,開發(fā)者可以使用@font-face為網(wǎng)頁指定字體。開發(fā)者可將心儀的字體文件放在 Web 服務(wù)器上,并在 CSS 樣式中使用它。用戶使用瀏覽器訪問 Web 應(yīng)用時(shí),對應(yīng)的字體會被瀏覽器下載到用戶的計(jì)算機(jī)上,但是我們在使用爬蟲程序時(shí),由于沒有相應(yīng)的字體映射關(guān)系,直接爬取就會無法得到有效數(shù)據(jù)。

如圖10所示,該網(wǎng)頁中每個(gè)店鋪的評價(jià)數(shù)、人均、口味、環(huán)境等信息均是亂碼字符,爬蟲無法直接讀取到內(nèi)容。

圖片

圖10. 自定義字體反爬蟲例子

2.4 頁面動態(tài)渲染反爬蟲

網(wǎng)頁按渲染方式的不同,大體可以分為客戶端和服務(wù)端渲染。

  • 服務(wù)端渲染,頁面的結(jié)果是由服務(wù)器渲染后返回的,有效信息包含在請求的 HTML 頁面里面,通過查看網(wǎng)頁源代碼可以直接查看到數(shù)據(jù)等信息;
  • 客戶端渲染,頁面的主要內(nèi)容由 JavaScript 渲染而成,真實(shí)的數(shù)據(jù)是通過 Ajax 接口等形式獲取的,通過查看網(wǎng)頁源代碼,無有效數(shù)據(jù)信息。

客戶端渲染和服務(wù)器端渲染的最重要的區(qū)別就是究竟是誰來完成html文件的完整拼接,如果是在服務(wù)器端完成的,然后返回給客戶端,就是服務(wù)器端渲染,而如果是前端做了更多的工作完成了html的拼接,則就是客戶端渲染。

圖片

圖片

圖11.客戶端渲染例子

2.5 驗(yàn)證碼反爬蟲

幾乎所有的應(yīng)用程序在涉及到用戶信息安全的操作時(shí),都會彈出驗(yàn)證碼讓用戶進(jìn)行識別,以確保該操作為人類行為,而不是大規(guī)模運(yùn)行的機(jī)器。那為什么會出現(xiàn)驗(yàn)證碼呢?在大多數(shù)情形下是因?yàn)榫W(wǎng)站的訪問頻率過高或者行為異常,或者是為了直接限制某些自動化行為。歸類如下:

  1. 很多情況下,比如登錄和注冊,這些驗(yàn)證碼幾乎是必現(xiàn)的,它的目的就是為了限制惡意注冊、惡意爆破等行為,這也算反爬的一種手段。
  2. 一些網(wǎng)站遇到訪問頻率過高的行為的時(shí)候,可能會直接彈出一個(gè)登錄窗口,要求我們登錄才能繼續(xù)訪問,此時(shí)的驗(yàn)證碼就直接和登錄表單綁定在一起了,這就算檢測到異常之后利用強(qiáng)制登錄的方式進(jìn)行反爬。
  3. 一些較為常規(guī)的網(wǎng)站如果遇到訪問頻率稍高的情形的時(shí)候,會主動彈出一個(gè)驗(yàn)證碼讓用戶識別并提交,驗(yàn)證當(dāng)前訪問網(wǎng)站的是不是真實(shí)的人,用來限制一些機(jī)器的行為,實(shí)現(xiàn)反爬蟲。

常見的驗(yàn)證碼形式包括圖形驗(yàn)證碼、行為驗(yàn)證碼、短信、掃碼驗(yàn)證碼等,如圖12所示。對于能否成功通過驗(yàn)證碼,除了能夠準(zhǔn)確的根據(jù)驗(yàn)證碼的要求完成相應(yīng)的點(diǎn)擊、選擇、輸入等,通過驗(yàn)證碼風(fēng)控也至關(guān)重要;比如對于滑塊驗(yàn)證碼,驗(yàn)證碼風(fēng)控可能會針對滑動軌跡進(jìn)行檢測,如果檢測出軌跡非人為,就會判定為高風(fēng)險(xiǎn),導(dǎo)致無法成功通過。

圖片

圖12.驗(yàn)證碼反爬蟲手段

2.6 請求簽名校驗(yàn)反爬蟲

簽名驗(yàn)證是防止服務(wù)器被惡意鏈接和篡改數(shù)據(jù)的有效方式之一,也是目前后端API最常用的防護(hù)方式之一。簽名是一個(gè)根據(jù)數(shù)據(jù)源進(jìn)行計(jì)算或者加密的過程,用戶經(jīng)過簽名后會一個(gè)具有一致性和唯一性的字符串,它就是你訪問服務(wù)器的身份象征。由它的一致性和唯一性這兩種特性,從而可以有效的避免服務(wù)器端,將偽造的數(shù)據(jù)或被篡改的數(shù)據(jù)當(dāng)初正常數(shù)據(jù)處理。

前面在2.4節(jié)提到的網(wǎng)站是通過客戶端渲染網(wǎng)頁,數(shù)據(jù)則是通過ajax請求拿到的,這種在一定程度上提升了爬蟲的難度。接下來分析ajax請求,如圖13所示,會發(fā)現(xiàn)其ajax請求是帶有請求簽名的,analysis就是加密后的參數(shù),而如果想要破解請求接口,就需要破解該參數(shù)的加密方法,這無疑進(jìn)一步提升了難度。

圖片

圖片

圖13. 請求榜單數(shù)據(jù)的ajax請求

2.7 蜜罐反爬蟲

蜜罐反爬蟲,是一種在網(wǎng)頁中隱藏用于檢測爬蟲程序的鏈接的手段,被隱藏的鏈接不會顯示在頁面中,正常用戶無法訪問,但爬蟲程序有可能將該鏈接放入待爬隊(duì)列,并向該鏈接發(fā)起請求,開發(fā)者可以利用這個(gè)特點(diǎn)區(qū)分正常用戶和爬蟲程序。如圖14所示,查看網(wǎng)頁源碼,頁面只有6個(gè)商品,col-md-3的 <div>標(biāo)簽卻有 8 對。該 CSS 樣式的作用是隱藏標(biāo)簽,所以我們在頁面只看到 6 件商品,爬蟲程序會提取到 8 件商品的 URL。

圖片

圖片

圖14.蜜罐反爬蟲例子

三、反反爬相關(guān)技術(shù)

針對上一節(jié)提到的反爬蟲相關(guān)技術(shù),有以下幾類反反爬技術(shù)手段:css偏移反反爬、自定義字體反反爬、頁面動態(tài)渲染反反爬、驗(yàn)證碼破解等,下面對這幾類方法進(jìn)行詳細(xì)的介紹。

3.1 CSS偏移反反爬

3.1.1 CSS偏移邏輯介紹

那么對于以上2.1css偏移反爬蟲的例子,怎么才能得到正確的機(jī)票價(jià)格呢。仔細(xì)觀察css樣式,可以發(fā)現(xiàn)每個(gè)帶有數(shù)字的標(biāo)簽都設(shè)定了樣式,第 1 對 b 標(biāo)簽內(nèi)的i 標(biāo)簽對的樣式是相同的,都是width: 16px;另外,還注意到最外層的 span 標(biāo)簽對的樣式為width:48px。

如果按照 css樣式這條線索來分析的話,第 1 對 b 標(biāo)簽中的 3 對 i 標(biāo)簽剛好占滿 span 標(biāo)簽對的位置,其位置如圖15所示。此時(shí)網(wǎng)頁中顯示的價(jià)格應(yīng)該是 777,但是由于第 2 和第 3 對 b 標(biāo)簽中有值,所以我們還需要計(jì)算它們的位置。由于第 2 對 b 標(biāo)簽的位置樣式是 left:-32px,所以第 2 對 b 標(biāo)簽中的值 6 就會覆蓋原來第 1 對 b 標(biāo)簽中的中的第 2 個(gè)數(shù)字 7,此時(shí)頁面應(yīng)該顯示的數(shù)字是 767。

按此規(guī)律推算,第 3 對 b 標(biāo)簽的位置樣式是 left:-48px,這個(gè)標(biāo)簽的值會覆蓋第 1 對 b 標(biāo)簽中的第 1 個(gè)數(shù)字 7,最后顯示的票價(jià)就是 467。

圖片

圖15.偏移邏輯

3.1.2 CSS偏移反反爬代碼實(shí)現(xiàn)

因此接下來我們按以上css樣式的規(guī)律來編寫代碼對該網(wǎng)頁爬取獲取正確的機(jī)票價(jià)格,代碼和結(jié)果如圖16所示。

if __name__ == '__main__':
url = 'http://www.porters.vip/confusion/flight.html'
resp = requests.get(url)
sel = Selector(resp.text)
em = sel.css('em.rel').extract()
for element in range(0,1):
element = Selector(em[element])
element_b = element.css('b').extract()
b1 = Selector(element_b.pop(0))
base_price = b1.css('i::text').extract()
print('css偏移前的價(jià)格:',base_price)
alternate_price = []
for eb in element_b:
eb = Selector(eb)
style = eb.css('b::attr("style")').get()
position = ''.join(re.findall('left:(.*)px', style))
value = eb.css('b::text').get()
alternate_price.append({'position': position, 'value': value})
print('css偏移值:',alternate_price)
for al in alternate_price:
position = int(al.get('position'))
value = al.get('value')
plus = True if position >= 0 else False
index = int(position / 16)
base_price[index] = value
print('css偏移后的價(jià)格:',base_price)

圖片

圖16. CSS 偏移反反爬代碼與結(jié)果

3.2 自定義字體反反爬

針對于以上2.3自定義字體反爬蟲的情況,解決思路就是提取出網(wǎng)頁中自定義字體文件(一般為WOFF文件),并將映射關(guān)系包含到爬蟲代碼中,就可以獲取到有效數(shù)據(jù)。解決的步驟如下:

發(fā)現(xiàn)問題:查看網(wǎng)頁源代碼,發(fā)現(xiàn)關(guān)鍵字符被編碼替代,如&#xefbe

圖片

分析:檢查網(wǎng)頁,發(fā)現(xiàn)應(yīng)用了css自定義字符集隱藏

圖片

圖片

查找:查找css文件url,獲取字符集對應(yīng)的url,如PingFangSC-Regular-num

查找:查找和下載字符集url

圖片

比對:比對字符集中的字符與網(wǎng)頁源代碼中的編碼,發(fā)現(xiàn)編碼的后四位與字符對應(yīng),也即網(wǎng)頁源代碼對應(yīng)的口味是8.9分

圖片

3.3 頁面動態(tài)渲染反反爬

客戶端渲染的反爬蟲,頁面代碼在瀏覽器源代碼中看不到,需要執(zhí)行渲染并進(jìn)一步獲取渲染后結(jié)果。針對這種反爬蟲,有以下幾種方式破解:

  1. 在瀏覽器中,通過開發(fā)者工具直接查看ajax具體的請求方式、參數(shù)等內(nèi)容;
  2. 通過selenium模擬真人操作瀏覽器,獲取渲染后的結(jié)果,之后的操作步驟和服務(wù)端渲染的流程一樣;
  3. 如果渲染的數(shù)據(jù)隱藏在html結(jié)果的JS變量中,可以直接正則提取;
  4. 如果有通過JS生成的加密參數(shù),可以找出加密部分的代碼,然后使用pyexecJS來模擬執(zhí)行JS,返回執(zhí)行結(jié)果。

3.4 驗(yàn)證碼破解

下面舉例一個(gè)識別滑塊驗(yàn)證碼的例子,如圖17所示,是使用目標(biāo)檢測模型來識別某滑塊驗(yàn)證碼缺口位置的結(jié)果示例,這種破解滑塊驗(yàn)證碼的方式對應(yīng)的是模擬真人的方式。不采用接口破解的原因一方面是破解加密算法有難度,另一方面也是加密算法可能每天都會變,這樣破解的時(shí)間成本也比較大。

圖片

圖17. 通過目標(biāo)檢測模型識別滑塊驗(yàn)證碼的缺口

3.4.1 爬取滑塊驗(yàn)證碼圖片

因?yàn)槭褂玫哪繕?biāo)檢測模型yolov5是有監(jiān)督學(xué)習(xí),所以需要爬取滑塊驗(yàn)證碼的圖片并進(jìn)行打標(biāo),進(jìn)而輸入到模型中訓(xùn)練。通過模擬真人的方式在某場景爬取部分驗(yàn)證碼。

圖片

圖18. 爬取的滑塊驗(yàn)證碼圖片

3.4.2 人工打標(biāo)

本次使用的是labelImg來對圖片人工打標(biāo)簽的,人工打標(biāo)耗時(shí)較長,100張圖片一般耗時(shí)40分鐘左右。自動打標(biāo)代碼寫起來比較復(fù)雜,主要是需要分別提取出驗(yàn)證碼的所有背景圖片和缺口圖片,然后隨機(jī)生成缺口位置,作為標(biāo)簽,同時(shí)將缺口放到對應(yīng)的缺口位置,生成圖片,作為輸入。

圖片

圖19. 對驗(yàn)證碼圖片打標(biāo)簽以及打標(biāo)簽后生成的xml文件

3.4.3 目標(biāo)檢測模型yolov5

直接從github下clone yolov5的官方代碼,它是基于pytorch實(shí)現(xiàn)。

接下來的使用步驟如下:

  1. 數(shù)據(jù)格式轉(zhuǎn)換:將人工標(biāo)注的圖片和標(biāo)簽文件轉(zhuǎn)換為yolov5接收的數(shù)據(jù)格式,得到1100張圖片和1100個(gè)yolov5格式的標(biāo)簽文件;
  2. 新建數(shù)據(jù)集:新建custom.yaml文件來創(chuàng)建自己的數(shù)據(jù)集,包括訓(xùn)練集和驗(yàn)證集的目錄、類別數(shù)目、類別名;
  3. 訓(xùn)練調(diào)優(yōu):修改模型配置文件和訓(xùn)練文件后,進(jìn)行訓(xùn)練,并根據(jù)訓(xùn)練結(jié)果調(diào)優(yōu)超參數(shù)。

轉(zhuǎn)換xml文件為yolov5格式的部分腳本:

for member in root.findall('object'):
class_id = class_text.index(member[0].text)
xmin = int(member[4][0].text)
ymin = int(member[4][1].text)
xmax = int(member[4][2].text)
ymax = int(member[4][3].text)
# round(x, 6) 這里我設(shè)置了6位有效數(shù)字,可根據(jù)實(shí)際情況更改
center_x = round(((xmin + xmax) / 2.0) * scale / float(image.shape[1]), 6)
center_y = round(((ymin + ymax) / 2.0) * scale / float(image.shape[0]), 6)
box_w = round(float(xmax - xmin) * scale / float(image.shape[1]), 6)
box_h = round(float(ymax - ymin) * scale / float(image.shape[0]), 6)
file_txt.write(str(class_id))
file_txt.write(' ')
file_txt.write(str(center_x))
file_txt.write(' ')
file_txt.write(str(center_y))
file_txt.write(' ')
file_txt.write(str(box_w))
file_txt.write(' ')
file_txt.write(str(box_h))
file_txt.write('\n')
file_txt.close()

訓(xùn)練參數(shù)設(shè)置:

parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default='./models/yolov5s.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default='data/custom.yaml', help='data.yaml path')
parser.add_argument('--hyp', type=str, default='data/hyp.scratch.yaml', help='hyperparameters path')
# parser.add_argument('--epochs', type=int, default=300)
parser.add_argument('--epochs', type=int, default=50)
# parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs')
parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')
parser.add_argument('--rect', actinotallow='store_true', help='rectangular training')
parser.add_argument('--resume', nargs='?', cnotallow=True, default=False, help='resume most recent training')
parser.add_argument('--nosave', actinotallow='store_true', help='only save final checkpoint')
parser.add_argument('--notest', actinotallow='store_true', help='only test final epoch')
parser.add_argument('--noautoanchor', actinotallow='store_true', help='disable autoanchor check')
parser.add_argument('--evolve', actinotallow='store_true', help='evolve hyperparameters')
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
parser.add_argument('--cache-images', actinotallow='store_true', help='cache images for faster training')
parser.add_argument('--image-weights', actinotallow='store_true', help='use weighted image selection for training')
parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--multi-scale', actinotallow='store_true', help='vary img-size +/- 50%%')
parser.add_argument('--single-cls', actinotallow='store_true', help='train multi-class data as single-class')
parser.add_argument('--adam', actinotallow='store_true', help='use torch.optim.Adam() optimizer')
parser.add_argument('--sync-bn', actinotallow='store_true', help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')
parser.add_argument('--project', default='runs/train', help='save to project/name')
parser.add_argument('--entity', default=None, help='W&B entity')
parser.add_argument('--name', default='exp', help='save to project/name')
parser.add_argument('--exist-ok', actinotallow='store_true', help='existing project/name ok, do not increment')
parser.add_argument('--quad', actinotallow='store_true', help='quad dataloader')
parser.add_argument('--linear-lr', actinotallow='store_true', help='linear LR')
parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
parser.add_argument('--upload_dataset', actinotallow='store_true', help='Upload dataset as W&B artifact table')
parser.add_argument('--bbox_interval', type=int, default=-1, help='Set bounding-box image logging interval for W&B')
parser.add_argument('--save_period', type=int, default=-1, help='Log model after every "save_period" epoch')
parser.add_argument('--artifact_alias', type=str, default="latest", help='version of dataset artifact to be used')
opt = parser.parse_args()

3.4.4 目標(biāo)檢測模型的訓(xùn)練結(jié)果

模型基本在50次迭代的時(shí)候在precision和recall以及mAP上已經(jīng)達(dá)到了瓶頸。預(yù)測結(jié)果也有如下問題:大部分能夠是能夠準(zhǔn)確框出缺口,但也出現(xiàn)少量框錯(cuò)、框出兩個(gè)缺口、框不出缺口的情況。

圖片

圖片

圖20. 上:模型的訓(xùn)練結(jié)果走勢圖;

下:模型對部分驗(yàn)證集的預(yù)測結(jié)果

四、總結(jié)

本次簡單對爬蟲以及反爬蟲的技術(shù)手段進(jìn)行了介紹,介紹的技術(shù)和案例均只是用于安全研究和學(xué)習(xí),并不會進(jìn)行大量爬蟲或者應(yīng)用于商業(yè)。

對于爬蟲,本著爬取網(wǎng)絡(luò)上公開數(shù)據(jù)用于數(shù)據(jù)分析等的目的,我們應(yīng)該遵守網(wǎng)站robots協(xié)議,本著不影響網(wǎng)站正常運(yùn)行以及遵守法律的情況下進(jìn)行數(shù)據(jù)爬取;對于反爬蟲,因?yàn)橹灰祟惸軌蛘TL問的網(wǎng)頁,爬蟲在具備同等資源的情況下就一定可以抓取到。所以反爬蟲的目的還是在于能夠防止爬蟲在大批量的采集網(wǎng)站信息的過程對服務(wù)器造成超負(fù)載,從而杜絕爬蟲行為妨礙到用戶的體驗(yàn),來提高用戶使用網(wǎng)站服務(wù)的滿意度。

責(zé)任編輯:未麗燕 來源: vivo互聯(lián)網(wǎng)技術(shù)
相關(guān)推薦

2022-11-24 10:24:32

2022-09-20 07:02:20

網(wǎng)絡(luò)爬蟲反爬蟲

2018-01-29 09:28:44

2016-10-13 15:51:50

2021-06-10 18:24:59

反爬蟲驗(yàn)證碼爬蟲

2016-10-14 16:35:39

2021-06-06 19:53:05

爬蟲處理字體反爬

2024-06-07 08:56:43

HTTPPythonSelenium

2017-06-30 13:23:02

2023-06-01 13:15:23

2009-08-19 10:34:16

反爬蟲

2017-05-16 15:33:42

Python網(wǎng)絡(luò)爬蟲核心技術(shù)框架

2017-05-15 10:39:48

爬蟲應(yīng)對機(jī)制

2017-04-27 20:45:48

爬蟲反爬蟲

2021-10-15 11:37:44

反爬蟲破解

2021-01-12 11:26:44

數(shù)據(jù)安全爬蟲

2016-10-13 13:01:51

2019-10-18 08:52:41

程序員爬蟲Java

2024-05-31 12:31:54

C#爬蟲Python

2017-12-14 21:45:39

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

中文av在线全新| 日本美女一级片| 久久精品免费一区二区三区| 欧美一区二区福利在线| av网站大全免费| 久久精品a一级国产免视看成人| 日韩av一区二| 久久久久久久久中文字幕| 黄色性生活一级片| 欧美天堂一区| 精品久久香蕉国产线看观看gif| 欧美一进一出视频| 精品国产999久久久免费| aa级大片欧美三级| 日日骚久久av| 182在线视频| 中文字幕日本一区| 精品欧美aⅴ在线网站| 伊人久久大香线蕉午夜av| 天堂在线资源8| 久久精品99国产国产精| 7777免费精品视频| 麻豆明星ai换脸视频| 天堂成人娱乐在线视频免费播放网站| 欧美精品在线视频| 日韩毛片在线免费看| 婷婷色在线播放| 国产精品毛片大码女人| 久久精品国产理论片免费| 国产免费不卡av| 日韩av网站在线观看| 97超碰色婷婷| 麻豆国产尤物av尤物在线观看| 精品国产中文字幕第一页| 精品国产1区二区| 国产大片一区二区三区| 欧美日韩精品一区二区三区视频| 亚洲成人黄色影院| 黑人巨茎大战欧美白妇| 日本在线免费看| 国产视频在线观看一区二区三区| 狠狠久久综合婷婷不卡| www.亚洲欧美| 国产自产高清不卡| 国产精品美女免费| 青草视频在线观看免费| 亚洲毛片网站| 性色av一区二区咪爱| 免费在线视频一区二区| 欧美.www| 欧美二区在线播放| 欧美日韩激情在线观看| 正在播放日韩欧美一页 | 国产乱女淫av麻豆国产| **欧美日韩在线观看| 日韩欧美在线第一页| 男人天堂网视频| 羞羞影院欧美| 欧美视频在线一区二区三区| www日韩视频| 成人国产精品一区二区免费麻豆| 欧美在线免费观看亚洲| 国产一区二区在线免费播放| 久久久加勒比| 91精品国产综合久久蜜臀| 国产无色aaa| 视频成人永久免费视频| 精品福利一区二区三区| 色综合久久五月| 窝窝社区一区二区| 亚洲午夜av久久乱码| 国产又粗又硬视频| 色综合天天爱| 欧美激情一区二区三区久久久| 日韩高清精品免费观看| 性高湖久久久久久久久| 国产精品欧美一区二区| 国产乱叫456在线| 成人午夜电影网站| 久久99精品国产一区二区三区| 免费福利在线观看| 国产精品美女久久久久久久| 日本女人高潮视频| 91福利区在线观看| 色视频成人在线观看免| 奇米影视四色在线| 中文字幕视频精品一区二区三区| 日韩电影网在线| 中文字幕黄色网址| 欧美国产综合| 日韩av电影在线播放| 亚洲天堂久久久久| 国产成人精品午夜视频免费| 蜜桃麻豆www久久国产精品| 日本在线观看网站| 欧美日韩国产中文字幕 | 全部毛片永久免费看| 麻豆91精品视频| 国产精品欧美久久| avtt亚洲| 欧美日韩国产一区中文午夜| 特级西西444www| 精品在线手机视频| 欧美成年人视频| 日韩手机在线视频| 国产**成人网毛片九色| 午夜老司机精品| 国产传媒在线| 91精选在线观看| 日本xxxxxxxxx18| 黄色免费成人| 国产精品美女呻吟| 青青草在线免费视频| 亚洲精品乱码久久久久久黑人 | 国产91精品一区二区麻豆亚洲| 日本一区二区高清视频| 国产www视频在线观看| 欧美日韩大陆在线| 性欧美精品中出| 亚洲激情精品| 成人动漫视频在线观看免费| wwwxxx在线观看| 欧美色视频日本高清在线观看| 伊人影院在线观看视频| 久久一区二区中文字幕| 欧美一区二粉嫩精品国产一线天| 成人av手机在线| 椎名由奈av一区二区三区| 国产高潮免费视频| 久久不见久久见免费视频7| 久久久久久91香蕉国产| 国产成人精品白浆久久69| 国产精品久久久久久久久晋中 | 一区二区在线视频播放| 五月天婷婷激情| 不卡的av网站| 欧美这里只有精品| 国产亚洲观看| 久久精品99久久香蕉国产色戒| 亚洲精品无码久久久久| 久久久久久久综合日本| 日韩小视频在线播放| 成功精品影院| 国语对白做受69| 蜜桃91麻豆精品一二三区| 一区二区三区精品视频| 国产探花一区二区三区| 综合视频在线| www日韩av| 啦啦啦中文在线观看日本| 日韩视频永久免费| 手机在线免费看片| 国产精品亚洲综合一区在线观看| 精品91一区二区三区| 国产亚洲久久| 久久久免费高清电视剧观看| 免费观看黄一级视频| 婷婷国产在线综合| 久久久久久久无码| 校园春色综合网| 秋霞毛片久久久久久久久| 视频精品导航| 久久精品电影一区二区| 国产av精国产传媒| 亚洲图片欧美综合| 91黄色免费视频| 久久久精品午夜少妇| 色一情一乱一伦一区二区三欧美| 国产日本久久| 久久成人精品视频| 刘玥91精选国产在线观看| 欧美日韩在线观看视频| 久久精品无码一区| 激情综合网天天干| 人人妻人人澡人人爽欧美一区| 久久久久高潮毛片免费全部播放| 日本中文字幕成人| 欧美边添边摸边做边爱免费| 日韩欧美国产综合一区 | av在线网址观看| 亚洲国产成人在线视频| 免费黄色av片| 亚洲精品五月天| 国产亚洲色婷婷久久99精品91| 久久美女性网| 国产树林野战在线播放| 色天下一区二区三区| 国产综合福利在线| 国产传媒在线| 色琪琪综合男人的天堂aⅴ视频| 国产成人精品无码高潮| 日韩欧美在线网址| 综合五月激情网| 久久综合色一综合色88| 午夜剧场高清版免费观看| 好看的日韩av电影| 视频一区二区三| 国产精品sss在线观看av| 国产福利精品在线| 免费在线看电影| 一区二区三区亚洲| 日本成人动漫在线观看| 欧美精品tushy高清| 日本视频在线观看免费| 亚洲黄色性网站| 成年人在线免费看片| 成人午夜激情视频| 亚洲高清在线不卡| 久久精品三级| 成人在线观看你懂的| 99精品视频在线| 蜜桃传媒视频麻豆第一区免费观看 | 日本乱人伦aⅴ精品| 麻豆成人在线视频| 中文字幕中文字幕中文字幕亚洲无线| 午夜视频在线观看国产| 久久 天天综合| 日韩中文字幕免费在线| 亚洲毛片网站| 野外做受又硬又粗又大视频√| 国产精品精品| 日韩av一级大片| 小嫩嫩12欧美| 国产麻豆日韩| 日韩在线视频一区二区三区| 国产情人节一区| 成人午夜精品| 欧美自拍大量在线观看| av免费不卡国产观看| 欧美精品一区二区三区国产精品| sese一区| 中文字幕日韩在线视频| 国产中文字幕在线| 日韩精品极品在线观看| 深爱激情五月婷婷| 欧美不卡一区二区三区| 国产草草影院ccyycom| 欧美伦理视频网站| 中文字幕第99页| 欧美三级蜜桃2在线观看| 懂色av中文字幕| 在线观看国产日韩| 午夜精品久久久久久久蜜桃| 一本大道av伊人久久综合| 在线天堂中文字幕| 欧美性极品xxxx做受| 精品国产xxx| 色呦呦日韩精品| 无码免费一区二区三区| 在线观看一区日韩| 伊人久久中文字幕| 在线观看区一区二| 成人黄色三级视频| 欧美性xxxxx极品少妇| 中文字幕一区二区三区人妻四季| 欧美亚洲日本一区| 一本到在线视频| 91精品国产综合久久精品app| 国产黄色大片网站| 精品88久久久久88久久久| 天天干在线观看| 亚洲精品之草原avav久久| 黄色av网站在线看| 色香阁99久久精品久久久| 老司机福利在线视频| 欧美放荡办公室videos4k| 久久男人天堂| 国产精品久久999| 日韩伦理一区二区| 国产精品一区二区三区不卡| 亚洲激情77| 手机看片日韩国产| 在线日韩视频| 99草草国产熟女视频在线| 精品制服美女丁香| 性猛交╳xxx乱大交| 久久亚洲一级片| 日韩在线一卡二卡| 亚洲综合丝袜美腿| 日日夜夜操视频| 欧美丰满高潮xxxx喷水动漫| 黄色一级大片在线免费看国产一| 亚洲男人天堂2024| 成人三级网址| 欧美又大粗又爽又黄大片视频| 成人毛片免费| 国产v亚洲v天堂无码| 欧洲视频一区| 久久人人爽人人爽人人av| 视频在线观看国产精品| 午夜国产福利在线观看| 99这里只有久久精品视频| 国产又粗又猛又爽又黄的视频小说| 一区二区三区资源| 波多野结衣不卡| 日韩精品中文字幕一区| 美州a亚洲一视本频v色道| 欧美成人激情视频| 欧美xxx网站| 成人av免费在线看| 成人在线亚洲| 国产二级片在线观看| 激情五月播播久久久精品| 国产肉体xxxx裸体784大胆| 最新日韩av在线| 无码人妻丰满熟妇精品区| 日韩欧美一级二级| 国产在线一二三| 97精品国产97久久久久久| 欧美日韩破处视频| 精品综合久久| 欧美精品91| 免费一区二区三区在线观看| 2017欧美狠狠色| 五月天综合在线| 欧美一区二区三区视频免费| 国产高清视频在线播放| 性欧美xxxx交| 爱爱精品视频| 麻豆传媒网站在线观看| 免费成人av资源网| 老牛影视av老牛影视av| 亚洲成人av一区二区三区| a级片在线视频| 日韩亚洲欧美成人| 91亚洲视频| 精品伦理一区二区三区| 精品91在线| 亚洲综合中文网| 亚洲精品中文字幕在线观看| 一二三四区视频| 中文字幕九色91在线| 欧美自拍电影| 欧美福利一区二区三区| 亚洲毛片一区| 欧美精品欧美极品欧美激情| 亚洲一区二区精品视频| 国产av无码专区亚洲a∨毛片| 日韩视频在线免费观看| aaaa欧美| 亚洲美女搞黄| 久久成人免费电影| 免费成人深夜蜜桃视频| 欧美性猛交xxxx黑人交| 69xxxx欧美| 91精品久久久久久久久不口人| 久久一区91| 999热精品视频| 一区二区三区中文字幕在线观看| hs视频在线观看| 欧美夫妻性生活视频| 亚洲精品黑牛一区二区三区| 女人被男人躁得好爽免费视频 | 黄色视屏免费在线观看| 成人观看高清在线观看免费| 亚洲无中文字幕| 欧美熟妇精品一区二区| 亚洲图片自拍偷拍| 亚州av在线播放| 国产经典一区二区| 日本女优一区| 国产不卡的av| 亚洲电影一区二区三区| 日本亚洲欧美| 国产狼人综合免费视频| 亚洲一区二区三区| 精品伦一区二区三区| 好吊成人免视频| yw视频在线观看| 97netav| 亚洲一区日韩在线| 国产精品无码无卡无需播放器| 3d动漫精品啪啪一区二区竹菊| 黄页网站在线| 欧美精品免费观看二区| 久久精品国产第一区二区三区| 欧美日韩在线国产| 日韩av网址在线| 人人精品久久| 国产天堂视频在线观看| 久久久精品蜜桃| 99久久免费国产精精品| 97久久精品国产| 日韩欧美网址| www.啪啪.com| 欧美另类久久久品| 97人人爽人人澡人人精品| 日韩在线电影一区| 国产成人免费视频精品含羞草妖精| 一级片中文字幕| 久久亚洲精品视频| 亚洲国产合集| 免费人成视频在线播放| 色偷偷久久一区二区三区| 大片免费在线观看| 欧美人与性禽动交精品| 国产乱子轮精品视频| 国产精品视频免费播放| 久久久精品欧美| 国产探花在线精品一区二区|