亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

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

2020-04-01 18:56:29
字體:
來源:轉載
供稿:網友

背景

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

一些關鍵點

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

代碼解析

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

ip.go

主進程,實現goroutine的調用。

func main() { //利用go基本庫封裝的網頁抓取函數,后面有說明 ctx := common.HttpGet("http://ips.chacuo.net/")  //正則表達式,有兩個分組(兩組小括號),分別取城市信息與url,具體分析代碼后面有說明 reg := regexp.MustCompile(`<li><a  //取得頁面上所有的城市及相應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 style="margin: 0px; padding: 0px; outline: none; line-height: 25.2px; font-size: 14px; width: 660px; overflow: hidden; clear: both; font-family: tahoma, arial, "Microsoft YaHei";">	
 //獲取頁面數據 ctx := common.HttpGet(url) //reg := regexp.MustCompile(`<li><a //兩個分組分別對應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/goToolscd goToolsgo getgo run ip.gogo buid ip.go./ip  

小結

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

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线资源| 国内成人精品一区| 色一区av在线| 欧美日韩亚洲视频一区| 国产精品嫩草影院一区二区| 亚洲最大福利视频网| 日韩av一区在线| 久久久精品中文字幕| 国产丝袜一区视频在线观看| 91在线精品播放| 亚洲天堂一区二区三区| 久久久女人电视剧免费播放下载| 色综合老司机第九色激情| 亚洲精品动漫100p| 夜夜狂射影院欧美极品| 亚洲乱亚洲乱妇无码| 91精品在线看| 日韩av在线看| 国产精品久久久久久久电影| 国产精品久久久久久久久久久不卡| 97久久久久久| 91精品国产91久久久久久吃药| 5566日本婷婷色中文字幕97| 深夜精品寂寞黄网站在线观看| 亚洲最大成人网色| 国语自产精品视频在线看一大j8| 久久艹在线视频| 日本韩国在线不卡| 久久久在线观看| 深夜福利日韩在线看| 在线视频免费一区二区| 国产一区二区三区视频在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 日韩美女在线观看一区| 啊v视频在线一区二区三区| 日韩美女视频中文字幕| 欧美另类极品videosbestfree| 日韩最新中文字幕电影免费看| 成人有码视频在线播放| 亚洲伊人第一页| 青草成人免费视频| 日韩美女免费视频| 秋霞成人午夜鲁丝一区二区三区| 国产精品一区电影| 91精品国产91久久久久久久久| 亚洲国产成人久久综合| 欧美激情在线观看视频| 亚洲精品成人久久| 久久久久北条麻妃免费看| 亚洲欧美国产另类| 欧美裸体xxxxx| 久久精品国产精品亚洲| 日韩一区二区三区在线播放| 亚洲精品资源美女情侣酒店| 国产拍精品一二三| 欧美激情综合亚洲一二区| 伊人久久久久久久久久久| 国产精品va在线播放| 在线国产精品视频| 欧洲美女免费图片一区| 91精品国产乱码久久久久久蜜臀| 亚洲成人免费网站| 日本午夜人人精品| 96pao国产成视频永久免费| 国产丝袜精品第一页| 成人有码在线视频| 国产激情视频一区| 亚洲综合中文字幕在线观看| 国产精品自产拍高潮在线观看| 亚洲欧美日本精品| 久久久999国产| 国产成人自拍视频在线观看| 成人两性免费视频| 超碰日本道色综合久久综合| 国产亚洲成精品久久| 欧美一区二粉嫩精品国产一线天| 欧美成人免费视频| 欧美极品美女视频网站在线观看免费| 日韩在线视频播放| 国产精品久久久久久久久久久久久久| 91视频国产一区| 成人精品视频久久久久| 97超级碰碰碰久久久| 国产精品99久久久久久白浆小说| 亚洲精品美女在线观看播放| 日韩视频中文字幕| 国产成人精品免费久久久久| 上原亚衣av一区二区三区| 久国内精品在线| 国产这里只有精品| 亚洲欧美国产一区二区三区| 成人国产精品久久久久久亚洲| 91精品国产综合久久香蕉最新版| 综合激情国产一区| 亚洲精品久久久久中文字幕欢迎你| xvideos国产精品| 96pao国产成视频永久免费| 国产一区视频在线| 91网站在线免费观看| 欧美乱大交做爰xxxⅹ性3| 精品中文字幕在线观看| 亚洲第一精品电影| 国产亚洲精品美女| 久久久精品中文字幕| 午夜精品一区二区三区在线视| 久热精品视频在线观看| 91精品国产自产在线| 精品国产31久久久久久| 亚洲男人天堂网| xxx一区二区| 国产亚洲视频在线观看| 性色av一区二区三区在线观看| 久久影视电视剧免费网站| 欧美一级淫片丝袜脚交| 成人免费大片黄在线播放| 操日韩av在线电影| 精品亚洲国产视频| 国产亚洲美女精品久久久| 亚洲欧美日韩天堂一区二区| 国产精品一区二区三区免费视频| 欧美激情精品久久久久久变态| 国产999精品久久久影片官网| 国内揄拍国内精品少妇国语| 欧美成年人视频网站| 欧美成人免费小视频| 国产精品日韩在线| 7777免费精品视频| 成人激情视频小说免费下载| 久久五月情影视| 国产成人综合精品| 欧美专区在线播放| 亚洲国产精品嫩草影院久久| 日韩激情av在线免费观看| 久久精品99无色码中文字幕| 亚洲综合日韩中文字幕v在线| 视频在线观看99| 亚洲欧洲激情在线| 久久久久中文字幕| 日韩av中文在线| 欧美在线一级视频| 欧美日韩在线影院| 国产午夜精品视频免费不卡69堂| 亚洲无亚洲人成网站77777| 欧美激情视频一区二区| 久久韩剧网电视剧| 色诱女教师一区二区三区| 国产一区二中文字幕在线看| 久久久久五月天| 一本色道久久88综合日韩精品| 国产午夜精品理论片a级探花| 国外成人在线视频| 国产亚洲欧美日韩一区二区| 国产精品69久久| 国产拍精品一二三| 国产精品视频一区二区高潮| 欧美网站在线观看| 992tv成人免费影院| 日韩av一卡二卡| 色一情一乱一区二区| 91精品国产91久久久久福利| 亚洲精品天天看| 久久香蕉国产线看观看av| 久热国产精品视频| 国产热re99久久6国产精品|