日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go ip过滤_用Go实现自己的爬虫

發(fā)布時間:2025/3/11 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go ip过滤_用Go实现自己的爬虫 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:Masamune

在日常生活中,我們時常會遇到一些采集數(shù)據(jù)相關(guān)的需求,比如獲取一些官方數(shù)據(jù)整理到excel表中進(jìn)行統(tǒng)計,聚合一些網(wǎng)頁新聞提高自己的閱讀效率等等。

雖然許多爬蟲教程都是用python寫的,但是我認(rèn)為Go語言是比python更合適的選擇,Go語言有著優(yōu)秀的并發(fā)特性,很容易就可以寫出高并發(fā)量的爬蟲,并且沒有python煩人的編碼轉(zhuǎn)換混亂的問題。

爬蟲預(yù)期的爬取規(guī)模決定的爬蟲程序本身的復(fù)雜度,本文將從語言到結(jié)構(gòu)部分簡單闡述如何設(shè)計一個爬蟲程序。

首先我們選用的Go庫是github.com/PuerkitoBio/goquery,先上示例:

爬取并列出ve2x首頁的文章標(biāo)題示例

package mainimport ("fmt""github.com/PuerkitoBio/goquery" )func main() {root, err := goquery.NewDocument("https://www.v2ex.com/")if err != nil {panic(err)}root = goquery.NewDocumentFromNode(root.Find("div#Main").Nodes[0])nodes := root.Find("span.item_title").Nodesfor _, n := range nodes {fmt.Println(goquery.NewDocumentFromNode(goquery.NewDocumentFromNode(n).Find("a").Nodes[0]).Text())} }

示例結(jié)果:

怎么記憶不同發(fā)行版的一些差別? [討論]當(dāng)代下,對拿來主義和分享主義取舍的迷惑 macOS Mojave 和 Catalina 哪個更好用 誰能做一個監(jiān)控社會物資捐贈和 redten 字會收入和發(fā)放的頁面 macOS 如何更新 Python ? 暫時選擇了 magic keyboard,有沒其他推薦? git clone 有沒有什么有效的加速方法 誰能提供微軟官網(wǎng)上面的 Win10 鏡像 sha1 值 阿里云輕量級服務(wù)器提速原理是啥呢? 為什么我這段返鄉(xiāng)戴笠忽然失效了~~ 跨網(wǎng)絡(luò)隊列服務(wù)項目更新了~ [wukongqueue] 迫于窮, 300 塊錢以內(nèi)的無線鍵盤、鼠標(biāo),求推薦~ 有沒有感興趣一起學(xué)習(xí)英語的? 微信小程序咨詢: 請求私人 API,是否收費問題
  • 該庫可以對html文檔結(jié)構(gòu)進(jìn)行解析,并提供了類似DOM的API對html頁面內(nèi)的元素的內(nèi)容進(jìn)行提取,十分方便,相較于正則表達(dá)式來說更加優(yōu)雅,具體細(xì)節(jié)可以參照文檔和自己測試。
  • 注意調(diào)試頁面過程中建議將頁面保存成本地文件,每次運行的時候通過文件讀取頁面,否者抓取頻率過高可能會觸發(fā)網(wǎng)站的反爬規(guī)則。
  • 對于分析頁面的引用庫建議隔離一層接口,方便以后進(jìn)行替換。

結(jié)構(gòu)設(shè)計

對于絕大多數(shù)人來說,一個單機單進(jìn)程的爬蟲已經(jīng)滿足需求了,但是一個有點規(guī)模的爬蟲如何做呢?這里簡答闡述一個分布式的爬蟲的設(shè)計思路。

任務(wù)分發(fā)

這部分建議使用隊列中間件或者隊列云服務(wù),將爬取請求拆分成一個一個任務(wù),投遞到消息隊列,而真實執(zhí)行爬取任務(wù)的程序則從消息隊列里獲取任務(wù)進(jìn)行爬取和分析,再進(jìn)行數(shù)據(jù)落地。

任務(wù)處理

真實執(zhí)行爬取任務(wù)的程序應(yīng)該是無狀態(tài)的,從隊列獲取到爬取任務(wù)后按業(yè)務(wù)規(guī)則進(jìn)行處理,這部分程序可以通過多節(jié)點部署十分方便的進(jìn)行擴展,不用擔(dān)心數(shù)據(jù)丟失的問題,也方便做并發(fā)量的控制。

數(shù)據(jù)落地

建議通過數(shù)據(jù)庫進(jìn)行數(shù)據(jù)落地,并且針對每個URL的每次請求結(jié)果都進(jìn)行存檔,方便數(shù)據(jù)回溯,對于存儲空間的消耗可能會相當(dāng)大,這個需要根據(jù)爬蟲規(guī)模自行評估如何做數(shù)據(jù)的落地和輪轉(zhuǎn)。

數(shù)據(jù)處理

可以將已經(jīng)落地的數(shù)據(jù)接入全文搜索引擎進(jìn)行處理,具體則根據(jù)業(yè)務(wù)的復(fù)雜度和成本選取合適的方案。

URL去重

在爬取任務(wù)執(zhí)行之前,需要判斷URL在之前是否已經(jīng)爬取過,對于已經(jīng)爬取過的URL不需要在進(jìn)行處理。這部分建議使用redis進(jìn)行處理。對于已經(jīng)爬取過的URL,作為key存到redis中,每次爬取之前都從redis中嘗試獲取一次,如果存在則跳過,這部分往深了做還可以使用布隆過濾器進(jìn)行優(yōu)化,這里不再闡述。

任務(wù)再分發(fā)

爬蟲任務(wù)可能是通過其他程序或者人工生成的,也可能是在爬取任務(wù)處理過程中生成的,比如遞歸的爬取某個界面上的超鏈接,在這種情況下需要仔細(xì)處理再生成的任務(wù),一些爬蟲陷阱就埋在里面。比如某個連接正常用戶永遠(yuǎn)無法點擊到,但是爬蟲在分析html頁面的時候沒有注意而直接進(jìn)行請求的話,則會觸發(fā)反爬規(guī)則被屏蔽。

關(guān)于反爬蟲

爬取與反爬取是一個永恒的對抗,一般來說,只要爬取頻率不要太高,就不容易觸發(fā)網(wǎng)站的反爬規(guī)則,思路就是盡量偽裝成正常的客戶端請求。這里有需要注意的幾點:

動態(tài)內(nèi)容處理

有些需要的網(wǎng)頁內(nèi)容并不是html頁面直接提供的,而是通過瀏覽器渲染后動態(tài)生成的,對于這部分頁面,可以交由PhantomJS進(jìn)行處理,獲得渲染后的頁面再進(jìn)行分析處理。

UserAgent

一般的HTTP客戶端有一個默認(rèn)的UserAgent,比如Go語言官方的httpclient的類似:Go-http-client/1.1,而一般一個普通瀏覽器的UserAgent類似:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36,有些網(wǎng)站可能會通過UserAgent來識別異常的請求來源從而進(jìn)行限制,當(dāng)然這種方式比較低級,但確實有效,我們自己在請求的時候可能需要寫入一個比較正常的UserAgent,甚至可以搜集多個常見瀏覽器的UserAgent值,發(fā)起請求的時候隨機選取填入。

IP

如果同一個IP存在大量請求,肯定是會進(jìn)行反爬處理,規(guī)避的方案就是需要大量的代理組成代理池,請求的時候隨機選取,通過代理請求則可以避免對單一IP的屏蔽。隨之而來的就是對代理本身請求成功率的評估,如果某一個代理的請求成功率太低,則需要考慮踢出代理池,以免對爬取效率造成影響。

控制爬取頻率

控制爬取頻率是非常重要的,如果請求頻率太高引起網(wǎng)站管理員的注意就得不償失了。這里建議將爬取的請求拆分成一個一個的任務(wù),結(jié)合消息隊列進(jìn)行爬取頻率的控制,可以通過Go本身的channel進(jìn)行限流,也可以結(jié)合外部隊列中間件進(jìn)行限制。

驗證碼

簡單的方案就是選擇一個識別簡單驗證碼的庫,付費的話可以調(diào)用別人的識別驗證碼的API。

爬蟲陷阱

有些超鏈接埋在html頁面里并沒有顯示,正常用戶不可能請求,但是如果爬蟲程序識別為普通超鏈接并且發(fā)起請求的話,就會觸發(fā)反爬規(guī)則被屏蔽。

內(nèi)容

更惡心的反爬手段是,如果觸發(fā)了網(wǎng)站的反爬規(guī)則,并不會直接拒絕請求,而是返回看似正常,但其實是虛假的數(shù)據(jù)。這種問題不易被發(fā)現(xiàn),而且難以追查反爬策略,只能盡可能的關(guān)注爬取內(nèi)容,做好質(zhì)量控制。

最后

總的來說,爬蟲的規(guī)模根據(jù)當(dāng)前需求進(jìn)行設(shè)計,簡單的單機單進(jìn)程就滿足需求。復(fù)雜的就需要考慮設(shè)計成分布式程序跨機運行并且具有良好的擴展性。每個人都可以擁有自己的爬蟲,方便自己的生活。

總結(jié)

以上是生活随笔為你收集整理的go ip过滤_用Go实现自己的爬虫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。