go ip過濾_用Go實現自己的爬蟲

4b5ebadcf5cb3341ef8e29beb1441f8f.png

作者:Masamune

在日常生活中,我們時常會遇到一些采集數據相關的需求,比如獲取一些官方數據整理到excel表中進行統計,聚合一些網頁新聞提高自己的閱讀效率等等。

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

爬蟲預期的爬取規模決定的爬蟲程序本身的復雜度,本文將從語言到結構部分簡單闡述如何設計一個爬蟲程序。

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

爬取并列出ve2x首頁的文章標題示例

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())}
}

示例結果:

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

結構設計

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

任務分發

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

任務處理

真實執行爬取任務的程序應該是無狀態的,從隊列獲取到爬取任務后按業務規則進行處理,這部分程序可以通過多節點部署十分方便的進行擴展,不用擔心數據丟失的問題,也方便做并發量的控制。

數據落地

建議通過數據庫進行數據落地,并且針對每個URL的每次請求結果都進行存檔,方便數據回溯,對于存儲空間的消耗可能會相當大,這個需要根據爬蟲規模自行評估如何做數據的落地和輪轉。

數據處理

可以將已經落地的數據接入全文搜索引擎進行處理,具體則根據業務的復雜度和成本選取合適的方案。

URL去重

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

任務再分發

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

關于反爬蟲

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

動態內容處理

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

UserAgent

一般的HTTP客戶端有一個默認的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,有些網站可能會通過UserAgent來識別異常的請求來源從而進行限制,當然這種方式比較低級,但確實有效,我們自己在請求的時候可能需要寫入一個比較正常的UserAgent,甚至可以搜集多個常見瀏覽器的UserAgent值,發起請求的時候隨機選取填入。

IP

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

控制爬取頻率

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

驗證碼

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

爬蟲陷阱

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

內容

更惡心的反爬手段是,如果觸發了網站的反爬規則,并不會直接拒絕請求,而是返回看似正常,但其實是虛假的數據。這種問題不易被發現,而且難以追查反爬策略,只能盡可能的關注爬取內容,做好質量控制。

最后

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538668.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flume實戰采集文件內容存入HDFS

1、flume安裝目錄下新建文件夾 example 2、在example下新建文件 log-hdfs.conf 內容如下: # Name the components on this agent a1.sources r1 a1.sinks k1 a1.channels c1#exec 指的是命令 # Describe/configure the source a1.sources.r1.type exec #F…

總結計算機語言的基本元素,認識程序設計中基本元素教案.doc

曲靖師院計算機科學與工程學院學生試講教案表課題:認識程序中的基本元素 年級:高一 課時:1課時授課時間:20分鐘 講授者:秦巧林 指導教師:崔麗梅教學目標知識與技能1. 掌握計算機程序中常用的常量、變量、函…

python海龜繪圖圓形_python之海龜繪圖

1. 基本功能介紹 在海龜作圖中,我們可以編寫指令讓一個虛擬的(想象中的)海龜在屏幕上來回移動。這個海龜帶著一只鋼筆,我們可以讓海龜無論移動到哪都使用這只鋼筆來繪制線條。通過編寫代碼,以各種很酷的模式移動海龜&a…

PLSQL Developer導入csv文件到oracle

csv文件內容: 要導入的表結構 create table RPT_MONILUCE_2_P01 ( imsi NUMBER, road_line NUMBER, ci NUMBER, diff NUMBER, rn NUMBER, sdate DATE, report_id NUMBER(20) ) 步驟: 1、在csv第一行上增加…

erwin 不能輸入中文_國產開源建模軟件PDMan與國外商業建模軟件ERwin的主要功能比較...

在數據庫建模的過程中,我們經常會使用到ERwin或者Power Designer之類的建模軟件,來構建我們的邏輯模型和物理模型。但是這類軟件都屬于商業軟件,需要企業購買相應的許可證授權。有些時候,我們會在沒有購買這類商業建模軟件的環境下…

Confluence 6 workbox 通知包含了什么

當一個用戶在 Confluence 中進行下面的操作的時候,workbox 將會顯示為通知: 分享(Shares) 你的頁面或者博客頁面。 提及(Mentions) 你的頁面,博客頁面,回復或者任務。你 關注&#x…

已知一點經緯度,方位角,距離,求另一點經緯度

參考了博文:http://blog.csdn.net/pyx6119822/article/details/52298037 ------------------------------------------------ package hellotest;public class LonLatTest3 {/** 大地坐標系資料WGS-84 長半徑a6378137 短半徑b6356752.3142 扁率f1/298.2572236*//**…

計算機一級excel如何選擇2個,2017年計算機一級excel操作題(2)

(3)建立和編輯圖表選擇工作簿中需要編輯的表單,為其添加圖表,其具體操作如下:步驟1選取“電腦城日出貨統計表”的“配件”和“所占比例”兩列,選擇【插入一圖表】命令,在彈出的“圖表向導”對話框“標準類型”的“圖表…

python的基本語術_一起學python-徹底掌握專業術語“變量”的概念

昨天分享了笨方法學習編程,今天就讓我們通過實戰來接觸python,掌握專業術語“變量”的概念吧 python 中的變量的基本概念和初中代數的方程式X的概念是一樣的,只是在計算機程序當中這個X不僅僅可以代表一個數字,還可以代表一段文字…

lamp自動部署工具_Linux一鍵配置工具ezhttp介紹

簡介: ezhttp是一個Linux一鍵配置工具,采用bash腳本語言編寫。支持自動配置LAMP,LNMP,LNAMP環境,以前提供各種其它的配置工具,如自動配置swap,配置iptables等。項目托管在github,地址為https://github.com/centos-bz/e…

Maven錯誤

1、軟件包javax.servlet不存在 解決辦法: 從tomcat lib目錄下拷貝一個servlet-api.jar的包到“JDK\jre\lib\ext”目錄下 凡是出現找不到包的情況,都可以將找到的包放到JDK\jre\lib\ext下,然后再編譯就能夠通過。 有方法是在pom.xml中引用s…

我對計算機感興趣作文300字,我想對電腦游戲說作文300字

電腦游戲呀!電腦游戲呀!我知道你被人們創造出來,是想給人們帶來快樂,可你也給人們帶來了不少煩惱呀!你可知道,自從爸爸迷上了你,就像是變了一個人似的……每天清晨,天還蒙蒙亮&#…

git設置全局賬號密碼_jenkins2.222使用之二、總體設置

構建前提:由于構建的時候是基于maven、git(碼云)以及jdk1.8來的,所以這些都需要和jenkins安裝在同一臺服務器上面。全局工具配置:1、配置jdk系統管理-全局工具配置-jdk,配置如下:jdk版本可以配置多個,構建的時候&#…

Mybatis源碼之(TypeAliasRegistry)TypeAlias別名實現機制

原文鏈接:http://blog.csdn.net/qq924862077/article/details/52612589 ---------------------------------- 在Mybatis編程中我們經常會用到將某個bean作為參數類型parameterType或者結果返回值類型ResultType,所以很多時候我們需要把完成的Bean的包名…

Java中Synchronized的用法

2019獨角獸企業重金招聘Python工程師標準>>> 《編程思想之多線程與多進程(1)——以操作系統的角度述說線程與進程》一文詳細講述了線程、進程的關系及在操作系統中的表現,這是多線程學習必須了解的基礎。本文將接著講一下Java線程同步中的一個重要的概念…

concat特征融合_MSFNet:多重空間融合網絡進行實時語義分割(北航和曠視聯合提出)...

作者:Tom HardyDate:2020-02-01來源:MSFNet:多重空間融合網絡進行實時語義分割(北航和曠視聯合提出)原文鏈接:https://arxiv.org/abs/1911.07217主要內容實時語義分割是一項具有挑戰性的任務,因…

wifi信號手機測試軟件,專業的WiFi檢測工具有哪些?如何解決wifi信號不好?

原標題:專業的WiFi檢測工具有哪些?如何解決wifi信號不好?有朋友wifi測試軟件有哪些?WiFi信號和聲音一樣,強弱都是可以測量的,檢測WiFi的方法有很多,作為普通的家庭用戶,我們有時需要…

python創建數組與列表_python基礎(三):數組和列表

下面是小凰凰的簡介,看下吧! 💗人生態度:珍惜時間,渴望學習,熱愛音樂,把握命運,享受生活 💗學習技能:網絡 -> 云計算運維 -> python全棧( 當前正在學習…

Mybatis之typeAlias配置的3種方法

原文鏈接&#xff1a;http://www.cnblogs.com/lxcmyf/p/6444120.html ------------------------------- 擴展閱讀&#xff1a;http://blog.csdn.net/zengmingen/article/details/70163420 ------------------------------------ 1.定義別名&#xff1a; <typeAliases>…

PHP 開啟或關閉錯誤提示

如果不具備修改 php.ini 的權限&#xff0c;可以如下&#xff1a; // 只需在php文件中加入這兩句即可開啟PHP錯誤提示ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT); 如果具備修改 php.ini 權限的話&#xff0c;如下即可&#xff…