圖1-意淫爬蟲與反爬蟲間的對決
現在已然是大數據時代,數據正在驅動着業務開發,驅動着運營手段,有了數據的支撐能夠對用戶進行用戶畫像,個性化定製,數據能夠指明方案設計和決策優化方向,因此互聯網產品的開發都是離不開對數據的收集和分析,數據收集的一種是方式是經過上報API進行自身平臺用戶交互狀況的捕獲,還有一種手段是經過開發爬蟲程序,爬取競品平臺的數據,後面就重點說下爬蟲的應用場景和實踐中會遇到的問題和反反爬蟲的一些套路與技巧。css
互聯網平臺,偏向銷售公司,客戶信息的爬取html
資訊爬取並應用到平臺業務中前端
競品公司重要數據挖掘分析與應用python
python開發爬蟲(推薦)git
其餘語言程序員
作爬蟲開發,須要對WEB這塊有相對全面深刻的理解,這樣後面遇到反爬蟲才能駕輕就熟,見招拆招
瞭解HTMLgithub
瞭解CSSweb
瞭解JS數據庫
瞭解JSON瀏覽器
瞭解HTTP/HTTPS
會正則解析
會數據庫操做
會使用抓包工具
會使用開發者工具
會模擬請求
能定位數據
會部署
反爬蟲能夠分爲服務端限制
和前端限制
服務端限制
:服務器端行請求限制,防止爬蟲進行數據請求
前端限制
:前端經過CSS和HTML標籤進行干擾混淆關鍵數據,防止爬蟲輕易獲取數據
設置請求頭(服務端限制
)
簽名規則(服務端限制
)
延遲,或者隨機延遲(服務端限制
)
代理IP(服務端限制
)
登陸限制(服務端限制
)
驗證碼限制(服務端限制
)
CSS/HTML混淆干擾限制(前端限制
)
前端經過CSS或者HTML標籤進行干擾混淆關鍵數據,破解須要抽樣分析,找到規則,而後替換成正確的數據
1 . font-face,自定義字體干擾
<!--css--> <!--找到://k3.autoimg.cn/g13/M05/D3/23/wKjByloAOg6AXB-hAADOwImCtp047..ttf--> <style> @font-face {font-family: 'myfont';src: url('//k2.autoimg.cn/g13/M08/D5/DD/wKgH41oAOg6AMyIvAADPhhJcHCg43..eot');src: url('//k3.autoimg.cn/g13/M08/D5/DD/wKgH41oAOg6AMyIvAADPhhJcHCg43..eot?#iefix') format('embedded-opentype'),url('//k3.autoimg.cn/g13/M05/D3/23/wKjByloAOg6AXB-hAADOwImCtp047..ttf') format('woff');} </style> <!--html--> <!--會員招募中--> <div> Mercedes C+ 會員招募<span style='font-family: myfont;'></span></div> <!-- 從html中獲取【html中文編碼】= 而後解析ttf文件獲得【ttf中文編碼】列表 匹配發現【ttf中文編碼】=uniF159能夠與【html中文編碼】=匹配,在第7個,第7箇中文就是"中" (抽樣分析會發現ttf中中文位置是固定的,中文編碼是動態變化的,因此只要映射出【ttf中文編碼】索引就能夠知道中文字符了) -->
破解思路:
找到ttf字體文件地址,而後下載下來,使用font解析模塊包對ttf文件進行解析,能夠解析出一個字體編碼的集合,與dom裏的文字編碼進行映射,而後根據編碼在ttf裏的序號進行映射出中文
可使用FontForge/FontCreator工具打開ttf文件進行分析
2 . 僞元素隱藏式
經過僞元素來顯示重要數據內容
如例子:汽車X家
<!--css--> <style> .hs_kw60_configod::before { content: "一汽"; } .hs_kw23_configod::before { content: "大衆"; } .hs_kw26_configod::before { content: "奧迪"; } </style> <!--html--> <div> <span class="hs_kw60_configod"></span> - <span class="hs_kw23_configod"></span> <span class="hs_kw26_configod"></span> </div>
破解思路:
找到樣式文件,而後根據HTML標籤裏class名稱,匹配出CSS裏對應class中content的內容進行替換
3 . backgroud-image
經過背景圖片的position位置偏移量,顯示數字/符號,如:價格,評分等
根據backgroud-postion值和圖片數字進行映射
4 . html標籤干擾
經過在重要數據的標籤里加入一些有的沒的隱藏內容的標籤,干擾數據的獲取
如例子:xxIP代理平臺
<!--html--> <td class="ip"> <p style="display:none;">2</p> <span>2</span> <span style="display:inline-block;"></span> <div style="display: inline-block;">02</div> <p style="display:none;">.1</p> <span>.1</span> <div style="display:inline-block;"></div> <span style="display:inline-block;"></span> <div style="display:inline-block;">09</div> <span style="display: inline-block;">.</span> <span style="display:inline-block;">23</span> <p style="display:none;">7</p> <span>7</span> <p style="display:none;"></p> <span></span> <span style="display: inline-block;">.</span> <div style="display: inline-block;"></div> <p style="display:none;">3</p> <span>3</span> <div style="display: inline-block;">5</div>: <span class="port GEA">80</span> </td> <!--js--> <script> $(".ip:eq(0)>*:hidden").remove() $(".ip:eq(0)").text() </script> <!-- 輸出:202.109.237.35:80 經過移除干擾標籤裏有display:none隱藏標籤,而後再獲取text就不會有干擾的內容了 -->
破解思路:
過濾掉干擾混淆的HTML標籤,或者只讀取有效數據的HTML標籤的內容
... ... (反爬蟲腦洞有多大,反反爬蟲拆招思路就有多淫蕩)
防止投毒
font解析 C#和Python實現
/// 須要引入PresentationCore.dll private void Test() { string path = @"F:\font.ttf"; //讀取字體文件 PrivateFontCollection pfc = new PrivateFontCollection(); pfc.AddFontFile(path); //實例化字體 Font f = new Font(pfc.Families[0], 16); //設置字體 txt_mw.Font = f; //遍歷輸出 var families = Fonts.GetFontFamilies(path); foreach (System.Windows.Media.FontFamily family in families) { var typefaces = family.GetTypefaces(); foreach (Typeface typeface in typefaces) { GlyphTypeface glyph; typeface.TryGetGlyphTypeface(out glyph); IDictionary<int, ushort> characterMap = glyph.CharacterToGlyphMap; var datas = characterMap.OrderBy(d => d.Value).ToList(); foreach (KeyValuePair<int, ushort> kvp in datas) { var str = $"[{kvp.Value}][{kvp.Key}][{(char)kvp.Key}]\r\n"; txt_mw.AppendText(str); } } } }
# pip install TTFont from fontTools.ttLib import TTFont from fontTools.merge import * me = Merger() font = TTFont('./font.ttf') cmaps = font.getBestCmap() orders = font.getGlyphOrder() # font.saveXML('F:/1.xml') print cmaps print orders