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

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

昨天我們一起爬取珍愛網首頁,拿到了城市列表頁面,接下來在返回體城市列表中提取城市和url,即下圖中的a標籤裡的href的值和innerText值。

提取a標籤,可以通過CSS選擇器來選擇,如下:

$('#cityList>dd>a');就可以獲取到470個a標籤:

這裡只提供一個思路,go語言標準庫裡沒有CSS解析庫,通過第三方庫可以實現。具體可以參考文章:

https://my.oschina.net/2xixi/blog/488811

http://liyangliang.me/posts/2016/03/zhihu-go-insight-parsing-html-with-goquery/

這兩篇文章都是用goquery解析 HTML,用到了庫:

https://github.com/PuerkitoBio/goquery

也可以用xpath去解析html,可以參考:

https://github.com/antchfx/xquery

xpath和goquery相比還是比較麻煩的,通過以下這張圖可以看出來goquery要活躍的多:

我們這裡不用xpath,也不用goquery提取,用更加通用的正則表示式來提取。

從上圖可以看出,返回體中的a標籤裡都是這種形式,XXX表示城市拼音,XX表示城市中文,其他的都一樣。

<a href="http://www.zhenai.com/zhenghun/XXX"
                      class="">XX</a>

所以可以寫出以下的正則表示式來匹配:

compile := regexp.MustCompile(`<a href="http://www.zhenai.com/zhenghun/[0-9a-z]+"[^>]*>[^<]+</a>`)

正則表示式說明:

1、href的值都類似http://www.zhenai.com/zhenghun/XX
2、XX可以是數字和小寫字母,所以[0-9a-z],+表示至少有一個
3、[^>]*表示匹配不是>的其他字元任意次
4、[^<]+表示匹配不是<的其他字元至少一次

然後利用分組獲取url和城市,程式碼如下:

func printAllCityInfo(body []byte){

 //href的值都類似http://www.zhenai.com/zhenghun/XX
 //XX可以是數字和小寫字母,所以[0-9a-z],+表示至少有一個
 //[^>]*表示匹配不是>的其他字元任意次
 //[^<]+表示匹配不是<的其他字元至少一次
 compile := regexp.MustCompile(`<a href="(http://www.zhenai.com/zhenghun/[0-9a-z]+)"[^>]*>([^<]+)</a>`)

 submatch := compile.FindAllSubmatch(body, -1)

 for _, matches := range submatch {
   //列印
   fmt.Printf("City:%s URL:%s\n", matches[2], matches[1])
 }

 //可以看到匹配個數為470個
 fmt.Printf("Matches count: %d\n", len(submatch))
}

那麼提取URL和City的完整程式碼如下:

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"
 "regexp"
)

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)
 }

 printAllCityInfo(body)
 //列印返回值
 //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
}

func printAllCityInfo(body []byte){

 //href的值都類似http://www.zhenai.com/zhenghun/XX
 //XX可以是數字和小寫字母,所以[0-9a-z],+表示至少有一個
 //[^>]*表示匹配不是>的其他字元任意次
 //[^<]+表示匹配不是<的其他字元至少一次
 compile := regexp.MustCompile(`<a href="(http://www.zhenai.com/zhenghun/[0-9a-z]+)"[^>]*>([^<]+)</a>`)

 /*matches := compile.FindAll(body, -1)

 //matches是二維陣列[][]byte
 for _, m := range matches {
   fmt.Printf("%s\n", m)
 }
 */

 submatch := compile.FindAllSubmatch(body, -1)

 //submatch是三維陣列[][][]byte
/*  for _, matches := range submatch {

   //[][]byte
   for _, m := range matches {
     fmt.Printf("%s ", m)
   }

   fmt.Println()
 }*/

 for _, matches := range submatch {

   //列印
   fmt.Printf("City:%s URL:%s\n", matches[2], matches[1])

 }

 //可以看到匹配個數為470個
 fmt.Printf("Matches count: %d\n", len(submatch))

 //列印abc
 //fmt.Printf("%s\n", []byte{97,98,99})
}

執行後,可以看到輸出了URL和City:

今天我們完成了URL和城市的提取,明天我們將利用URL,來進一步分析城市的男女性個人資訊。



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


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

相關推薦

go語言珍愛 | 第二

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

go語言珍愛 | 第一

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

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