您好,登錄后才能下訂單哦!
這篇文章給大家介紹python爬蟲的實踐技巧有哪些呢,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
數據的重要性
如今已然是大數據時代,數據正在驅動著業務開發,驅動著運營手段,有了數據的支撐可以對用戶進行用戶畫像,個性化定制,數據可以指明方案設計和決策優化方向,所以互聯網產品的開發都是離不開對數據的收集和分析,數據收集的一種是方式是通過上報API進行自身平臺用戶交互情況的捕獲,還有一種手段是通過開發爬蟲程序,爬取競品平臺的數據,后面就重點說下爬蟲的應用場景和實踐中會遇到的問題和反反爬蟲的一些套路與技巧。
互聯網平臺,偏向銷售公司,客戶信息的爬取
客戶信息的爬取可以釋放銷售人員尋找客戶資源的時間,提高銷售對市場開發的效率
爬取相關平臺上的客戶信息,上報到CRM管理系統,提供給銷售人員進行開發
資訊爬取并應用到平臺業務中
經常瀏覽資訊的時候會發現其實很多平臺的熱門資訊內容都很相似,尊重版權的平臺,會標明來源出處
爬取資訊信息,應用到資訊業務中,可以減輕資訊內容編輯人員的壓力,如果不需要創造自己的內容,也可全部托管給程序AI運營
競品公司重要數據挖掘分析與應用
競品平臺重要業務數據,如:汽車X家的車型信息,X哪兒的酒店信息,返X網的商品信息,... ...
爬取競品重要數據,對數據進行篩選和處理,然后投入業務中展示,增加這塊業務數據量,減輕這塊資源的運營編輯的壓力
... ...
python開發爬蟲(推薦)
入門也比較簡單,代碼短小精干,各種便于爬蟲開發的模塊和框架
其他語言
很多語言也都可以開發爬蟲,但是均都不是很全面,根據實際技術棧和開發場景去使用,語言只是工具,思路才是通用的
做爬蟲開發,需要對WEB這塊有相對全面深入的理解,這樣后面遇到反爬蟲才能得心應手,見招拆招
了解HTML
會使用HTML標簽構造頁面,知道如何解析出DOM里標簽,提取想要的數據內容
了解CSS
了解CSS,會解析出樣式里的數據內容
了解JS
基本JS語法,能寫能讀懂,并了解JS庫:Jquery,Vue 等,可以對使用開發者工具調試JS
了解JSON
了解JSON數據,會序列化和反序列化數據,通過解析JSON對象獲取數據內容
了解HTTP/HTTPS
能夠分析請求信息和響應信息,可以通過代碼構造請求
會正則解析
通過正則匹配出符合規則的字符串,提取想要的數據內容
會數據庫操作
通過數據庫操作對爬取數據進行存儲,如:MYSQL語法
會使用抓包工具
瀏覽器F12開發者調試工具(推薦:谷歌),Network(網絡)欄目可以獲取抓包信息
工具:Charles,Fiddler (可抓包HTTPS,抓包APP)
通過抓包工具可以過濾出數據接口或者地址,并且分析請求信息和響應信息,定位數據所在的字段或者HTML標簽
會使用開發者工具
瀏覽器F12開啟開發者工具
需要會使用開發者工具調試HTML,CSS,JS
會模擬請求
工具:Charles,Fiddler,Postman
通過模擬請求,分析出請求需要那些必要的信息,如:參數,COOKIE,請求頭,懂得怎么模擬請求就知道編碼的時候如何去構造
能定位數據
數據在API中:前端/原生APP請求數據API,API返回數據大部分是JSON格式,然后渲染展示
數據在HTML中:查看頁面HTML源代碼,如果源代碼里有想要獲取的數據,就說明在服務端已經綁定好數據在HTML里
數據在JS代碼中:查看頁面HTML源代碼,如果獲取數據不在HTML里,又沒有請求數據API,可以看下數據是不是綁定到JS變量里
會部署
可以部署到Windows或者Linux服務器,使用工具進行爬蟲進程監控,然后進行定時輪訓爬取
反爬蟲可以分為
服務端限制
和前端限制
服務端限制
:服務器端行請求限制,防止爬蟲進行數據請求前端限制
:前端通過CSS和HTML標簽進行干擾混淆關鍵數據,防止爬蟲輕易獲取數據
設置請求頭(服務端限制
)
Referer
User-Agent
... ...
簽名規則(服務端限制
)
如果是JS發起的請求,簽名規則可以在JS函數中找到,然后再根據規則去構造簽名
如果是APP發起的請求,可能是前端調用原生封裝的方法,或者原生發起的,這個就比較無解,需要反編譯APP包,也不一定能成功
延遲,或者隨機延遲(服務端限制
)
如果請求被限制,建議可以試試請求延遲,具體延遲xxx毫秒/x秒,根據實際情況設定合適的時間
代理IP(服務端限制
)
如果延遲請求還是被限制,或者需要延遲很長時間才不會被限制,那就可以考慮使用代理IP,根據實際場景與限制的規律去運用,一般只要被限制的時候就切換請求的代理IP,這樣就基本可以繞過限制
目前有很多收費的代理IP服務平臺,有各種服務方式,具體可以搜索了解下,費用一般都在可以接受的范圍
登錄限制(服務端限制
)
請求帶上登錄用戶的COOKIE信息
如果登錄用戶COOKIE信息會在固定周期內失效,那就要找到登錄接口,模擬登錄,存儲COOKIE,然后再發起數據請求,COOKIE失效后重新這個步驟
驗證碼限制(服務端限制
)
簡單驗證碼,對圖片里的字母或者數字進行識別讀取,使用識圖的模塊包可以實現
復雜驗證碼,無法通過識圖識別,可以考慮使用第三方收費服務
CSS/HTML混淆干擾限制(前端限制
)
前端通過CSS或者HTML標簽進行干擾混淆關鍵數據,破解需要抽樣分析,找到規則,然后替換成正確的數據
1 . font-face,自定義字體干擾
如列子:汽車X家論帖子,貓X電影電影評分
<!--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 >2</p> <span>2</span> <span ></span> <div >02</div> <p >.1</p> <span>.1</span> <div ></div> <span ></span> <div >09</div> <span >.</span> <span >23</span> <p >7</p> <span>7</span> <p ></p> <span></span> <span >.</span> <div ></div> <p >3</p> <span>3</span> <div >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實現
C#
/// 需要引入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); } } } }
python
# 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
關于python爬蟲的實踐技巧有哪些呢就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。