前言
go colly 是一个开源的项目能用于做爬虫的。开一个文档来记录这个相关的知识。
后续需要发现 colly 是无法支持爬取动态页面的,可能需要补充一下 chromedp 相关知识。
爬虫一般都做下面三个步骤的事情:
- 筛选网站;
- 抓取页面中的特定的内容,写入到pipeline中;
- pipeline提供各种实现,最终将数据写入到文件、数据库、redis之类;
- PhantomJS 之前有人用这个虚拟的浏览器来跑爬虫;
- selenium+chrome 这种方案是 java 来做的;
sdk文档
简介
安装
1 | go get -u github.com/gocolly/colly/... |
入门
先需要创建一个 [collector|chromedp] ,里面保存了连接信息,以及回调函数之类。
通过回调函数来通知处理。
配置
可以创建的 collector 的时候制定,也能直接修改 struct 里面的成员变量。
也能通过修改环境变量来修改配置。环境变量能覆盖掉之前全部设置的配置,这样可以在没有编译的情况下,修改配置。
- ALLOWED_DOMAINS (comma separated list of domains)
- CACHE_DIR (string)
- DETECT_CHARSET (y/n)
- DISABLE_COOKIES (y/n)
- DISALLOWED_DOMAINS (comma separated list of domains)
- IGNORE_ROBOTSTXT (y/n)
- MAX_BODY_SIZE (int)
- MAX_DEPTH (int - 0 means infinite)
- PARSE_HTTP_ERROR_RESPONSE (y/n)
- USER_AGENT (string)
默认已经按照通用的golang-http服务器来实现的。也能通过下面这段代码修改成和 HTTP-Roundtripper
1 | c := colly.NewCollector() |
最佳实践
调试
可以用这个来调试中间的问题。
1 | c := colly.NewCollector(colly.Debugger(&debug.LogDebugger{})) |
分布式抓取
分布式代理
可以通过设置多个代理地址,分布式抓取内容,默认是使用轮训机制来抓取,我们自己也能编写一个随机机制选择代理来抓取数据。这个主要是为了提高并发效率。
1 | if p, err := proxy.RoundRobinProxySwitcher( |
分布式爬虫
要管理独立和分布式抓取工具,可以将抓取包装到一个服务里面。示例里面有个 scraper_server。可以直接阅读相关的资料。
分布式存储
实现了在内存中存储的数据。
存储后端
colly 有个内存后段来实现存储cookie和访问过的URL,它可以被任意实现这个接口的对象来覆盖,存储。
实现方式
默认为内存方式;
Redis 方式;
SQLite 方式;
MongoDB 方式;
使用选择器
如果任务足够复杂或具有不同类型的子任务,建议对一个抓取作业使用多个收集器。一个很好的例子是 coursera 课程抓取器,其中使用两个收集器 - 一个解析列表视图并处理分页,另一个收集课程详细信息。
这个相关的知识应该属于 css 相关。
基础知识
解析数据:使用正则表达式、XPath或CSS选择器等工具,解析网页中的数据。
基础知识
在解析 HTML 时,Go 语言提供了两个常用的库:htmlquery 和 goquery。虽然它们都可以用于解析 HTML,但它们之间有一些区别。
htmlquery:
- htmlquery 是一个基于 Go 语言的库,用于解析 HTML 并提取和操作数据。它使用 XPath 来选择和操作 HTML 中的元素。
- htmlquery 提供了方便的函数和方法,可以快速地选择和提取 HTML 中的元素。
- htmlquery 适用于简单的 HTML 解析任务,但可能无法处理一些复杂的 HTML 结构。
goquery:
- goquery 是另一个基于 Go 语言的库,用于解析和操作 HTML。它提供了一种类似于 jQuery 的语法来操作 HTML。
- goquery 使用 CSS 选择器来选择和操作 HTML 中的元素。它的语法与 jQuery 相似,因此对于熟悉 jQuery 的开发者来说更容易上手。
- goquery 具有更灵活的 HTML 解析能力,可以更好地处理复杂的 HTML 结构。
总结:
htmlquery 和 goquery 都是用于解析 HTML 的库,但它们使用不同的方法和语法。htmlquery 使用 XPath,而 goquery 使用 CSS 选择器。对于简单的 HTML 解析任务,htmlquery 可能是一个更方便的选择。而对于更复杂的 HTML 结构和操作需求,goquery 可能更适合。根据具体的需求和项目要求,可以选择合适的库进行 HTML 解析。
* goquery-css选择器
htmlquery-XPath
可以使用这个库来做一些事情:
1 | "github.com/antchfx/htmlquery" |
使用 chromedp
安装
安装 Headless Chrome 的过程会因操作系统不同而有所不同。以下是在常见操作系统中安装 Headless Chrome 的基本步骤:
在 Ubuntu 或 Debian 上安装 Headless Chrome
添加 Chrome 的软件源:
1 | apt-utils is not installed |
更新软件源并安装 Chrome:
1 | sudo apt update |
在 CentOS 或 RHEL 上安装 Headless Chrome
添加 Chrome 的 YUM 源:
1 | sudo tee /etc/yum.repos.d/google-chrome.repo << RPMEOF |
安装 Chrome:
1 | sudo yum install google-chrome-stable |
在 macOS 上安装 Headless Chrome
下载并安装 Chrome:
1 | brew install --cask google-chrome |
在 Windows 上安装 Headless Chrome
下载 Chrome 安装程序并安装:
下载链接:https://www.google.com/chrome/
安装完毕后,可以通过命令行启动 Headless Chrome。在 Linux 或 macOS 上,可以使用 google-chrome —headless 命令;在 Windows 上,可以使用 chrome.exe —headless 命令。
要在 Golang 中使用 Headless Chrome,你需要安装 chromedp 库,然后按照之前的示例代码来使用。安装 chromedp 可以使用以下命令:
1 | go get -u github.com/chromedp/chromedp |
请注意,在一些情况下,可能需要根据特定操作系统的配置进行微调。如果出现任何问题,建议查阅相关文档或社区资源以获取更多帮助。
1 | func main() { |
b站里面有个大佬写了一份代码,能模拟鼠标滑动的情况。
1 | package main |
作者:菜牛冲鸭 出处:bilibili
dockerfile-for-go-and-chromedp
开启无头模式
1 | chromedp.Flag("headless", true), |
部署
1 | chrome failed to start: |
1 | # 使用一个基础镜像 |
golang 由于时区问题造成崩溃
1 | panic: time: missing Location in call to Date |
解决方法:
1 |
|
全量的配置
docker-compose
1 | version: '3' |
dockerfile
1 | # 备注 |
编译dockerfile
docker-compose build
将docker部署出去;
docker-compose up -d
golang如何解析下面这样的json串:
- 有个json如下
{
“code”: 1,
“data”: {
}"chainID": "111"
} - 我在golang里面定义了一个struct先解析出来
type RspCommand struct {
Code intjson:"code"
Data interface{}json:"data"
} - 当我判断了 Code = 1 的时候,我需要将 data 解析成下面这个定义
type RspRealData struct {
ChainID stringjson:"chainID"
}
golang如何动态解析某个json字符串;
1 | package main |