爬蟲簡介
????????“爬蟲”不是一只生活在泥土里的小蟲子,網(wǎng)絡(luò)爬蟲(web crawler)钞澳,也叫網(wǎng)絡(luò)蜘蛛(spider),是一種用來自動瀏覽網(wǎng)絡(luò)上內(nèi)容的機器人。 爬蟲訪問網(wǎng)站的過程會消耗目標系統(tǒng)資源狠轻,很多網(wǎng)站不允許被爬蟲抓取(這就是你遇到過的 robots.txt 文件彬犯, 這個文件可以要求機器人只對網(wǎng)站的一部分進行索引向楼,或完全不作處理)查吊。 因此在訪問大量頁面時,爬蟲需要考慮到規(guī)劃湖蜕、負載逻卖,還需要講“禮貌”(大兄弟,慢點)昭抒。
爬蟲邏輯
?????? 爬蟲邏輯大概是评也,輸入一個要爬取的URL地址,發(fā)送網(wǎng)絡(luò)請求獲取頁面信息灭返,處理自己需要的數(shù)據(jù)盗迟,模塊大致可設(shè)計為:URL管理,網(wǎng)頁下載器熙含,爬蟲調(diào)度器罚缕,網(wǎng)頁解析器,數(shù)據(jù)處理器怎静。
URL管理器
????????爬蟲框架要處理很多的URL邮弹,我們需要設(shè)計一個隊列存儲所有要處理的URL,這種先進先出的數(shù)據(jù)結(jié)構(gòu)非常符合這個需求消约。 將所有要下載的URL存儲在待處理隊列中肠鲫,每次下載會取出一個,隊列中就會少一個或粮。我們知道有些URL的下載會有反爬蟲策略导饲, 所以針對這些請求需要做一些特殊的設(shè)置,進而可以對URL進行封裝抽出 Request氯材。
網(wǎng)頁下載器
? ? ?????如果沒有網(wǎng)頁下載器渣锦,用戶就要編寫網(wǎng)絡(luò)請求的處理代碼,這無疑對每個URL都是相同的動作氢哮。 所以在框架設(shè)計中我們選取合適的下載器直接加入它就好了袋毙。
爬蟲調(diào)度器
????????調(diào)度器和我們在開發(fā) web 應(yīng)用中的控制器是一個類似的概念,它用于在下載器冗尤、解析器之間做流轉(zhuǎn)處理听盖。 解析器可以解析到更多的URL發(fā)送給調(diào)度器,調(diào)度器再次的傳輸給下載器裂七,這樣就會讓各個組件有條不紊的進行工作皆看。
數(shù)據(jù)處理器
??? ????普通的爬蟲程序中是把 網(wǎng)頁解析器 和 數(shù)據(jù)處理器 合在一起的,解析到數(shù)據(jù)后馬上處理背零。 在一個標準化的爬蟲程序中腰吟,他們應(yīng)該是各司其職的,我們先通過解析器將需要的數(shù)據(jù)解析出來徙瓶,可能是封裝成對象毛雇。 然后傳遞給數(shù)據(jù)處理器嫉称,處理器接收到數(shù)據(jù)后可能是存儲到數(shù)據(jù)庫,也可能通過接口發(fā)送給老王灵疮。
參考地址:https://blog.csdn.net/huangshulang1234/article/details/79081628
用戶權(quán)限
?????? UserAgent中文名為用戶代理织阅,是Http協(xié)議中的一部分,屬于頭域的組成部分始藕,UserAgent也簡稱UA蒲稳。它是一個特殊字符串頭,是一種向訪問網(wǎng)站提供你所使用的瀏覽器類型及版本伍派、操作系統(tǒng)及版本江耀、瀏覽器內(nèi)核、等信息的標識诉植。通過這個標識祥国,用戶所訪問的網(wǎng)站可以顯示不同的排版從而為用戶提供更好的體驗或者進行信息統(tǒng)計;例如用手機訪問谷歌和電腦訪問是不一樣的晾腔,這些是谷歌根據(jù)訪問者的UA來判斷的舌稀。UA可以進行偽裝。?
瀏覽器的UA字串的標準格式:瀏覽器標識(操作系統(tǒng)標識;加密等級標識;瀏覽器語言)渲染引擎標識版本信息灼擂。但各個瀏覽器有所不同壁查。
我們在做爬蟲的時候,不是通過瀏覽器正常訪問剔应,所以會被很多網(wǎng)站禁止訪問睡腿,這個時候我們就需要手動在headers里加上UA屬性,來偽裝成瀏覽器進行訪問峻贮。
參考地址:https://www.cnblogs.com/fu-yong/p/9017471.html
防爬規(guī)避
? ? 1席怪,User Agent pool
?????? 用戶信息池,可以偽裝不同的用戶在瀏覽網(wǎng)頁纤控。
? ? 2挂捻,IP pools
?????? Ip池,可以偽裝成不同的ip在不同的地方瀏覽網(wǎng)頁船万。
參考地址:https://blog.csdn.net/wtftx/article/details/89642527
golang 爬蟲框架推薦
????????gocolly是用go實現(xiàn)的網(wǎng)絡(luò)爬蟲框架刻撒,gocolly快速優(yōu)雅,在單核上每秒可以發(fā)起1K以上請求耿导;以回調(diào)函數(shù)的形式提供了一組接口声怔,可以實現(xiàn)任意類型的爬蟲;依賴goquery庫可以像jquery一樣選擇web元素碎节。
??? 參考地址:https://studygolang.com/articles/12073
? ? github地址:https://github.com/gocolly/colly
? ? ?gocolly官網(wǎng):http://go-colly.org