『No20: Golang 爬虫上手指南』

1.jpg
2.jpg

大家好,我叫谢伟,是一名程序员。

我写过很多爬虫,这是我最后一次在文章中内提及爬虫。

本节的主题:Golang 爬虫如何上手。

主要分下面几个步骤:

  • 获取网页源代码
  • 解析数据
  • 存储数据

1. 获取网页源代码

使用原生的 net/http 库进行请求即可:

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

}

POST

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 请求需要正确的传递参数给请求。


使用原生的库需要写很多的代码,那有没有更简洁一些的写法?

已经有人把原生的 net/http 库,进一步的进行了封装,形成了这样一个库:gorequest.

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

前三种,涉及文件读写;最后者涉及数据库操作

源代码

仅供参考: 参考


全文完,我是谢伟,再会。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,960评论 3 119
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,042评论 25 707
  • 目录 一, 读《红楼梦》第二回,贾夫人仙逝扬州城,冷子兴演说荣国府。标题说黛玉之母去世,其实只是粗略几笔带过。冷子...
    上林叶阅读 290评论 0 1
  • 第一次读村上的著作是在高一开学的那年夏天,是那本读了之后连蛋蛋都忧伤的《挪威的森林》。 我并不喜欢这个故事但是铅字...
    瓜瘦瘦阅读 702评论 0 1