python爬虫反爬对抗_python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站...
你已經知道了對方是
如何自定義字體加密的了
你要想去反反爬
你就要先站在對方的角度去思考問題
有句話這么說來著
“知己知彼,才能那啥”
那么對于像貓眼電影、大眾點評等等
那樣的 css 自定義字體加密
應該怎么破呢?
接下來就是
學習 python 的正確姿勢
有人說了
不就是把字體通過 unicode 編碼嗎?
那就簡單了啊
把每個字的編碼找到
然后使用字典把編碼和對應的字對應起來
抓取分析的時候
直接替換不就得了
有道理是有道理
但是
如果我每次返回給你的編碼都不一樣呢?
你說死不死
好了好了,先別哭得那么舒服
我們來看看天貓電影票房榜單的頁面
https://maoyan.com/board/1
正如你所看到的那樣
這里也使用了字體加密
通過源代碼我們可以看到
font-face這里制定了字體文件路徑
還是熟悉的配方
熟悉的味道~
不過小老弟
還是不要開心太早
刷新幾次你就會發現
(盯著下圖 2 秒鐘)
看到沒有
字體文件一直在變
woc!
玩呢?
我們先把字體文件下載下來#?把整個頁面搞下來
url?=?'https://maoyan.com/board/1'
html?=?download_html(url).decode('utf-8')
用正則把字體文件名拿一下font_file_name?=?re.findall(r'//vfile.meituan.net/colorstone/(w+.woff)',?html)[0]
拿到了文件名之后就構建一下url
然后把字體文件下載下來url?=?'http://vfile.meituan.net/colorstone/'?+?font_file_name
font_file?=?download_html(url)
接著把字體文件寫到本地文件中with?open('fonts/'?+?font_file,?'wb')?as?f:
f.write(new_file)
使用 fontTools 來獲取字體
如果你之前沒安裝的話要安裝才能用
接著我們把字體文件保存為 xmlfont?=?TTFont('fonts/'?+?font_file)
font.saveXML('./'+font_file+'.xml')
快打開打開看看
哇,這些玩意
有點眼熟啊
這不就是加密的 unicode 碼么
左邊的 id 難道就是對應的數字?
恩沒那么簡單
就能找到聊得來的伴
尤其是在看過了那么多背叛
總是....
不好意思
走錯片場了
回到我們剛剛的 xml 文件
往下拉一下
可以看到這個
這里每一個編碼都對應一個 TTGlyph 對象
從各種 x y 坐標可以猜測
它應該是用來繪制一個字的
我們把任意一個對象復制一下
然后用 matplotlib 根據坐標畫個圖試試看import?matplotlib.pyplot?as?plt
import?re
str?=?""""
.....此處省略一點代碼
"""
x?=?[int(i)?for?i?in?re.findall(r'運行一波
哈哈
媽的,uniEA78 就是 3 !
那么其它的編碼也是這個道理了
還記得 python爬蟲20 | 小帥b教你如何識別圖片驗證碼 嗎?
我們把那十個編碼都畫一遍
然后識別成數字
再封裝成字典不就好了?
好像這樣做效率不高耶
有沒有別的什么辦法呢
我們再請求一下貓眼的字體文件
這次返回的文件又不同了
打開你會發現
返回的編碼都不一樣了
咋整捏
還記得我們剛剛繪制的 3 么?
我們來搜一下新下載的文件
是不是繪制 3 的坐標也是一樣的呢
嘿嘿
仔細看下上面兩張圖里面的坐標
居然一模一樣
也就是說
雖然編碼的名稱不同
但是
它們對象里面對應的內容是一樣的
對不對?
靈感來了
就是這里了
從這里下手
我們在第一次請求字體文件的時候
把編碼對應的數字先給找出來
然后記下來
那么以后再請求到不同的字體文件的時候
雖然得到的編碼不同
但是我們可以根據對象對應的內容進行判斷
從而就可以得出
新的編碼和舊的編碼指向同一個內容
那么這兩個編碼對應的數字就是一樣的
代碼走起~
第一次請求獲取一個字體文件
打開 xml 獲取到 unicode 編碼
接著你可以通過繪制圖的方式
或者通過 fontCreator 軟件打開字體文件
或者通過字符去比對每個 unicode 代表的數字
然后
你就可以得到相應的數字
把它寫到字典里面去
因為每次請求得到的字體編碼都不同
所以上面這個就要作為我們的判斷依據
當我們再請求的時候
如果得到的是和我們一開始請求
得到的字體文件一樣的話
那就直接返回我們剛剛的字典
不相同的話
我們就要把新的字體文件下載下來
然后對每個編碼的對象跟舊的字體文件的每個編碼的對象比較
如果對象是相同的話
就把舊的編碼所對應的數字賦給新的編碼
因為網頁上顯示的是 這樣開頭的
所以我們也要跟著換一下
這時候運行
就會得到新的編碼和對應的數字了
爽啊
有了這個之后
我想爬取具體數據對你來說不在話下了吧
這里就隨便獲取一個電影的實時票房來舉例
簡單粗暴的使用下正則
爬取到編碼的時候我們轉化一下
就是當編碼和字典列表里面的編碼有相同的
就替換成數字
運行之后
看下網頁
沒毛病
再爬取下總票房試試
ok
依然沒毛病
總結
以上是生活随笔為你收集整理的python爬虫反爬对抗_python爬虫反反爬,你几乎可以横扫大部分 css 字体加密的网站...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle查看视图定义语句_oracl
- 下一篇: python requests 重试_我