colly一款快速優(yōu)雅的golang爬蟲(chóng)框架,簡(jiǎn)單易用,功能完備。
創(chuàng)新互聯(lián)是專(zhuān)業(yè)的永興網(wǎng)站建設(shè)公司,永興接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行永興網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
官網(wǎng)地址:
包地址: import "github.com/gocolly/colly"
一個(gè)簡(jiǎn)單的例子:
使用方式概括下來(lái)主要有三步:
創(chuàng)建采集器時(shí)可以指定一些配置參數(shù),如useragent,爬取深度及日志等
回調(diào)函數(shù)共有7中
通過(guò)瀏覽器開(kāi)發(fā)者工具查看jianshu.com結(jié)構(gòu)如下
文章列表為ul標(biāo)簽,中間每一項(xiàng)是li標(biāo)簽,li中包含content,content中包含title,abstract和meta標(biāo)簽
用Golang做爬蟲(chóng),當(dāng)面對(duì)頁(yè)面存在復(fù)雜的JS的情況,使用普通的http.get或者h(yuǎn)ttp.post,如不做特殊處理,將無(wú)法解析頁(yè)面源代碼。
在使用python的過(guò)程中,可以使用selenium進(jìn)行爬取數(shù)據(jù),或使用selenium自動(dòng)化測(cè)試,那么用Golang怎么處理這個(gè)問(wèn)題呢?
其實(shí)Golang中也有selenium,Selenium 作為一個(gè)用于 Web 應(yīng)用程序測(cè)試的工具,可以模擬真實(shí)瀏覽器進(jìn)行操作,也可以實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊、滾輪、輸入等用戶(hù)日常操作。
我們通過(guò)2節(jié)課的學(xué)習(xí),實(shí)現(xiàn)1、本地啟動(dòng)selenium服務(wù);2、遠(yuǎn)程啟動(dòng)selenium服務(wù)。
Golang如何解析Html代碼
用Golang的朋友都知道如果我們要從HTML中提取一些內(nèi)容、比如title或者是h2在或者是一些其他的HTML的內(nèi)容、在Golang里面我們?nèi)绻约簩?xiě)代碼來(lái)提取還是相當(dāng)?shù)穆闊┑模?/p>
由于我之前在寫(xiě)Pyhon的爬蟲(chóng)的時(shí)候也需要解析HTML標(biāo)簽;所以用過(guò)PyQuery和BS4.這次在用Golang寫(xiě)爬蟲(chóng)的時(shí)候就留意了一下是否有Golang版本的Query。github是個(gè)好地方;上面很找到很多開(kāi)源的代碼可以用;包括GoQuery。
所以這次會(huì)介紹一下如何用GoQuery來(lái)解析HTML元素。
導(dǎo)入Goquery模塊
package mainimport ( "fmt" "github.com/opesun/goquery")其實(shí)還有一個(gè)github.com/PuerkitoBio/goquery的goquery模塊、但是配置環(huán)境經(jīng)常出差就沒(méi)有選擇
Goquery的各種用法
goquery有Jquery的大部分特性;如果你熟悉Jquery的話(huà)用Goquery就很簡(jiǎn)單了
解析HTML的title
var url = ""p, err := goquery.ParseUrl(url)if err != nil { panic(err)} else { pTitle := p.Find("title").Text()//直接提取title的內(nèi)容 fmt.Println(pTitle)}
命令行下運(yùn)行g(shù)o run page.go之后得到輸出
“Smart Testing | 專(zhuān)注于軟件測(cè)試領(lǐng)域的技術(shù)討論和研究、關(guān)注IT互聯(lián)網(wǎng)、WordPress技巧的個(gè)人博客”
解析HTML內(nèi)容
如果要得到HTML的內(nèi)容就更簡(jiǎn)單了fmt.Println(p.Html())//.Html()得到html內(nèi)容
獲取h2/h1之類(lèi)的標(biāo)簽內(nèi)容
class := p.Find("h2").Text()fmt.Println(class, "/n")
我們可以使用Find()來(lái)查找需呀哦的標(biāo)簽;并且用.Text()來(lái)顯示標(biāo)簽的內(nèi)容
解析提取class的內(nèi)容
如果要解析class的內(nèi)容;需要在Find(".")加一個(gè).
下面我們要提取class”entry-title”里面、后面的”href”的URL地址
由于超過(guò)1條內(nèi)容所以不能用Text()來(lái)打印結(jié)果;需要用for來(lái)循環(huán)一下;
t := p.Find(".entry-title a")for i := 0; i t.Length(); i++ {d := t.Eq(i).Attr("href")fmt.Println(d)}
輸出結(jié)果如下
其實(shí)就是首頁(yè)里面的4篇文章的地址
如果想得到html里面所有的herf
fmt.Println(p.Find("").Attrs("href"))
用上面一行代碼就可以得到HTML里面全部的href內(nèi)容了
判斷元素是否存在
如果想要判斷一個(gè)元素是否在HTML里面;可以使用下面的代碼fmt.Println(p.Find("div").HasClass("entry-content"))
判斷div下面有沒(méi)有“entry-content”的class元素;有返還true;沒(méi)有返回false
上周從零學(xué)習(xí)了golang,語(yǔ)法簡(jiǎn)單關(guān)鍵字少,寫(xiě)個(gè)爬蟲(chóng)熟悉一下語(yǔ)法結(jié)構(gòu)。
首先選用了原生的net/http包,基本上涵蓋了所有的get/post請(qǐng)求,各種參數(shù)都可以設(shè)置,網(wǎng)上google到html頁(yè)面解析goquery神器,很輕松就可以解決頁(yè)面解析問(wèn)題。
首先就寫(xiě)了個(gè)爬取匯率的爬蟲(chóng)。然后重寫(xiě)之前php的一個(gè)請(qǐng)求類(lèi),請(qǐng)求類(lèi)的邏輯有點(diǎn)混亂不清晰,往往把兩個(gè)不同的功能合并到一起寫(xiě),粒度大,后來(lái)發(fā)現(xiàn)了一個(gè)好用的框架——colly,之后再試試好不好用
Windows 10 Golang
依賴(lài)包:goquery
較常用的方法有Find和Each
爬取中國(guó)銀行的匯率牌價(jià)表,golang依賴(lài)net/http包和goquery包
唯一的難點(diǎn)是對(duì)于goquery方法的使用,需要閱讀官方文檔:
使用原生的net/http包基本上可以解決大多數(shù)的網(wǎng)頁(yè)請(qǐng)求,使用goquery可以解決頁(yè)面解析問(wèn)題
可以利用golang的協(xié)程特性進(jìn)行異步多協(xié)程爬取
增加安全性可以通過(guò)幾個(gè)方面進(jìn)行改進(jìn):
1.首先可以限制爬蟲(chóng)的爬取速度
2.每次對(duì)網(wǎng)頁(yè)的請(qǐng)求都隨機(jī)選用一個(gè)客戶(hù)端
3.選用IP代理池,防止IP誤封(及限制ip訪問(wèn)次數(shù))
構(gòu)造請(qǐng)求代理ip網(wǎng)站的鏈接→獲取網(wǎng)頁(yè)內(nèi)容→ 提取網(wǎng)頁(yè)中IP地址和端口號(hào)→驗(yàn)證IP的有效性并存儲(chǔ)
輕量級(jí)反爬蟲(chóng)方案
淺談JSP
golang帶json的Http請(qǐng)求
Get/Post
HTTP請(qǐng)求中的Form Data和Request Payload的區(qū)別
HTTP Json請(qǐng)求
net/http:
golang HTTP操作
python建立爬蟲(chóng)代理ip池
爬蟲(chóng)黑科技之讓你的爬蟲(chóng)程序更像人類(lèi)用戶(hù)的行為
特點(diǎn):事件監(jiān)聽(tīng),通過(guò)callback執(zhí)行事件處理
基于colly開(kāi)發(fā)的web管理界面