日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

猫眼爬虫三-终极篇:破解滑动验证,动态字体加密

發(fā)布時(shí)間:2023/12/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 猫眼爬虫三-终极篇:破解滑动验证,动态字体加密 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前面兩節(jié)我們對(duì)貓眼網(wǎng)站進(jìn)行了爬取,中間,我們會(huì)遇到各種反爬蟲,包括滑動(dòng)驗(yàn)證和字體加密等等,今天,我們就對(duì)這些反爬蟲進(jìn)行一一破解,實(shí)現(xiàn)貓眼網(wǎng)站的全信息爬取!

1、滑動(dòng)驗(yàn)證:滑動(dòng)驗(yàn)證類似于極驗(yàn)證(滑塊驗(yàn)證,電腦的B站登陸要滑動(dòng)的哪個(gè)),但是原理不一樣,目前來說,12306的相關(guān)搶票的腳本已經(jīng)實(shí)現(xiàn)了自動(dòng)加載滑塊滑動(dòng),但大多數(shù)情況還得手動(dòng),在這里也是。
破解流程:

1、先嘗試著獲取數(shù)據(jù),如果遇到爬取鏈接與實(shí)際鏈接不一致,如下圖:

即爬取的鏈接和實(shí)際鏈接不一致時(shí),尤其是出現(xiàn)了類似于:
https://verify.meituan.com/v2/web/general_page?action=spiderindefence&requestCode=350941fd3ea345bd99f8e17f7f99f2f5&platform=1000&adaptor=auto&succCallbackUrl=https%3A%2F%2Foptimus-mtsi.meituan.com%2Foptimus%2FverifyResult%3ForiginUrl%3Dhttp%253A%252F%252Fmaoyan.com%252Ffilms%252F224973
這樣的鏈接,那么就是被反爬蟲了,不需要慌,只要點(diǎn)擊該鏈接,

人工拖動(dòng)該滑塊,使之驗(yàn)證成功,那么ip就通過了驗(yàn)證,后面就可以成功爬取了。如下圖:

下面是出現(xiàn)滑動(dòng)驗(yàn)證的操作示意gif
上面,我們將滑動(dòng)驗(yàn)證說清楚了,下面我們開始對(duì)字體加密進(jìn)行分析:點(diǎn)開貓眼電影的詳情,我們?cè)?檢查 中發(fā)現(xiàn):


他的評(píng)分人數(shù),評(píng)分,票房等相關(guān)信息都是無法顯示的,在源代碼中也是類似,那么,我們應(yīng)該怎么獲取相關(guān)的數(shù)據(jù)呢?百度相關(guān)的信息,我們發(fā)現(xiàn):

他采用了一種字體加密方式,且是動(dòng)態(tài)的,每次刷新,都要重新載入一種新的字體,如下圖:

因此,我們不能再采取網(wǎng)上的那種固定的識(shí)別文字的方式,必須采取動(dòng)態(tài)識(shí)別方式!這里,我們用到的是OCR本地文字識(shí)別,主要通過 tesseract 來識(shí)別保存在本地的數(shù)字符號(hào)。

ocr:光學(xué)字符識(shí)別)是指電子設(shè)備(例如掃描儀或數(shù)碼相機(jī))檢查紙上打印的字符,通過檢測(cè)暗、亮的模式確定其形狀,然后用字符識(shí)別方法將形狀翻譯成計(jì)算機(jī)文字的過程

ocr識(shí)別流程:

1、先配置好tesseract的環(huán)境和訓(xùn)練庫,導(dǎo)入相關(guān)的包。

?2、下載網(wǎng)頁的字體文件,保存在本地文件夾。

3、將本地的字體坐標(biāo)進(jìn)行讀取,并轉(zhuǎn)化成黑白圖片。

4、進(jìn)行ocr識(shí)別,并將結(jié)果進(jìn)行轉(zhuǎn)化,將每個(gè)坐標(biāo)對(duì)應(yīng)數(shù)字識(shí)別代碼,?如下圖

5、找到對(duì)應(yīng)的識(shí)別代碼之后,我們就可以在源代碼中進(jìn)行替換操作了:
將識(shí)別出來的數(shù)字與字體代碼進(jìn)行轉(zhuǎn)換。

6、轉(zhuǎn)換成功后進(jìn)行數(shù)據(jù)的獲取就可以了。

OCR識(shí)別的缺點(diǎn):

1、對(duì)訓(xùn)練庫的要求比較高,否則識(shí)別很容易出錯(cuò),不準(zhǔn)確。

2、識(shí)別時(shí)間較長(zhǎng),時(shí)間花費(fèi)較大。

但就目前來說,我的識(shí)別訓(xùn)練庫的精度和速度都還可以。

知道了爬蟲步驟與方法,我們就可以編寫代碼了,代碼流程與前兩節(jié)類似,這里主要講解一下怎么把字體文件等轉(zhuǎn)化成圖片識(shí)別。

1、首先,導(dǎo)入下面這些庫:

import pytesseract from PIL import Image from fontTools.ttLib import TTFont from matplotlib import pyplot as plt

在OCR識(shí)別之前,記得先下好字體文件,再進(jìn)行后面操作。

2、導(dǎo)入字體文件,獲取到數(shù)字的坐標(biāo)表示區(qū):

font = TTFont(woff_file) font_name = font.getGlyphOrder()[2:] #獲取到字符的uni碼

zb = [font['glyf'][i].coordinates for i in font_name


獲取到每個(gè)字體的坐標(biāo)信息,后面我們就可以根據(jù)字體坐標(biāo)進(jìn)行繪圖,并將字體編碼與具體數(shù)字對(duì)應(yīng)上;部分代碼如下:

def deal_font(font): font_name = font.getGlyphOrder()[2:] zb = [font['glyf'][i].coordinates for i in font_name] fig, ax = plt.subplots() for index, one in enumerate(zb):x, y = [i[0] for i in one], [i[1] for i in one]plt.plot(x, y)x_n = [i + np.max(x) + 100 for i in x]plt.plot(x_n, y)plt.fill(x, y, 'black')plt.fill(x_n, y, 'black')# 去邊框ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.spines['bottom'].set_visible(False)ax.spines['left'].set_visible(False)# 去刻度plt.axis('off')plt.fill(x, y, 'black')plt.savefig('images/%s.png' % index)plt.close() path = 'images/' num = [] # 灰度、二值化 for one in os.listdir(path):img = Image.open(path + one)imgry = img.convert("L")threshold = 140table = []for i in range(256):if i < threshold:table.append(0)else:table.append(1)out = imgry.point(table, '1')out.save(path + one)text = pytesseract.image_to_string(out, lang="amt")num.append(text[0]) # 字名與數(shù)字 name_num = {font_name[i]: num[i] for i in range(len(font_name))} return name_num

全部代碼在我的公眾號(hào)里,回復(fù) 貓眼 就可以獲取到,我的公眾號(hào)名字是:
python學(xué)習(xí)號(hào)

當(dāng)然,也可以在這里 下載 ,只是要c幣。

歡迎大家關(guān)注。一個(gè)python學(xué)習(xí)者,將其學(xué)到的分享出來。

總結(jié)

以上是生活随笔為你收集整理的猫眼爬虫三-终极篇:破解滑动验证,动态字体加密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。