有名的爬虫框架 colly 的特性及2个详细采集案例

2024-03-25 12:04

本文主要是介绍有名的爬虫框架 colly 的特性及2个详细采集案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. Colly概述

前言:colly 是 Go 实现的比较有名的一款爬虫框架,而且 Go 在高并发和分布式场景的优势也正是爬虫技术所需要的。它的主要特点是轻量、快速,设计非常优雅,并且分布式的支持也非常简单,易于扩展。

框架简介:基于colly框架及net/http进行封装,实现的一款可配置分布式爬虫架构。使用者只需要配置解析、并发数、入库topic、请求方式、请求url等参数即可,其他代码类似于scrapy,不需要单独编写。

colly官网地址:https://go-colly.org/
github地址: http://github.com/gocolly/colly

colly特性

  • 干净的API
  • 快速(单核>1k请求/秒)
  • 管理每个域的请求延迟和最大并发性
  • 自动cookie和会话处理
  • 同步/异步并行抓取
  • 分布式抓取
  • 缓存
  • 非unicode响应的自动编码
  • robots. txt的支持
  • 抓取深度控制
  • 设置跨域开关
  • 谷歌应用程序引擎支持

二. colly安装及基本使用

安装go get -u github.com/gocolly/colly/...

基本使用

package mainimport ("fmt""github.com/gocolly/colly"
)func main() {// Instantiate default collectorc := colly.NewCollector(// Visit only domains: hackerspaces.org, wiki.hackerspaces.orgcolly.AllowedDomains("hackerspaces.org", "wiki.hackerspaces.org"),)// On every a element which has href attribute call callbackc.OnHTML("a[href]", func(e *colly.HTMLElement) {link := e.Attr("href")// Print linkfmt.Printf("Link found: %q -> %s\n", e.Text, link)// Visit link found on page// Only those links are visited which are in AllowedDomainsc.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.orgc.Visit("https://hackerspaces.org/")
}

三. 基于colly的2个使用案例

案例1

package mainimport ("fmt""time""github.com/gocolly/colly"
)func main() {ua := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"c := colly.NewCollector(colly.UserAgent(ua),                      // 设置UAcolly.DetectCharset(),                    // 自动编码,防止乱码colly.AllowedDomains("www.tcmap.com.cn"), // 限制域名)c.AllowURLRevisit = true                  // 另外一种设置方式,允许重复访问_ = c.SetProxy("socks://127.0.0.1:10808") // 设置代理// 响应内容是HTML时调用,goquerySelector来查找元素c.OnHTML("a[href*=\"shandong\"]", func(h *colly.HTMLElement) {// fmt.Println(h.Text)href := h.Request.AbsoluteURL(h.Attr("href")) // 绝对路径_ = h.Request.Visit(href)// 接收上下文传递过来的数据city := h.Response.Ctx.Get("city")fmt.Println(city)})_ = c.Limit(&colly.LimitRule{DomainGlob:  "*",RandomDelay: 1 * time.Second, // 延时})// 请求前调用c.OnRequest(func(r *colly.Request) {fmt.Println("访问:", r.URL)// 从请求往响应传递上下文数据r.Ctx.Put("city", "城市")})// 收到响应后调用c.OnResponse(func(r *colly.Response) {// fmt.Println(string(r.Body))})// 通过xpath来获取元素c.OnXML("//", func(element *colly.XMLElement) {})// 请求发生错误时调用c.OnError(func(r *colly.Response, err error) {fmt.Println(err)})c.Visit("http://www.tcmap.com.cn/shandong/")
}

案例2

package mainimport ("fmt""github.com/gocolly/colly""gorm.io/driver/mysql""gorm.io/gorm""time"
)func main() {dsn := "root:pass@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.New(mysql.Config{DSN:               dsn,DefaultStringSize: 256,}), &gorm.Config{})if err != nil {fmt.Println("连结数据库失败")}ua := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"c := colly.NewCollector(colly.UserAgent(ua),                      // 设置UAcolly.DetectCharset(),                    // 自动编码,防止乱码colly.AllowedDomains("www.tcmap.com.cn"), // 限制域名)cityCollector := c.Clone()countyCollector := c.Clone()townCollector := c.Clone()// 省 http://www.tcmap.com.cn/shandong/c.OnHTML("#pagebody #page_left > table", func(element *colly.HTMLElement) {element.ForEach("tr td:first-child", func(i int, e *colly.HTMLElement) {city := e.ChildText("a")fmt.Println(city)relative_url := e.ChildAttr("a", "href")if relative_url != "" {absURL := e.Request.AbsoluteURL(relative_url)// fmt.Println(absURL)ctx := colly.NewContext()ctx.Put("city", city)_ = cityCollector.Request("GET", absURL, nil, ctx, nil)}})})// 市 http://www.tcmap.com.cn/shandong/jinan.htmlcityCollector.OnHTML("#pagebody #page_left > table", func(element *colly.HTMLElement) {city := element.Request.Ctx.Get("city")element.ForEach("tr td:first-child", func(i int, e *colly.HTMLElement) {county := e.ChildText("a")fmt.Println(city, county)relative_url := e.ChildAttr("a", "href")if relative_url != "" {absURL := e.Request.AbsoluteURL(relative_url)//fmt.Println(absURL)ctx := colly.NewContext()ctx.Put("city", city)ctx.Put("county", county)_ = countyCollector.Request("GET", absURL, nil, ctx, nil)}})})// 区县 http://www.tcmap.com.cn/shandong/lixiaqu.htmlcountyCollector.OnHTML("#pagebody #page_left > table", func(element *colly.HTMLElement) {city := element.Request.Ctx.Get("city")county := element.Request.Ctx.Get("county")element.ForEach("tr td:first-child", func(i int, e *colly.HTMLElement) {town := e.ChildText("a")fmt.Println(city, county, town)relative_url := e.ChildAttr("a", "href")if relative_url != "" {absURL := e.Request.AbsoluteURL(relative_url)//fmt.Println(absURL)ctx := colly.NewContext()ctx.Put("city", city)ctx.Put("county", county)ctx.Put("town", town)_ = townCollector.Request("GET", absURL, nil, ctx, nil)}})})// 乡镇 http://www.tcmap.com.cn/shandong/lixiaqu_jiefanglujiedao.htmltownCollector.OnHTML("#pagebody #page_left > table", func(element *colly.HTMLElement) {city := element.Request.Ctx.Get("city")county := element.Request.Ctx.Get("county")town := element.Request.Ctx.Get("town")element.ForEach("tr td:first-child", func(i int, e *colly.HTMLElement) {village := e.ChildText("a")if village != "" {fmt.Println(city, county, town, village)_ = save(db, city, county, town, village)}})})_ = c.Limit(&colly.LimitRule{DomainGlob:  "*",RandomDelay: 1 * time.Second, // 延时})_ = c.Visit("http://www.tcmap.com.cn/shandong/")// c.Wait()
}type Village struct {ID      uint `gorm:"primaryKey"`City    stringCounty  stringTown    stringVillage string
}func (Village) TableName() string {return "village"
}func save(db *gorm.DB, city string, county string, town string, village string) error {villageRecord := Village{City: city, County: county, Town: town, Village: village}db = db.Create(&villageRecord)db = db.Commit()return nil
}

文章最后,推荐推荐一个比较好用的代理:
在这里插入图片描述

这篇关于有名的爬虫框架 colly 的特性及2个详细采集案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/844951

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de