基于golang的文章信息抓取
基于golang的文章信息抓取
学习golang爬虫,实现广度爬取,抓取特定的网页地址:测试站点新笔趣阁(https://www.xsbiquge.com/)
主要学习golang的goroutine和channel之间的协作,无限爬取站点小说的地址仅限书目录地址,不进行文章内容爬取
在学习中遇到了一些问题:例如共享变量map写入竞争、连接提前关闭问题等等
福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全
为了解决map类型共享变量竞争问题,封装map类型添加读写锁限制,防止不同的goroutine之间出现写入竞争(虽然只有goroutine比较多的时候才会出现)
package utilimport "sync"//封装一个map结构体,主要用来过滤相同的url地址
type VisitMap struct {sync.RWMutexvisited map[string]bool
}func (vis *VisitMap) ReadMap(url string) bool {vis.RLock()value := vis.visited[url]vis.RUnlock()return value
}func (vis *VisitMap) WriteMap(url string) {vis.Lock()vis.visited[url] = truevis.Unlock()
}//channel封装
type Pool struct {VisitMap *VisitMapqueue chan string
}func New(size int) *Pool {if size < 1 {size = 1}visitMap := new(VisitMap)visitMap.visited = make(map[string]bool)return &Pool{VisitMap: visitMap,queue: make(chan string, size),wg: &sync.WaitGroup{},}
}
接下来是main函数处理
package mainimport ("fmt""github.com/thinkeridea/go-extend/exstrings""golang.org/x/net/html""net/http""net/url""regexp""reptile/demo/queue/dao""reptile/demo/queue/model""reptile/tools""strings""time"
)func main() {//1,初始化Orm_, err := tools.OrmEngine()if err != nil {fmt.Println(err)panic(err)}bookUrl := "https://www.xsbiquge.com/"//bookUrl = "https://www.xsbiquge.com/68_68470/"pool := New(100)pool.queue <- bookUrl//根据主页面爬取子页面u, err := url.Parse(bookUrl)if err != nil {fmt.Println(err)return}hostName := u.Hostname()for uri := range pool.queue {go DownLoad(hostName, uri, pool)fmt.Println("range pool.queue : " + uri)}fmt.Println("结束啦:" + bookUrl)}
html抓取和信息处理,匹配小说列表链接
/**
下载
*/
func DownLoad(host, bookUrl string, pool *Pool) {showTime("download start")pool.VisitMap.WriteMap(bookUrl)//http 客户端client := http.Client{}//创建请求req, err := http.NewRequest("GET", bookUrl, nil)if err != nil {fmt.Println(err)}//设置请求headerreq.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36")//执行请求showTime("client.Do start")resp, err := client.Do(req)showTime("client.Do end")if err != nil {fmt.Println(err)}//这里判断下,如果响应关闭。则直接返回,实测是存在这种情况的if resp == nil || resp.Close {return}defer resp.Body.Close()showTime("links start")body, err := html.Parse(resp.Body)links := visit(nil, body)showTime("links end")for _, link := range links {absolute := urlJoin(link, bookUrl)//fmt.Println(runtime.NumGoroutine())//匹配是否是文章页面rh, _ := regexp.Compile(host)host := rh.MatchString(absolute)//匹配是否是文章页面r, _ := regexp.Compile(`\.html`)html := r.MatchString(absolute)if bookUrl != " " && host && !html {len := strings.Index(absolute, "#")if len != -1 {absolute = exstrings.SubString(absolute, 0, len)}fmt.Println("current url: " + absolute)if !pool.VisitMap.ReadMap(absolute) {fmt.Println("add url: " + absolute)go urlQueue(absolute, pool)}}}
}func urlQueue(url string, pool *Pool) {pool.queue <- url
}func urlJoin(href, base string) string {uri, err := url.Parse(href)if err != nil {return " "}baseUrl, err := url.Parse(base)if err != nil {return " "}return baseUrl.ResolveReference(uri).String()
}func showTime(action string) {//fmt.Println(fmt.Sprintf("%s :%s", action, time.Now().String()))
}
在页面链接处理过程中遇到了空指针问题:所以在处理之前先判断下 *html.Node指针是否是空指针
//文档链接处理
func visit(links []string, n *html.Node) []string {if n != nil {if n.Type == html.ElementNode && n.Data == "a" {for _, a := range n.Attr {if a.Key == "href" {links = append(links, a.Val)}}}for c := n.FirstChild; c != nil; c = c.NextSibling {links = visit(links, c)}}return links
}
学习收货:
读写锁的使用、不同goroutine之间通过channel通讯、url地址解析、html解析、html内容提去链接地址、通过map进行链接地址去重、go-extend扩展工具包使用但是有一个问题,通过range来循环通道,如果通道内没有消息了就会处于等待状态,要如果退出?
福利彩蛋:没有好玩的 API 接口?上百款免费接口等你来,免费 API,免费 API 大全
相关文章:
基于golang的文章信息抓取
基于golang的文章信息抓取 学习golang爬虫,实现广度爬取,抓取特定的网页地址:测试站点新笔趣阁(https://www.xsbiquge.com/) 主要学习golang的goroutine和channel之间的协作,无限爬取站点小说的地址仅限书目…...
【手撕数据结构】卸甲时/空间复杂度
目录 前言时间复杂度概念⼤O的渐进表⽰法小试牛刀 空间复杂度 前言 要想知道什么是空/时间复杂度,就得知道什么是数据结构。 这得分两层来理解。我们生活中处处存在数据,什么抖音热点上的国际大事,什么懂的都懂的雍正卸甲等等一系列我们用户看得到的&a…...
消防认证-防火窗
一、消防认证 消防认证是指消防产品符合国家相关技术要求和标准,且通过了国家认证认可监督管理委员会审批,获得消防认证资质的认证机构颁发的证书,消防产品具有完好的防火功能,是住房和城乡建设领域验收的重要指标。 二、认证依据…...
C++进阶-二叉树进阶(二叉搜索树)
1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值2.若它的右子树不为空,则右子树上所有节点的值都大于…...
【Unity小知识】UnityEngine.UI程序集丢失的问题
问题表现 先来说一下问题的表现,今天在开发的时候工程突然出现了报错,编辑器提示UnityEngine.UI缺少程序集引用。 问题分析与解决(一) 既然是程序集缺失,我们首先查看一下工程项目是否引用了程序集。在项目引用中查找一…...
CentOS 离线安装部署 MySQL 8详细教程
1、简介 MySQL是一个流行的开源关系型数据库管理系统(RDBMS),它基于SQL(Structured Query Language,结构化查询语言)进行操作。MySQL最初由瑞典的MySQL AB公司开发,后来被Sun Microsystems公司…...
云计算【第一阶段(28)】DNS域名解析服务
一、DNS解析的定义与作用 1.1、DNS解析的定义 DNS解析(Domain Name System Resolution)是互联网服务中的一个核心环节,它负责将用户容易记住的域名转换成网络设备能够识别和使用的IP地址。一般来讲域名比 IP 地址更加的有含义、也更容易记住…...
pygame 音乐粒子特效
代码 import pygame import numpy as np import pymunk from pymunk import Vec2d import random import librosa import pydub# 初始化pygame pygame.init()# 创建屏幕 screen pygame.display.set_mode((1920*2-10, 1080*2-10)) clock pygame.time.Clock()# 加载音乐文件 a…...
Leetcode 295.数据流的中位数
295.数据流的中位数 问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: Media…...
A59 STM32_HAL库函数 之 TIM扩展驱动 -- A -- 所有函数的介绍及使用
A59 STM32_HAL库函数 之 TIM扩展驱动 -- A -- 所有函数的介绍及使用 1 该驱动函数预览1.1 HAL_TIMEx_HallSensor_Init1.2 HAL_TIMEx_HallSensor_DeInit1.3 HAL_TIMEx_HallSensor_MspInit1.4 HAL_TIMEx_HallSensor_MspDeInit1.5 HAL_TIMEx_HallSensor_Start1.6 HAL_TIMEx_HallSe…...
【Unity】UGUI的基本介绍
Unity的UGUI(Unity User Interface)是Unity引擎内自带的UI系统,官方称之为UnityUI,是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案。以下是关于Unity的UGUI的详细介绍: 一、UGUI的特点 灵活性:…...
MySQL 9.0新特性:向量存储
MySQL 9.0 正式版已经发布,其中一个亮点就是向量(VECTOR)数据类型的支持,本文给大家详细介绍一下这个新功能。 向量类型 MySQL 9.0 增加了一个新的向量数据类型:VECTOR。它是一种可以存储 N 个数据项的数据结构&…...
ruoyi实用性改造--(四)选择数据源及非标准使用数据库
一、实用型数据直接访问/** 使用Druid中 application-druid.yml 中定义的副数据源Connection con=null; //手工调用Druid的配置访问Connection con2=null;try {//DruidDataSource ds = SpringUtils.getBean("masterDataSource");DruidDataSource ds = Spring…...
HMI 的 UI 风格创造奇迹
HMI 的 UI 风格创造奇迹...
如何安全隐藏IP地址,防止网络攻击?
当您想在互联网上保持隐私或匿名时,您应该做的第一件事就是隐藏您的 IP 地址。您的 IP 地址很容易被追踪到您,并被用来了解您的位置。下面的文章将教您如何隐藏自己,不让任何试图跟踪您的活动的人发现。 什么是 IP 地址? 首先&am…...
Windows10/11家庭版开启Hyper-V虚拟机功能详解
Hyper-V是微软的一款虚拟机软件,可以使我们在一台Windows PC上,在虚拟环境下同时运行多个互相之间完全隔离的操作系统,这就实现了在Windows环境下运行Linux以及其他OS的可能性。和第三方虚拟机软件,如VMware等相比,Hyp…...
202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义
202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义 《我有个拥抱,你要不要》作者一天到晚气fufu,挺有愛的小漫画,适合用来看图说话锻炼小语言,我看的很快乐也写得很痛快…...
使用tcpdump抓取本本机的所有icmp包
1、抓取本机所有icmp包 tcpdump -i any icmp -vv 图中上半部分,是源主机tmp179无法ping通目标主机192.168.10.79(因为把该主机关机了)的状态,注意看,其中有unreachable 图中下半部分,是源主机tmp179可以p…...
Nginx:负载均衡小专题
运维专题 Nginx:负载均衡小专题 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/…...
新增多种图表类型,新增插件管理模块,DataEase开源数据可视化分析工具v2.8.0发布
2024年7月8日,人人可用的开源数据可视化分析工具DataEase正式发布v2.8.0版本。 这一版本的功能变动包括:图表方面,新增组合图、热力地图、符号地图、K线图等图表类型,并对已有的仪表盘、明细表、指标卡、富文本等图表类型进行了功…...
B站视频字幕抓取实战:Tampermonkey搭配GreasyFork脚本,5分钟搞定CC字幕导出
B站视频字幕高效提取指南:Tampermonkey与GreasyFork脚本深度应用 每次观看B站优质内容时,那些精心制作的字幕是否让你想保存下来反复学习?传统录屏或手动抄写效率低下,而专业工具又过于复杂。本文将带你探索浏览器脚本的魔法世界&…...
从CMIP6到SCI论文:气候降尺度全流程实战(含偏差校正与未来预估)-GCM数据降尺度、泰勒图评估及XGBoost机器学习建模指南
做水文气象、气候学、地理遥感、生态环境等领域的科研人,是不是都逃不过这些噩梦:尺度鸿沟难跨越:GCM 粗网格(>100km)和流域 / 城市精细尺度(<10km)不匹配,动力降尺度成本太高…...
JekyllNet .Net 版本的Jekyll , 你博客 文档的静态生成利器 。
若君只欲一篇而尽知 JekyllNet 今可如何用,此文即其总册。 项目入口 仓库地址:https://github.com/JekyllNet/JekyllNet文档网站:https://jekyllnet.helpGitHub Pages 站点入口(仓库 Pages):https://jekyllnet.github.io/JekyllNe…...
老旧设备重生:开源工具OpenCore Legacy Patcher让旧Mac焕发新生的终极解决方案
老旧设备重生:开源工具OpenCore Legacy Patcher让旧Mac焕发新生的终极解决方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 您是否拥有一台被苹…...
3个突破限制步骤:res-downloader让网络资源获取变得无拘无束
3个突破限制步骤:res-downloader让网络资源获取变得无拘无束 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数…...
科研人必备:用浏览器插件给IEEEXplore做个‘小手术’,告别20秒加载
科研效率革命:用浏览器插件精准优化IEEEXplore访问体验 每次打开IEEEXplore文献库,那个转不停的加载图标是否让你焦躁不安?作为每天要与学术数据库打交道的科研工作者,20秒的等待时间足以打断思考流,降低工作效率。这背…...
Wan2.1 VAE与微信小程序开发结合:打造个人AI头像生成工具
Wan2.1 VAE与微信小程序开发结合:打造个人AI头像生成工具 你有没有想过,用一张自己的照片,就能快速生成几十种不同风格的艺术头像?无论是动漫风、油画感,还是赛博朋克,都能一键搞定。以前这可能需要专业的…...
YOLOv8预测结果一键导出:自定义路径+日期文件夹,还能合并所有标签到单个TXT文件
YOLOv8预测结果高效管理:自动化归档与标签合并实战指南 当你在使用YOLOv8完成目标检测任务后,是否经常遇到这样的困扰:检测结果散落在不同文件夹中难以追溯,标签文件分散在各个角落不便统计,每次手动整理既耗时又容易出…...
程序实现环境温度对传感器的误差补偿,不同温度下测量精度一致,颠覆温漂难题。
无论你是做工业传感还是消费电子,只要你测物理量(电压、电流、压力、流量),温度就是精度的头号杀手。今天我们用 Python 打造一套自适应温度补偿系统,让仪器在不同温度下“不忘初心”。一、 实际应用场景描述 (Scenari…...
小麦联合收割机的设计【说明书+SW三维+CAD图纸】
小麦联合收割机作为现代农业机械化的核心装备,其设计需兼顾效率、可靠性与适应性。该设备通过集成收割、脱粒、清选及集粮功能,实现小麦收获环节的连续作业,显著缩短田间作业周期,降低人工劳动强度。其核心作用体现在三方面&#…...
