10分钟go crawler colly从入门到精通

Introduction

本文对colly如何使用,整个代码架构设计,以及一些使用实例的收集。

Colly是Go语言开发的Crawler Framework,并不是一个完整的产品,Colly提供了类似于Python的同类产品(BeautifulSoupScrapy)相似的表现力和灵活性。

Colly这个名称源自 Collector 的简写,而Collector 也是 Colly的核心。

Colly Official Docs,内容不是很多,最新的消息也很就远了,仅仅是活跃在Github

Concepts

Architecture

从理解上来说,Colly的设计分为两层,核心层和解析层,

  • Collector :是Colly实现,该组件负责网络通信,并负责在Collector 作业运行时执行对应事件的回调。
  • Parser:这个其实是抽象的,官网并未对此说明,goquery和一些htmlquery,通过这些就可以将访问的结果解析成类Jquery对象,使html拥有了,XPath选择器和CSS选择器

通常情况下Crawler的工作流生命周期大致为

  • 构建客户端
  • 发送请求
  • 获取响应的数据
  • 将相应的数据解析
  • 对所需数据处理
  • 持久化

而Colly则是将这些概念进行封装,通过将事件注册到每个步骤中,通过事件的方式对数据进行清理,抽象来说,Colly面向的是过程而不是对象。大概的工作架构如图

在这里插入图片描述

event

通过上述的概念,可以大概了解到 Colly 是一个基于事件的Crawler,通过开发者自行注册事件函数来触发整个流水线的工作

Colly 具有以下事件处理程序:

  • OnRequest:在请求之前调用
  • OnError :在请求期间发生错误时调用
  • OnResponseHeaders :在收到响应头后调用
  • OnResponse: 在收到响应后调用
  • OnHTML:如果接收到的内容是 HTML,则在 OnResponse 之后立即调用
  • OnXML :如果接收到的内容是 HTML 或 XML,则在 OnHTML 之后立即调用
  • OnScraped:在 OnXML 回调之后调用
  • OnHTMLDetach:取消注册一个OnHTML事件函数,取消后,如未执行过得事件将不会再被执行
  • OnXMLDetach:取消注册一个OnXML事件函数,取消后,如未执行过得事件将不会再被执行

Reference

goquery

htmlquery

Utilities

简单使用

package main

import (
	"fmt"

	"github.com/gocolly/colly"
)

func main() {
   
	// Instantiate default collector
	c := colly.NewCollector(
		// Visit only domains: hackerspaces.org, wiki.hackerspaces.org
		colly.AllowedDomains("hackerspaces.org", "wiki.hackerspaces.org"),
	)

	// On every a element which has href attribute call callback
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
   
		link := e.Attr("href")
		// Print link
		fmt.Printf("Link found: %q -> %s\n", e.Text, link)
		// Visit link found on page
		// Only those links are visited which are in AllowedDomains
		c.Visit(e.Request.AbsoluteURL(link))
	})

	// Before making a request print "Visiting ..."
	c.OnRequest(func(r *colly.Request) {
   
		fmt.Println("Visiting", r.URL.String())
	})

	// Start scraping on https://hackerspaces.org
	c.Visit("https://hackerspaces.org/")
}

错误处理

package main

import (
	"fmt"

	"github.com/gocolly/colly"
)

func main() {
   
	// Create a collector
	c := colly.
<think>嗯,用户遇到了OpenMetadata项目中Python 3.13.2和Node v20.10.0版本不兼容的问题,需要降级到支持的版本(Python 3.9-3.11,Node 18)。首先,我需要回顾一下之前用户提供的引用内容,看看有没有相关的解决方法。 根据引用[1],用户在PyCharm中通过添加解释器的方式安装旧版Python,解决了模块不兼容的问题。这可能适用于当前用户的情况,他们需要降级Python版本。引用[4]提到在Windows环境下安装Python 3.11.9的方法,这正好在支持的范围内。所以,用户可以参考这些步骤来安装合适的Python版本。 对于Node.js,用户需要从v20.10.0降级到v18。可能需要使用nvm(Node Version Manager)来管理不同的Node版本,但引用中没有直接提到Node的降级方法。这时候可能需要补充相关知识,比如下载Node 18的安装包或者使用nvm切换版本。 另外,用户可能需要同时处理Python和Node的版本问题,需要分别指导。在Python方面,PyCharm的配置是关键,而在Node方面,可能需要命令行工具或者重新安装。还要注意修改项目中的配置文件,比如requirements.txt或package.json,确保依赖兼容。 需要检查用户是否已经安装了旧版本的Python或Node,或者是否需要完全卸载当前版本再安装旧版。引用[3]提到修改Python安装路径的文件名以区分版本,这可能对多版本共存有帮助。同时,引用[2]中的where python和Python -V命令可以用来验证当前版本是否正确。 总结下来,步骤应该是:降级Python到3.9-3.11,使用PyCharm配置解释器;降级Node到18,可能需要使用nvm或者直接安装;最后验证版本并解决依赖问题。还要提醒用户注意虚拟环境和项目配置,确保环境隔离和兼容性。</think>### 解决OpenMetadata项目中Python和Node版本不兼容的方法 #### 一、Python版本降级(3.13.2 → 3.9-3.11) 1. **安装旧版本Python** - **Windows**:访问[Python官网历史版本页面](https://www.python.org/downloads/windows/),选择3.11.x版本(如3.11.9)下载安装[^4] - **Mac/Linux**:使用`pyenv`工具管理多版本: ```bash pyenv install 3.11.9 pyenv global 3.11.9 ``` 2. **配置PyCharm解释器** 在PyCharm中依次点击: `Settings → Python Interpreter → Add Interpreter → Add Local Interpreter`,选择已安装的Python 3.11解释器路径[^1] $$ \text{验证命令:} python -V \quad \text{(应显示3.11.x)} $$ #### 二、Node.js版本降级(v20.10.0 → v18) 1. **Windows/Mac**: - 直接从[Node.js官网](https://nodejs.org/en/download/releases)下载v18.x安装包覆盖安装 - 或使用`nvm`工具切换版本: ```bash nvm install 18.18.2 nvm use 18.18.2 ``` 2. **Linux**: ```bash curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash nvm install 18 ``` #### 三、项目环境验证 1. **Python依赖重置** ```bash pip install -r requirements.txt --force-reinstall ``` 2. **Node模块重置** ```bash rm -rf node_modules npm install ``` 3. **版本检查** ```bash python -V # 应显示3.9-3.11 node -v # 应显示v18.x ``` #### 四、注意事项 - 建议使用虚拟环境隔离项目(如`venv`或`conda`) - 修改`package.json`和`requirements.txt`锁定具体版本号 - 若存在残留冲突,可尝试重命名旧版本安装目录(如将`python313`改为`python313_backup`)[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hermokrates

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值