1. 程式人生 > >用go語言爬取珍愛網 | 第一回

用go語言爬取珍愛網 | 第一回

我們來用go語言爬取“珍愛網”使用者資訊。

首先分析到請求url為:

http://www.zhenai.com/zhenghun

接下來用go請求該url,程式碼如下:

package main

import (
 "fmt"
 "io/ioutil"
 "net/http"
)

func main() {

 //返送請求獲取返回結果
 resp, err := http.Get("http://www.zhenai.com/zhenghun")

 if err != nil {
   panic(fmt.Errorf("Error: http Get, err is %v\n", err))
 }

 //關閉response body
 defer resp.Body.Close()

 if resp.StatusCode != http.StatusOK {
   fmt.Println("Error: statuscode is ", resp.StatusCode)
   return
 }

 body, err := ioutil.ReadAll(resp.Body)

 if err != nil {
   fmt.Println("Error read body, error is ", err)
 }

 //列印返回值
 fmt.Println("body is ", string(body))
}

執行後會發現返回體裡有很多亂碼:

在返回體裡可以找到 即編碼為gbk,而go預設編碼為utf-8,所以就會出現亂碼。接下來用第三方庫將其編碼格式轉為utf-8。

由於訪問golang.org/x/text需要梯子,不然報錯:

所以在github上下載:

mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/text.git

然後將gbk編碼轉換為utf-8,需要修改程式碼如下:

utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
body, err := ioutil.ReadAll(utf8Reader)

考慮到通用性,返回的編碼格式不一定是gbk,所以需要對實際編碼做判斷,然後將判斷結果轉為utf-8,需要用到第三方庫golang.org/x/net/html,同樣的在github上下載:

mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/net

那麼程式碼就變成這樣:

package main

import (
 "fmt"
 "io/ioutil"
 "net/http"
 "golang.org/x/text/transform"
 //"golang.org/x/text/encoding/simplifiedchinese"
 "io"
 "golang.org/x/text/encoding"
 "bufio"
 "golang.org/x/net/html/charset"
)

func main() {

 //返送請求獲取返回結果
 resp, err := http.Get("http://www.zhenai.com/zhenghun")

 if err != nil {
   panic(fmt.Errorf("Error: http Get, err is %v\n", err))
 }

 //關閉response body
 defer resp.Body.Close()

 if resp.StatusCode != http.StatusOK {
   fmt.Println("Error: statuscode is ", resp.StatusCode)
   return
 }

 //utf8Reader := transform.NewReader(resp.Body, simplifiedchinese.GBK.NewDecoder())
 utf8Reader := transform.NewReader(resp.Body, determinEncoding(resp.Body).NewDecoder())
 body, err := ioutil.ReadAll(utf8Reader)

 if err != nil {
   fmt.Println("Error read body, error is ", err)
 }

 //列印返回值
 fmt.Println("body is ", string(body))
}

func determinEncoding(r io.Reader) encoding.Encoding {

 //這裡的r讀取完得保證resp.Body還可讀
 body, err := bufio.NewReader(r).Peek(1024)

 if err != nil {
   fmt.Println("Error: peek 1024 byte of body err is ", err)
 }

 //這裡簡化,不取是否確認
 e, _, _ := charset.DetermineEncoding(body, "")
 return e
}

執行後就看不到亂碼了:

今天先爬到這裡,明天將提取返回體中的地址URL和城市,下一節見。



本公眾號免費提供csdn下載服務,海量IT學習資源,如果你準備入IT坑,勵志成為優秀的程式猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大資料、面試資料、前端 等資源。同時我們組建了一個技術交流群,裡面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號後臺回覆【2】,免費邀請加技術交流群互相學習提高,會不定期分享程式設計IT相關資源。


掃碼關注,精彩內容第一時間推給你

相關推薦

go語言珍愛 | 第一

我們來用go語言爬取“珍愛網”使用者資訊。 首先分析到請求url為: http://www.zhenai.com/zhenghun 接下來用go請求該url,程式碼如下: package main import ( "fmt" "io/ioutil" &

go語言珍愛 | 第二

昨天我們一起爬取珍愛網首頁,拿到了城市列表頁面,接下來在返回體城市列表中提取城市和url,即下圖中的a標籤裡的href的值和innerText值。 提取a標籤,可以通過CSS選擇器來選擇,如下: $('#cityList>dd>a');就可以獲取到470個a標籤: 這裡只提供一個思

go語言珍愛 | 第三

前兩節我們獲取到了城市的URL和城市名,今天我們來解析使用者資訊。 用go語言爬取珍愛網 | 第一回 用go語言爬取珍愛網 | 第二回 爬蟲的演算法: 我們要提取返回體中的城市列表,需要用到城市列表解析器; 需要把每個城市裡的所有使用者解析出來,需要用到城市解析器; 還需要把每個使用者的個人資訊解析出來,

珍愛戶資訊展示

golang爬取珍愛網,爬到了3萬多使用者資訊,並存到了elasticsearch中,如下圖,查詢到了3萬多使用者資訊。 先來看看最終效果: 利用到了go語言的html模板庫: 執行模板渲染: func (s SearchResultView) Render (w io.Writer, data mo

go語言椎名真白

regexp highlight defer reg write rul png span link 單任務版: package main import ( "net/http" "regexp" "io/ioutil" "os" "strconv" "ti

go 語言百度貼吧中的內容

涉及到的知識點有 通道chan ,切片的使用 ,os,http 包的使用 package main import ( "fmt" "net/http" "os" "strconv" ) func pachong(start, end int) { //明確爬的地址 url :=

go語言爬蟲】go語言豆瓣電影top250

抓取欄位:電影名稱、評分、評價人數 二、執行: 正在抓取第0頁…… 肖申克的救贖 9.6 824764人 這個殺手不太冷 9.4 791399人 霸王別姬 9.5 589028人 阿甘正傳 9.4 678850人 美麗人生 9.5 3940

crawl spider起點小說信息

models anti arc pub work 全部 see 效率 rand 起點作為主流的小說網站,在防止數據采集反面還是做了準備的,其對主要的數字采用了自定義的編碼映射取值,想直接通過頁面來實現數據的獲取,是無法實現的。 單獨獲取數字還是可以實現的,通過reques

Python爬蟲廣州大學教務系統的成績(內訪問)

enc 用途 css選擇器 狀態 csv文件 表格 area 加密 重要 用Python爬蟲爬取廣州大學教務系統的成績(內網訪問) 在進行爬取前,首先要了解: 1、什麽是CSS選擇器? 每一條css樣式定義由兩部分組成,形式如下: [code] 選擇器{樣式} [/code

python之爬蟲的入門05------實戰:貝殼re匹配需要的資料)

# 第二頁:https://hz.zu.ke.com/zufang/pg2 # 第一頁:https://hz.zu.ke.com/zufang/pg1 import urllib.request import random import re def user_ip(): ''

R語言前程無憂招聘職位

資料的獲取是資料探勘的第一步,如果沒有資料何談資料探勘?有時候在做演算法測試的時候,一個好的資料集也是演算法實驗成功的前提保障。當然我們可以去網上下載大型資料網站整理好的,專業的資料,但是自己動手爬取資料是不是更愜意呢? 說到這裡,給大家推薦一些常用的大型資料集: (1)、Mov

python來中國天氣北京,上海,成都8-15天的天氣

2 爬取北京,上海,成都的天氣            from bs4 import BeautifulSoup import random import requests import socket impo

go語言linux系統絡卡MAC和硬碟序列號

利用cgo,實現在go語言中呼叫c語言函式,取MAC和硬碟序列號。cgo中需要注意的:*/和import "C"兩行之間不能有其它內容! package main /* #include <stdio.h> #include <stdlib.h>

python爬蟲網頁桌布圖片(彼岸桌面唯美圖片)

今天想給我的電腦裡面多加點桌布,但是嫌棄一個個儲存太慢,於是想著寫個爬蟲直接批量爬取,因為爬蟲只是很久之前學過一些,很多基礎語句都不記得了,於是直接在網上找了個有基礎操作語句的爬蟲程式碼,在這上面進行修改以適應我的要求和爬取的網頁需求 注意:這次爬取的

R語言中國天氣單個城市實時天氣預報資料

在傳統零售行業,雨天天氣大概會影響晴天30%-40%的銷售業績,所以從網上獲取天氣資料來作分析,並根據天氣資料作出預測,提前做好預防措施和提醒業務人員,把損失減少到最低就顯得十分重要,用R語言的rvest包就可以方便抓取天氣資料: 本文章的例子僅用於學習之用,

接口今日頭條圖片

b+ req ace nco ext odin api data utf #encoding:utf8import requestsimport jsonimport redemo = requests.get(‘http://www.toutiao.com/api/pc/

scrapy實戰1分布式有緣

req 年齡 dict ems arch last rem pen war 直接上代碼: items.py 1 # -*- coding: utf-8 -*- 2 3 # Define here the models for your scraped items

多線程版故事

實現 exe don comm value obj nco result nic 前言:為了能以更高效的速度爬取,嘗試采用了多線程本博客參照代碼及PROJECT來源:http://kexue.fm/archives/4385/ 源代碼: 1 #! -*- cod

結對-大麥演唱會信息-設計文檔

.com ref lock beautiful 模塊 有用 pytho spa pil 結對編程成員:閻大為,張躍馨 搭建環境: ?1.安裝python2.7 ?2.安裝beautifulsoup4等相關模塊 編寫程序階段: ?1.分析html代碼以及了解相

結對-大麥近期演唱會信息-開發過程

quest 程序 ima ref 時間 -1 git 簡單測試 cnblogs Github:https://github.com/atinst/Python/tree/master/Damai 開發過程:1.根據需求分析,安裝並導入BeautifulSoup和reques