爬蟲架構設計
前言
公司要求:需要獲取并分析資料,所以干起了爬蟲工程師的事情,分享一下最近學習的經驗.由于團隊人手不夠,目前是自己獨自負責這部分(搭建、爬取、決議),可能會有不完善的地方,如果覺得有可以優化的地方或者是更好的方案可以私信交流,
目標:京東、考拉、淘寶、costco、amazon(自己現階段的需求就是這些了)
使用到的資料庫:mysql、mongo、redis
目錄:
1.簡易爬蟲
2.框架設計(分布式框架爬蟲)
3.服務器自動擴容(程式自動增減服務器設備)
4.反爬
一:簡易爬蟲
1.使用selenium+chromedp實作瀏覽器進行爬蟲,
當然如果硬要用請求去爬取而不是瀏覽器也行,當稍微遇到反爬時,則會頭痛不已,因為瀏覽器爬取是模擬真實請求,
而介面請求很容易被識別出來,就算沒有被識別出來,其實很多大網站的反爬,都會有加密,多層介面的程序,尤其是
在javascript層加密,那就很好玩了,恐怕不知需要花費多久才能正常爬取一個網站,當反爬邏輯一改,那就晾涼羅,代碼
也是大動,這里不多講了,反爬部分會進行說明,
2.環境(linux) windows也可,但沒必要,性能上無法比較,使用selenium在linux上無視窗爬取就行.
3.這邊默認是爬取網站的所有商品,所以找到目錄,獲取目錄,在決議目錄,獲取所有目錄的分類鏈接.
4.根據分類鏈接爬取所有的商品串列頁面,里面包括分頁等等,從而就可以獲取對應的商品名稱,價格,商品詳情鏈接等等.
當然不同的網站的爬取細節都不同,這里就不一一舉例了,因為只是往大的方向說,不太理解的可以評論或私聊,
看到了就會解答,
5.和上一步一樣,詳情商品鏈接爬取html,進行存盤,全部存盤完,在進行決議,從而就可以獲取商品的規格以及各種詳細
資訊
6.注意事項:頁面商品展示以及評論很多都不會直接展示出來,有一些關鍵資訊是隱藏起來的,需要頁面去觸發,有可能
是點擊,也有可能是滑鼠移動就行,這個時候你呼叫對應的api即可.
7.此時決議出來的商品資料,就可以進行合理分析了,比如和公司商品匹配,看看其他平臺的商品價格趨勢、資訊、評論等.
缺點:通過這種單一腳本的方式、性能肯定是有限制的、就算開了多執行緒畢竟是單例模式,整個網站所有的商品爬取下
來都不知道要花多長時間,更何況還需要持續監測,監測出每個商品的變動,價格趨勢,所以這個時候就需要設計一套
分布式爬蟲架構.
二.分布式爬蟲架構
1.所有爬取、決議都是通過任務的方式進行操作,
2.任務關鍵欄位:平臺、分類、是否使用代理ip、是否產生cookie、停斷多久繼續爬取、錯誤重試次數,超時時間、任務
狀態執行結果,任務執行進度,型別(分類、主頁、詳情)
3.客戶端、客戶端專門獲取用戶的任務然后分發給采集端進行采集,這邊獲取到的任務,在決議任務,把任務對應的爬
蟲鏈接都發送到訊息佇列里,訊息佇列有很多選擇. kafka、rocketMq .....等等,emmm自己選吧,我目前用的就是
rocketMq,因為是阿里云強烈推薦的,kafka之前也用過,kafka在承受高并發場景下是特別好的,主要是我也沒有場景能直
接把訊息佇列給弄掛了,所以這里用哪個的區別其實意義不大,當然這些都可以部署,但會增加運維成本,還不如直接
用阿里云的rocketMq,反正特別便宜,如果實在舍不得花那么一點錢,那就干脆直接用rpc通信就行了,不過后面的采
集端負載,消費會很麻煩,就看個人了吧,估計公司肯定都是走訊息佇列了,去走請求、在維持負載采集、強行增加難度、
這可能是單純的想提升技術水平了吧,
4.采集端:采集端擁有N個,具體擁有多少個則需要看自己的需求量了,計算每天的采集數量,需要多少天完成,得出有多
少個采集端,采集端將會從訊息佇列里接收到一條url的采集任務,接受后進行采集進行存盤,如果臨時發現速度較慢,則
可以用任務創建服務器、生成對應的采集端、進行采集.
5.最后就是一些細節操作了,根據任務決議等等.
三:服務器自動擴容(程式自動增減服務器設備)
平臺:阿里云
1.準備一臺服務器,選擇自己需要的配置資訊進行創建.(這里選擇了centos7系統)
2.部署好這臺centos7系統,把自己的程式服務部署上去
3.使用systemctl的方式,使linux系統上讓程式服務開機即啟動、以及關閉時自啟動,
4.部署對應的環境等等
5.把該服務器打包成自定義鏡像.
6.通過自己的程式代碼創建阿里云ECS服務.
這樣在創建的那一刻、即程式以及自動運行,則實行了自動擴容的效果.
四:反爬
1.使用selenium+chromedp可以模擬用戶真實訪問的效果
2.代理ip,不用代理ip很容易直接被封,
3.拼接cookie等一些攜帶請求頭,看看對應的網站有沒有一些對應的規則.
4.有些網站會出現圖片驗證碼,拖動條等等,這里我先簡單的描述如何解決對兩種反爬
1.拖動條
以簡單的為例,比如從A點拖動到B點即可.
獲取滾動條(根據id或者對應的屬性獲取即可),計算出滾動條的長度,算出滾動條A點的XY中心軸.
滑鼠移動到A點的XY中心軸進行拖動,拖動具體長度即可,
拖動的時候最好有幅度,比如速度的控制,以及上下的控制,弄點亂數就好.
2.圖片驗證碼
首先獲取元素的圖片,再將圖片決議.
決議通過OCR決議即可.使用google即可,
決議后的驗證碼填入對應的文本框即可,在點擊按鈕確認,
結束
由于時間原因,具體的實作程序就沒有寫上了,如果一一列出,恐怕就不知道多久能寫得完了,有興趣的小伙伴可以留言交流,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261350.html
標籤:其他
