用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