婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang如何實現抓取IP地址的蜘蛛程序詳解

golang如何實現抓取IP地址的蜘蛛程序詳解

熱門標簽:浙江高頻外呼系統多少錢一個月 鄭州亮點科技用的什么外呼系統 濱州自動電銷機器人排名 建造者2地圖標注 黃岡人工智能電銷機器人哪個好 汕頭小型外呼系統 阿里云ai電話機器人 惠州電銷防封電話卡 釘釘有地圖標注功能嗎

背景

要做IP地址歸屬地查詢,量比較大,所以想先從網上找到大部分的分配數據,寫個蜘蛛程序來抓取入庫,以后在程序的運行中不斷進行維護、更新、完善。

一些關鍵點

  • goroutine的使用,讓程序并行運行。
  • 正則表達式分組信息提取的使用,正確的提取我們關注的信息。
  • 數據庫批量插入操作。
  • 數據庫批量更新操作。

代碼解析

按功能模塊對核心代碼進行說明

ip.go

主進程,實現goroutine的調用。

func main() {
 //利用go基本庫封裝的網頁抓取函數,后面有說明
 ctx := common.HttpGet("http://ips.chacuo.net/") 
 //正則表達式,有兩個分組(兩組小括號),分別取城市信息與url,具體分析代碼后面有說明
 reg := regexp.MustCompile(`li>a title="[\S]+" href='([^']+?)'>([^]+?)/a>/li>`)  
 //取得頁面上所有的城市及相應url
 ips := reg.FindAllStringSubmatch(string(ctx), -1)

 ch := make(chan string) //建立無緩沖字符串通道

 for _, el := range ips { //一個協程處理一個具體頁面
  go ipSpider.SpiderOnPage(el[1], el[2], ch)
 }

 for range ips {   //阻塞等待所有抓取工作全部完成
  fmt.Println(-ch)
 }
}

正則表達式說明

主進程針對所有省有入口頁面,取得每省的入口分配給一個協程去處理,每一個入口是這個樣子

a title="北京最新IP地址段"  rel="external nofollow" >北京/a>
  • 請注意,這里面變化只有三個部分(title內容,href內容,鏈接顯示內容),其中兩個部分是我們需要的
  • title內容對應正則為 [\S]+ ,非空白符
  • href內容對應的正則為 ([^']+?) ,第一次遇到單引號結束,問號表示非貪婪匹配,括號是分組,能方便取出所匹配信息
  • 鏈接顯示內容對應的正則為 ([^]+?) , 第一次遇到時結束,第二個分組
  • FindAllStringSubmatch函數可以取出所有子分組,子分組從下標1開始,0為正則整體匹配的字符串

goroutine 流程

  • 建立一個無緩沖字符串通道,作為所有協程與主進程通信通道
  • 循環正則匹配結果,為每一個省的頁面分配一個協程
  • 協程獲取數據成功并批量寫數據庫,返回成功信息到通道
  • 協程處理失敗,反回失敗信息到通道
  • 主進程阻塞等所有協程成功或失敗返回,并打印成功或失敗信息

獲取ip地址信息

與主進程類似,注意無信息時處理。

IpSpider.go

 //獲取頁面數據
 ctx := common.HttpGet(url)
 //reg := regexp.MustCompile(`li>a title="[\S]+" href='([^']+?)'>([^]+?)/a>/li>`)
 //兩個分組分別對應IP段開始與結束
 reg := regexp.MustCompile(`dd>span class="v_l">([^]+?)/span>span class="v_r">([^]+?)/span>div class="clearfix">/div>/dd>`)
 //dd>span class="v_l">49.64.0.0/span>span class="v_r">49.95.255.255/span>div class="clearfix">/div>/dd>
 //取得所有匹配的分組信息
 ip := reg.FindAllStringSubmatch(string(ctx), -1)
 //沒有取得任何信息,提前返回,很重要,不然主進程會一直等待結束不了
 if len(ip) == 0 {
  ch - "There are no data exist."
  return nil
 }

數據庫表結構生成語句

CREATE TABLE `ip_addr_info` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '索引,自動增長',
 `ip_addr_begin` varchar(32) NOT NULL DEFAULT '' COMMENT 'ip地址段開始',
 `ip_addr_end` varchar(32) DEFAULT '' COMMENT 'ip地址段結束',
 `province` varchar(32) DEFAULT '' COMMENT '所屬省',
 `ip_comp` varchar(32) DEFAULT '' COMMENT '運營商',
 PRIMARY KEY (`id`),
 UNIQUE KEY `ip_addr` (`ip_addr_begin`,`ip_addr_end`)
) ENGINE=InnoDB AUTO_INCREMENT=7268 DEFAULT CHARSET=utf8 COMMENT='表';

批量寫入數據庫

循環處理抓取數據,生成批量寫入語句及輸入參數,請簽到出到afc9ebd版本。

 var vs [] interface{}  //存儲輸入參數的接口數組
 var vss string    //待拼接的輸入參數占位符字符串
 for _, el := range ip {  //處理所有的數據
  vs = append(vs, el[1], el[2], province) //每一列包括開始地址、結束地址與省份
  vss += "(?,?,?),"  //占位符
 }
 vss = vss[0:len(vss) -1]  //去掉最后的逗號
 var configs interface{}  //從配置文件取數據庫信息
 fr, err := os.Open("./configs.json") //配置文件內容請參照上篇文章《golang實現mysql數據庫備份》
 if err != nil {
  ch - err.Error()
  return err
 }
 decoder := json.NewDecoder(fr)
 err = decoder.Decode(configs)

 confs := configs.(map[string]interface{})
 dialect := confs["database_dialect"].(string)

 dbConf := confs["db_"+dialect+"_config"].(map[string]interface{})
 dbHost := dbConf["db_host"].(string)
 dbPort := strconv.FormatFloat(dbConf["db_port"].(float64), 'f', -1, 32)
 dbUser := dbConf["db_user"].(string)
 dbPass := dbConf["db_pass"].(string)
 dbName := dbConf["db_name"].(string)
 dbCharset := dbConf["db_charset"].(string)

 dao, err := mysql.Open(dialect, dbUser + ":"+dbPass+"@tcp("+dbHost+":"+dbPort+")/"+dbName+"?charset="+dbCharset)
 defer dao.Close()
 if err != nil {
  ch - err.Error()
  return err
 }
 //批量插入語句拼接
 sqlstr := "insert into ip_addr_info (ip_addr_begin,ip_addr_end,province) values " + vss
 stmt, err := dao.Prepare(sqlstr) //預處理帶參數的sql語句
 rs, err := stmt.Exec(vs...)   //帶參數執行sql語句
 if err != nil {     //出錯,返回錯誤信息
  ch - err.Error()
  return err
 }else {       //成功,返回成功信息
  affect, _ := rs.RowsAffected()
  ch - "Province: " + province + ", affect: " + strconv.FormatInt(affect, 10)
  return nil
 }

批量修改數據庫

數據庫中的ip_comp字段,是代表運營商信息,需要從運營商頁面進入進行數據獲取,只需改一下入口url重新運行程序就能正確抓取,但這時入庫就不是新增了,而是更新,請簽出到4729e66版本。

 //前提數據庫表定義要設定唯一索引,主鍵或其它定義的unique索引
 ...
 
 sqlstr := "insert into ip_addr_info (ip_addr_begin,ip_addr_end,ip_comp) values " + vss +
  //提供更新(唯一索引沖突時)時要對應原字段與值
  " ON DUPLICATE KEY UPDATE ip_addr_begin = values(ip_addr_begin), ip_addr_end = values(ip_addr_end), ip_comp = values(ip_comp)"
 stmt, err := dao.Prepare(sqlstr)
 rs, err := stmt.Exec(vs...)
 if err != nil {
  ch - err.Error()
  return err
 }else {
  affect, _ := rs.RowsAffected()
  ch - "Province: " + province + ", affect: " + strconv.FormatInt(affect, 10)
  return nil
 }

待改進的方面

把入口url提到配置中,使用策略模式,讓匹配規則抽象成策略,目標是不改程序,調整配置文件就可以抓取不同的網頁。

項目地址

https://github.com/zhoutk/goTools

使用方法

git clone https://github.com/zhoutk/goTools
cd goTools
go get
go run ip.go

go buid ip.go
./ip  

小結

熟悉了golang語言,了解了一種全新的并發編程模式,熟悉了具體的數據庫操作方法,給自己生成了一個方便的工具。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Go語言通過http抓取網頁的方法
  • go語言實現一個簡單的http客戶端抓取遠程url的方法
  • golang抓取網頁并分析頁面包含的鏈接方法

標簽:東營 泰安 瀘州 晉中 阿壩 昭通 滄州 駐馬店

巨人網絡通訊聲明:本文標題《golang如何實現抓取IP地址的蜘蛛程序詳解》,本文關鍵詞  golang,如何,實現,抓取,地址,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang如何實現抓取IP地址的蜘蛛程序詳解》相關的同類信息!
  • 本頁收集關于golang如何實現抓取IP地址的蜘蛛程序詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品色婷婷久久58| 国内成人免费视频| 色哟哟国产精品免费观看| 久久成人久久爱| 一区二区在线观看免费视频播放| 欧美一区二区三区视频在线| 99精品视频在线观看免费| 九九**精品视频免费播放| 国产午夜亚洲精品不卡| 欧美成人女星排名| 欧美日韩精品电影| 色www精品视频在线观看| 成人精品一区二区三区中文字幕| 日日骚欧美日韩| 午夜久久久影院| 1024成人网色www| 中文字幕av一区二区三区免费看| 久久亚洲一区二区三区四区| 日韩欧美精品三级| 欧美精品黑人性xxxx| 色999日韩国产欧美一区二区| www.成人在线| av电影在线观看一区| 97超碰欧美中文字幕| 99re热视频精品| 成人aaaa免费全部观看| 国产成人av一区二区三区在线观看| 五月婷婷激情综合网| 亚洲乱码国产乱码精品精的特点| 色婷婷久久一区二区三区麻豆| 麻豆成人综合网| 看电视剧不卡顿的网站| 亚洲国产中文字幕| 精品少妇一区二区三区在线播放| 日韩欧美一区中文| 在线播放中文一区| 欧美变态tickling挠脚心| 欧美精品丝袜中出| 精品国一区二区三区| 911精品产国品一二三产区| 欧美一区二区三区四区视频| 精品视频在线看| 91视频在线观看| 欧美午夜精品久久久久久超碰 | 亚洲激情一二三区| 亚洲一区二区三区爽爽爽爽爽| 最新日韩在线视频| 天天影视涩香欲综合网| 午夜精品福利在线| 国产成人综合在线| 国产乱对白刺激视频不卡| 日韩电影在线观看一区| 成人综合婷婷国产精品久久免费| 国产成人亚洲综合色影视| 欧美制服丝袜第一页| 欧美日韩精品一区二区三区四区| 久久综合九色综合97婷婷| 欧美刺激脚交jootjob| 亚洲欧美在线高清| 精品久久久久一区二区国产| 91美女片黄在线观看91美女| 日韩精品中文字幕在线不卡尤物| 久久亚洲精华国产精华液| 国产日产欧美精品一区二区三区| 国产精品激情偷乱一区二区∴| 日韩激情在线观看| 国产一区二区三区久久悠悠色av | 亚洲午夜在线观看视频在线| 视频一区中文字幕| 国产剧情一区在线| 欧美福利视频一区| 26uuu国产在线精品一区二区| 亚洲激情成人在线| 蜜桃视频免费观看一区| 色综合夜色一区| 欧美一区二区三区视频在线观看| 亚洲黄色在线视频| 免费在线观看成人| 韩国成人福利片在线播放| 欧美日韩国产综合一区二区| 久久婷婷久久一区二区三区| 日韩精品免费视频人成| 大美女一区二区三区| 精品国产91久久久久久久妲己 | 国产69精品久久久久毛片| 91老师片黄在线观看| 色婷婷国产精品| 国产精品毛片久久久久久久| 亚洲国产精品欧美一二99| 91蝌蚪国产九色| 日韩欧美一级在线播放| 日本亚洲电影天堂| 成人高清免费观看| 日本一区二区动态图| 亚洲欧美视频在线观看视频| 国产精品久久久久久久浪潮网站| 日韩在线一区二区| 91视频91自| 一区二区三区精品视频| 国产在线精品一区二区| 91精品国产综合久久久蜜臀粉嫩 | 亚洲午夜在线电影| 极品瑜伽女神91| 777午夜精品免费视频| 亚洲男人的天堂av| 91麻豆精东视频| 国产欧美日韩另类一区| 国产在线不卡一区| 91精品1区2区| 一区二区三区加勒比av| 色婷婷久久久综合中文字幕| 91精品国产美女浴室洗澡无遮挡| 午夜不卡av在线| 91福利区一区二区三区| 石原莉奈一区二区三区在线观看| 亚洲欧洲三级电影| 视频一区二区三区入口| 欧美久久久久久久久久| 亚洲第一av色| 97成人超碰视| 日韩**一区毛片| 欧美丰满少妇xxxbbb| 国产在线麻豆精品观看| 精品久久久久久最新网址| 国产福利不卡视频| 国产精品福利电影一区二区三区四区| 综合精品久久久| 精东粉嫩av免费一区二区三区| 日韩女优毛片在线| 国产一区二区在线影院| www日韩大片| 国产真实乱对白精彩久久| 久久这里只精品最新地址| 国产麻豆一精品一av一免费| 国产精品69毛片高清亚洲| 欧美精彩视频一区二区三区| 国产精品一二二区| 欧美国产欧美综合| a亚洲天堂av| 一区二区在线观看视频在线观看| 欧美色大人视频| 麻豆一区二区三区| 国产成人亚洲精品狼色在线| 国产日韩欧美制服另类| aaa欧美日韩| 视频一区二区不卡| 日韩一级片在线播放| 成人综合婷婷国产精品久久免费| 亚洲免费在线观看| 国产九色精品成人porny| 亚洲综合在线观看视频| 色综合咪咪久久| 国产精品一区三区| 亚洲综合免费观看高清完整版 | 国产精品久久99| 成人激情免费网站| 韩国一区二区在线观看| 久久综合色婷婷| 日韩视频在线你懂得| 国产一区二区三区免费看| 日本大胆欧美人术艺术动态| 欧美久久久久久久久中文字幕| 91丝袜国产在线播放| 免费观看在线色综合| 亚洲不卡在线观看| 国产视频一区不卡| 精品国产网站在线观看| 日本高清不卡aⅴ免费网站| 波多野结衣视频一区| 青青青爽久久午夜综合久久午夜 | 国产电影一区二区三区| 中文字幕在线不卡一区| 欧美性感一区二区三区| 国产91丝袜在线观看| 五月婷婷另类国产| 视频一区二区不卡| 亚洲色图.com| 国产精品国产三级国产有无不卡| 欧美日韩综合在线| 欧美日韩成人高清| av成人动漫在线观看| 精品日韩av一区二区| jlzzjlzz亚洲日本少妇| 91蜜桃网址入口| 蜜桃av噜噜一区二区三区小说| 婷婷开心久久网| 亚洲免费观看高清在线观看| 亚洲精品高清在线观看| 国产精品丝袜一区| 亚洲黄色av一区| 日韩欧美三级在线| 日本一区二区三区dvd视频在线| 欧美日韩中文字幕一区二区| 欧美日韩1234| 不卡视频一二三四| 久久国产麻豆精品| 日本伊人精品一区二区三区观看方式| 国产精品久久网站| 亚洲一区免费在线观看| 国产日韩欧美精品综合|