『No20: Golang 爬蟲上手指南』

1.jpg

2.jpg

你們好,我叫謝偉,是一名程序員。css

我寫過不少爬蟲,這是我最後一次在文章中內說起爬蟲。之後都再也不寫了,想要研究其餘領域。html

本節的主題:Golang 爬蟲如何上手。git

主要分下面幾個步驟:程序員

  • 獲取網頁源代碼
  • 解析數據
  • 存儲數據

1. 獲取網頁源代碼

使用原生的 net/http 庫進行請求便可:github

GET正則表達式

func GetHttpResponse(url string, ok bool) ([]byte, error) {
	request, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, errors.ErrorRequest
	}

	request.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36")

	client := http.DefaultClient

	response, err := client.Do(request)

	if err != nil {
		return nil, errors.ErrorResponse
	}

	defer response.Body.Close()
	fmt.Println(response.StatusCode)
	if response.StatusCode >= 300 && response.StatusCode <= 500 {
		return nil, errors.ErrorStatusCode
	}
	if ok {

		utf8Content := transform.NewReader(response.Body, simplifiedchinese.GBK.NewDecoder())
		return ioutil.ReadAll(utf8Content)
	} else {
		return ioutil.ReadAll(response.Body)
	}

}
複製代碼

POSTmongodb

func PostHttpResponse(url string, body string, ok bool) ([]byte, error) {
	payload := strings.NewReader(body)
	requests, err := http.NewRequest("POST", url, payload)
	if err != nil {
		return nil, errors.ErrorRequest
	}
	requests.Header.Add("Content-Type", "application/x-www-form-urlencoded")
	requests.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36")
	client := http.DefaultClient
	response, err := client.Do(requests)
	if err != nil {
		return nil, errors.ErrorResponse
	}

	fmt.Println(response.StatusCode)

	defer response.Body.Close()
	if ok {
		utf8Content := transform.NewReader(response.Body, simplifiedchinese.GBK.NewDecoder())
		return ioutil.ReadAll(utf8Content)
	}
	return ioutil.ReadAll(response.Body)

}
複製代碼

使用上面兩個函數,無論是遇到的請求是Get 或者是 Post 均可以獲取到網頁源代碼,惟一須要注意的多是Post 請求須要正確的傳遞參數給請求。chrome


使用原生的庫須要寫不少的代碼,那有沒有更簡潔一些的寫法?數據庫

已經有人把原生的 net/http 庫,進一步的進行了封裝,造成了這樣一個庫:gorequest.json

gorequest 文檔

對外暴露的接口很是的簡單:

resp, body, errs := gorequest.New().Get("http://example.com/").End()
複製代碼

一行代碼便可完成一次請求。

Post 的請求也能夠比較簡便的完成:

request := gorequest.New()
resp, body, errs := request.Post("http://example.com").
  Set("Notes","gorequst is coming!").
  Send(`{"name":"backy", "species":"dog"}`).
  End()
複製代碼

上述兩種方式,按照本身喜愛選擇,能夠獲取到網頁源代碼。此爲第一步。


2. 解析數據

對獲取到的網頁源代碼,咱們須要進行進一步的解析,獲得咱們須要的數據。

依據響應的不一樣類型,咱們能夠選擇不一樣的方法。

通常若是響應是 html 格式的數據,那麼咱們能夠很友好的選擇正則表達式或者Css 選擇器獲取到咱們須要的內容。

但若是是json 數據呢,那麼咱們可使用原生的 encoding/json 庫來進行對得倒的數據反序列化,也能將數據獲取到。

好,知道了具體的方法,那麼咱們的目標就是:

  • 熟悉正則表達式用法,知道相應的狀況下如何編寫正則表達式
  • 熟悉 json 的序列化和反序列化
  • 熟悉 css 選擇器各符號表明的意思,能在chrome 調試窗口寫出css 選擇器

1. 基本思路

  • 清晰須要的內容
  • 分析網頁
  • 獲取網頁信息
  • 解析網頁信息

2. 分析網頁

  • Chrome 瀏覽器審查元素,查看網頁源代碼

3. 網頁響應值的類型

  • json: 通常是調用的API,比較好分析,解析json 數據便可
  • xml: 不常見
  • html: 常見,使用正則表達式、CSS 選擇器、XPATH 獲取須要的內容

4. 請求的類型

  • Get : 常見,直接請求便可
  • Post : 須要分析請求的參數,構造請求,向對方服務器端發送請求,再解析響應值

5. 請求頭部信息

  • Uer-Agent 頭部信息

6. 存儲

  • 本地: text、json、csv
  • 數據庫: 關係型(postgres、MySQL), 非關係型(mongodb), 搜索引擎(elasticsearch)

7. 圖片處理

  • 請求
  • 存儲

8. 其餘

  • 代理: ip 池
  • User-Agent: 模擬瀏覽器
  • APP: APP 數據須要使用抓包工具:Mac(Charles)、Windows(Fiddler)(分析出Api)

9. 難點

  • 分佈式
  • 大規模抓取

實例

幾大要點

如何獲取網頁源代碼

  • 原生 net/http
  • gorequest (基於原生的net/http 封裝)

Web客戶端請求方法

  • Get 絕大多少數
  • Post

Web服務端響應

  • json
  • html

Web服務端響應的處理方式

  • json: 使用原生的json 序列化,或者使用 gjson (第三方)
  • html: 正則表達式、 Css 選擇器、Xpath

存儲數據方式

  • Text
  • Json
  • Csv
  • db

前三種,涉及文件讀寫;最後者涉及數據庫操做

源代碼

僅供參考: 參考


全文完,我是謝偉,再會。

相關文章
相關標籤/搜索