Golang 爬虫快速入门 | 获取B站全站的视频数据

原文首发并持续更新于 https://imagician.net/archives/92/,欲了解更多信息可以前往我的博客https://imagician.net/

提到爬虫,总会联想到Python。似乎Python是爬虫的唯一选择。爬虫只是完成一个访问页面然后收集数据的任务,用任何语言来写都能实现。相比较Python快速实现但是庞大的体型,Golang来写爬虫似乎是更好的又一选择。

HTTP请求

Golang语言的HTTP请求库不需要使用第三方的库,标准库就内置了足够好的支持:

package main

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

func fetch (url string) string {
   
	fmt.Println("Fetch Url", url)
    
    // 创建请求
	req, _ := http.NewRequest("GET", url, nil)
    // 创建HTTP客户端
	client := &http.Client{
   }
    // 发出请求
	resp, err := client.Do(req)
	if err != nil {
   
		fmt.Println("Http get err:", err)
        return ""
	}
	if resp.StatusCode != 200 {
   
		fmt.Println("Http status code:", resp.StatusCode)
		return ""
	}
    // 读取HTTP响应正文
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
   
		fmt.Println("Read error", err)
		return ""
	}
	return string(body)
}

func main(){
   
    fmt.Println(fetch("https://github.com"))
}

使用官方的HTTP包可以快速的请求页面并得到返回数据。

就像Python有Scrapy库,爬虫框架可以很大程度上简化HTTP请求、数据抽取、收集的流程,同时还能提供更多的工具来帮助我们实现更复杂的功能。

Golang爬虫框架——Goribot

https://github.com/zhshch2002/goribot是一个用Golang写成的爬虫轻量框架,有不错的扩展性和分布式支持能力,文档在https://imagician.net/goribot/

获取Goribot:

go get -u github.com/zhshch2002/goribot

使用Goribot实现上文的代码的功能要看起来简洁不少。

package main

import (
	"fmt"
	"github.com/zhshch2002/goribot"
)

func main() {
   
	s := goribot.NewSpider()
	s.AddTask(
		goribot.GetReq("https://github.com"),
		func(ctx *goribot.Context) {
   
			fmt.Println(ctx.Resp.Text)
		},
	)
	s.Run()
}

如此之实现了一个单一的功能,即访问“https://github.com”并打印出结果。如此的应用还不足以使用框架。那我们来入手一个更复杂点的爬虫应用。

用Goribot爬取B站信息

我们来建立一个复杂点的爬虫应用,预期实现两个功能:

  1. 沿着链接自动发现新的视频链接
  2. 提取标题、封面图、作者和视频数据(播放量、投币、收藏等)

研究B站页面

首先我们来研究一下B站的视频页面,以https://www.bilibili.com/video/BV1JE411P7hK?spm_id_from=333.851.b_62696c695f7265706f72745f6469676974616c.21为例,按F12打开调试界面,切换到Network(网络)选项卡。

image

我们能看到这一页面所涉及的所有请求、资源。在调试界面里选在XHR选项,来查看Ajax请求。

你可以通过点选不同的请求,在右侧弹出的面板里查看具体内容。在新面板里点击Preview(预览)可以查看服务器响应的内容。

那么,交给你一个任务,依次查看XHR下的所有请求,找到最像是服务器返回的点赞、收藏、播放量数据的哪一个。


很好,那来看看你找到是这个吗?

image

你已经成功达成了一个爬虫工程师的成就——从Ajax请求里寻找目标数据。

那我们切换到Header(标头)选项,来看看这个请求对应的参数,最好能找到这个响应和视频Id的关系。

image

发现了视频Id——BV号。

我们以及解决了核心问题,获取B站的视频数据,对于自动搜寻视频,我们可以设定一个起始链接,然后搜寻<a>标签来延伸爬取。

搭建爬虫

完整代码在后文。

创建爬虫
s := goribot.NewSpider( // 创建一个爬虫并注册扩展
    goribot.Limiter(true, &goribot.LimitRule{
    // 添加一个限制器,限制白名单域名和请求速录限制
        Glob: "*.bilibili.com"
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值