Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为了给wordpress的ripro主题资源站填充数据,我用golang开发了并发版爬虫和分布式爬虫两个版本,已经顺利跑通!

为了给wordpress的ripro主题资源站填充数据,我用golang开发了并发版爬虫和分布式爬虫两个版本,已经顺利跑通!

原创
作者头像
用户1413827
修改于 2023-12-02 11:00:21
修改于 2023-12-02 11:00:21
2400
举报
文章被收录于专栏:站长运维站长运维

为了给ripro主题资源站填充数据,我用golang开发了并发版爬虫和分布式爬虫两个版本,已经顺利跑通!代码总量还是比较多了,具体课程中再详细讲解,这篇文章主要分享一下自己的技术选型思路,以及我觉得做这个项目过程中自己的一些感悟!包括对于系统架构的理解以及对于golang语言本身的理解。

先说自己的业务选型思路,由于自己几套系统都已经上线,所以填充数据又成了棘手的问题,我以前的文章中也分享过我使用爬虫的经历,这次准备不走老路了,也不用golang系的口碑不错的colly了,而是自己来实现一套爬虫。这样做的目的有两个,一是我现在上线的站点确实需要填充数据,因为用了wordpressripro主题,资源类站点嘛,口碑和业务闭环实现不错的主题,可选的并不多,目的还是要放我自己的课程上线,但是我自己的课程暂时也就几个,数量不太够,网站空空的,感受总是不好的,所以还是找些数据来填充。二是爬虫其实是一个对于综合能力考察比较全面的项目,并且如果自己不使用现有框架,而完全从零来实现,会考察你各方面的能力。往基础点说就是你对golang语言的掌握,http协议的理解(ip代理池、隧道代理、防爬、反爬等),往业务层面上靠,可以把方方面面的知识都揉进来,比如说数据存储、高并发架构、分布式架构、各种业务中间件的使用,总之,它是特别考验一个人综合能力的,也正因如此,我准备出的课程,就是教大家具有这方面实践的能力,那既然要录课,自己不亲手实现出来也说不过去,基于这两个原因,并发版和分布式版本的爬虫就诞生了。

这过程中解决了很多意想不到的问题,比如说匹配页面时候,golang中正则表达式的理解程度,很大程度上决定了你爬虫fetcher层的业务执行效率。还是拿我使用过的python系的scrapy来做对比,因为scrapy使用过程中基本都是聚集式爬虫的开发,针对特定站点,所以我基本都用xpath,直接chromeF12模式获取xpath地址,直接填上去就可以,这样虽然简单,但是xpath的执行效率很低,如果遇到比较复杂的dom结构显然这是拖后腿的环节,还有更早期使用比较多的BeautifulSoup之类的,那个执行效率就更加低。css选择器也是类似,另外一个原因是这些工具的使用,其实不需要太多思考,如果长此以往用工具重复每天做相同的事,那么对于个人能力的成长想必也是没有助益的。因此,从效率和拓展知识边界两方面思考,我都决定使用xpath作为自己的dom解析器,当然这其间趟了很多坑,举几个例子:

  1. golangregexp这个正则package是不支持perl syntax(pcre)正则表达式的

如果正则用的少,或者没有匹配过很复杂的页面结构,那么前向断言、后向断言这些东西就应该没有用过。而有些页面内容的获取,用这种方式就效率其高。那怎么让golang支持这些功能呢?肯定也不需要重复造轮子了,已经有了一个regexp2,它可以支持你在golang代码中使用前向断言、后向断言。

  1. 修饰符的使用

在大块源代码中,如果以于修饰符的理解不深刻,很难更高效的做内容提取。比如sm就是我使用最多的两个修饰符(?sm)加到正则表达式的前面,代表着匹配内容时允许`n行以及进行多行匹配。而对于修饰符i,做英文处理时可能出镜率更高,我这次业务中没有遇到,但是U,也就是非贪婪匹配,在你把抓取数据框定到一个源码范围内,进一步做抓取,而抓取的有效内容有重复结构出现的时候,你要指定这个修改符,才可以把源码块中重复的部分全部匹配到,再通过findAllSubmatch中分组的定义,可以把你想拿的图片地址呀,url地址呀等有效信息遍历取到,方便回放到调度器中,交由多channel组成的worker`进一步处理。

  1. 页面编码的问题

这个有些站点可能会遇到,有些遇不到,要实现编码检测,再进一步做数据提取。

关于golang也有很多新的理解,如果框架用久了,或者在公司天天写业务代码,你可能不会太关注一些golang设计精妙的地方,比如说golang对于interface的定义,比如说golang中那句经典的“不要通过共享内存去通信,而要通过通信去共享内存”。展开说一下这两点,golang的接口是由使用者定义,如果你写过php或者java的话,接口就是用来规范业务实现的,接口定义什么,你就实现什么,定义了几个接口,并且你业务中有涉及,那你几个接口中的方法你就都需要实现出来,而golang中的接口有点不一样,比如说a接口有方法bcdx接口有方法y,如果你在某个文件中把这两个接口的4个方法(bcdy)都实现了,你实际就已经实现了ax两个接口,而所提的这某个文件,你搞些其他逻辑进来也是可以了。再来说另一点就是经典的这句话,如果你对于channel不怎么使用的话,那你可能也不理解这句话的深层含义,因为在golang中函数和channel都是一等公民,什么叫一等公民,就是你可以为所欲为,其它不强调,但强调一点函数和channel都可以作为struct的参数、返回值,这就极大扩展了你写程序的灵活性,顺着这个思路来想,你只要参数或者返回值是函数的时候,由于有闭包函数的存在,其实在函数里套无限多的业务逻辑都是可以的,而channel同样作为一等公民,channel中的数据结构也函盖了golang支持的所有类型,就包括了函数,普通的业务,如果只需要业务类型抽象成队列,那么channel就可以搞定,利用channel的写入和消费属性,你基本上不用第三方业务中间件(rabbitmqrocketmqredis),你也可以实现这些中间件可以做的事(话虽如此,术业有专攻,该选什么还选什么),这种灵活性就有点变态了。而channel结合着函数作为一等公民,又怎么理解呢?毕竟两个一等公民就是强强联合了,在做分布式系统中很多业务相互之间的衔接可能参数比较复杂,那么,普通的数据类型可能就无法支持一些功能,而channel加上函数共同作用,就可以传递非常复杂的rpc参数,让分布式业务之间的调度和融合显得游刃有余,总之,golang的高级技巧如果你不做复杂的项目,不做深度使用函数一等公民特性,不做channel一等公民特性的项目,应该是没啥深刻体会的,特别是天天写业务代码。

我还记得我在写公司的建店项目的时候,毕竟业务体量放那里业务复杂度自然跟自己之前做的业务不是一个量级,由此可以欣赏很多大拿的“精湛”技艺,那个时候对于golangdao扩展包大家代码写的飞起的样子记忆犹新,有人用golangmysql基础库,有人有gorm,有人用其它的数据库组件,拼mysql的方式神乎其神、各有千秋,当时觉得这个牛逼,现在来看,其实这些技巧还是术层面的,具有可习得性,类似于你看我的抖音,今天学习了一个泡妞技巧,明天学习了一个泡妞技巧,但是跟妹子一聊天一约会,你发现你撩不动她,甚至几句话聊死冷场,女生当场黑脸,一个手起刀落,你就进了黑名单!本质原因就是你没有一套成型的思想体系,没有一套真正落地实践有效的架构,而架构的习得是有门槛的,不是说不能学会,但是就算全部给你讲了,还是要看人悟性的,悟性高了,可能很快掌握,悟性不高,可能你反反复复学习也不得门径。就比如报我两性情感课的学员,我把聊天的架构节奏步骤都告诉他们了,一样有人三个月现在泡妞风生水起,而有人依旧默默无名,原地踏步。但是凡是就怕用心二字,但是只用心,只在大脑中模拟是没个卵用的,你必须身体力行,疾速实践,不然天赋的愚钝加上后天的不够努力,将让你跟老天爷赏饭吃型选手、或者能迅速抓住问题本质然后持之以恒的学习实践选手间的差距越来越大!

扯远了,扯回来,总之golang的很多高级特征,如果你自己不实际做几个项目,不做完项目好好复盘,其实你对我讲了些啥想必一定是糊涂的,这大概也是通过报名我的课程,来实现技术层面和跟女生互动层面双丰收的一大理由吧!哈哈!

圆回来,继续说回我开篇埋的坑,最后一个,就是对于系统架构的理解。很多业务现在看来是不需要架构的,就比如说你做的流量站,就是靠联盟广告收入来赚钱,你也没啥野心,现在短视频时代,留给web的红利越来越少了,所以能端好手上的饭碗就不错了,还要啥自行车,所以这种网站甚至云原生那一套都不需要用,就cvm或者轻量级服务系统上直接编译安装程序、业务中间件、逻辑中间件,然后狠劲搞流量就完了。架构对于什么类型的企业作用最大呢?我觉得就是提高了每个人的效能,便能使整体效能达到指数级的提高,类似于下面这张图:

这也就是为什么现在都搞云原生的原因,一个分布式系统的部署,我在传统机器上也可以搞,我之前scrapy引入scrapy-redis作为数据中间件,我就可以把各种机器的闲置性能全部利用起来,达到最大化榨干服务器性能的目的。而这个东西你传统企业也可以搞呀,我做多机房部署,搞几个运维,在那源码安装也一样可以完成呀,为啥现在都要上云原生呢?就是因为云原生相关的组成部分,可以解放很多人力的投入,并且可以让scrum真正的得到落地。至于技术架构,我觉得没有最好的,只有更适于当前情况的架构,所以无所谓最好的架构,最牛逼的架构。

但是基于k8s的云原生开发的技能,我倒觉得是现在大厂程度员,或者有志于进大厂的程序员都应该具备的一项技能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
scrapy分布式爬虫scrapy_redis一篇
可以看到,scrapy单机模式,通过一个scrapy引擎通过一个调度器,将Requests队列中的request请求发给下载器,进行页面的爬取。
周小董
2019/03/25
1.6K0
scrapy分布式爬虫scrapy_redis一篇
某管1个月迅速赚钱经验及colly实战爬取美女图片站点源码级细节分享,绝对不容错过golang技能buff加成!
本文总共分为四部分,直接从第二部分开始,嘻嘻。第二部分,主要是讲colly之前的引子,用大名鼎鼎的scrapy做开胃菜,帮你系统了解一下scrapy是如何实现自己的爬虫代理的!正所谓殊途同归,只有举一返三,方能融会贯通!第三部分,我们的主角colly该出场了,把实现它代理的方式通通告诉你,保证你的golang开发功力又会提高一大截!第四部分,牵扯到爬虫,那些必然面对的问题一个跑不了,而最关键的怕就是重复过滤了,于是我把我在colly里使用redis做布隆过滤的方案分享给你,相信你如果有爬虫需求,这也是迟早都用得上的不时之需,顺便也提了下我对colly实现分布式的理解!
用户1413827
2023/12/02
4610
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
猫头虎
2025/06/02
2.3K0
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据
Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得简单、容易上手。 利用爬虫我们可以获取大量的价值数据,从而获得感性认识中不能得到的信息,比如: 知乎:爬取优质答案,为你筛选出各话题下最优质的内容。 淘宝、京东:抓取商品、评论及销量数据,对各种商品及用户的消费场景进行分析。 安居客、链家:抓取房产买卖及租售信息,分析房价变化趋势、做不同区域的房价分析。
机器学习AI算法工程
2018/03/30
2.5K1
不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据
一文学会爬虫技巧
作为冷数据启动和丰富数据的重要工具,爬虫在业务发展中承担着重要的作用,我们业务在发展过程中积累了不少爬虫使用的经验,在此分享给大家,希望能对之后的业务发展提供一些技术选型方向上的思路,以更好地促进业务发展
kunge
2020/08/09
1.1K0
分布式架构-SpringCloud如何实现CAP
SpringCloud是现阶段最火的微服务治理框架,那么SpringCloud如何实现服务治理的CAP,这里我只想谈谈我对SpringCloud架构思想的理解。
35岁程序员那些事
2020/02/24
1.1K0
Python面试题大全(三):Web开发(Flask、爬虫)
193.scrapy和scrapy-redis有什么区别?为什么选择redis数据库?
不吃西红柿
2022/07/29
1.2K0
资深程序员骆昊:Python从新手到大师,100天完整学习路线
摘要:最近后台有些小伙伴在问我Python入门的问题,我推荐这个学习路线资料,可能你们有些已经在使用它,的确它是我见过最全的、最富有逻辑体系的Python技术栈总结,含有Python基础语法、前端、后端、Python做数据分析、数据挖掘,Python机器学习,Python深度学习等。真正做到“一文在手,打遍天下无敌手”!
double
2019/08/20
4.9K0
资深程序员骆昊:Python从新手到大师,100天完整学习路线
Python 爬虫面试题 170 道:2019 版
最近在刷面试题,所以需要看大量的 Python 相关的面试题,从大量的题目中总结了很多的知识,同时也对一些题目进行拓展了,但是在看了网上的大部分面试题不是很满意。
用户1737318
2019/08/20
9020
爬虫总结 | 爬虫的那点事第一篇一、在(反)爬虫路上的心得和解决方案二、分布式爬虫的经验三、对于后期的内容精准推送有什么建议四、爬虫中遇到的一些坑五、视频落地和精准推送六、数据落地,后期做用户画像考虑
现在慢慢开始对爬虫的一些工作做一个总结,这是第一篇文章,整理聊下做一个爬虫系统时的一些感悟。 一、在(反)爬虫路上的心得和解决方案 在讲反爬之前,先说阐明我的一个观点:反反爬的过程其实是一个和我们的客
黄小怪
2018/06/22
1.3K0
王老板Python面试(9):整理的最全 python常见面试题(基本必考)
1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身。对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常
Python之道
2018/08/02
1.8K0
王老板Python面试(9):整理的最全 python常见面试题(基本必考)
如何设计真正高性能高并发分布式系统(万字长文)
“世间可称之为天经地义的事情没几样,复杂的互联网架构也是如此,万丈高楼平地起,架构都是演变而来,那么演变的本质是什么?”
玄姐谈AGI
2019/11/25
2.4K0
分布式系统在 Kubernetes 上的进化
本文译自 The Evolution of Distributed Systems on Kubernetes[1]。作者 Bilgin Ibryam,译者张晓辉。
CNCF
2021/04/21
1.3K0
Kubernetes 上分布式系统的演化
作者 | Bilgin Ibryam 译者 | 张卫滨 策划 | 丁晓昀 1 现代分布式应用 我想为这次演讲预先设置一些背景,在这里当我提到分布式系统时,我所指的是由多个组件组成的系统,可能会有数百个这样的组件。这些组件可能是有状态的、无状态的或者是无服务器的。除此之外,这些组件可以使用不同的语言创建,运行在混合环境之中,开发时使用的是开源技术和开发标准,支持互操作性。我相信你也可以使用闭源的软件创造这样的系统,或者在 AWS 和其他的地方创建它们。具体到这次演讲,我会特别关注 Kubern
深度学习与Python
2023/04/01
5830
Kubernetes 上分布式系统的演化
腾讯分布式数据库TDSQL金融级能力的架构原理解读
为帮助开发者更好地了解和学习分布式数据库技术,2020年3月,腾讯云数据库、云加社区联合腾讯TEG数据库工作组特推出为期3个月的国产数据库专题线上技术沙龙《你想了解的国产数据库秘密,都在这!》,邀请数十位鹅厂资深数据库专家每周二和周四晚上在线深入解读TDSQL、CynosDB/CDB、TBase三款鹅厂自研数据库的核心架构、技术实现原理和最佳实践等。三月为TDSQL专题月,本文将带来直播回顾第一篇《腾讯自研分布式数据库TDSQL核心架构及特性拆解》。
分布式数据库TDSQL
2020/03/18
6.9K0
腾讯分布式数据库TDSQL金融级能力的架构原理解读
SDN实战团分享(三十三):Hurricane分布式实时处理系统架构及SDN领域的应用
嘉宾简介:卢誉声,Autodesk软件研发工程师,从事平台架构方面的研发工作。 在此之前,他曾在思科系统(中国)研发中心云产品研发部工作,并参与了大规模分布式系统的服务器后端、前端以及SDK的设计与研发工作,在分布式系统设计与实现、性能调优、高可用性和自动化等方面积累了丰富的敏捷实践与开发经验。他主要从事C/C++开发工作,致力于高性能平台架构的研究与开发。此外,对JavaScript、Lua以及移动开发平台等也有一定研究。著有《分布式实时处理系统:原理、架构和实现》,并译有《Storm实时数据处理》《
SDNLAB
2018/03/29
1.4K0
GopherChina2020 个人总结
之前去过几次相关 go 的线下 meetup,这次相对来说比较大型一些,两天的听下来还是比较烧脑的,光是记录的笔记都有近千行了,整体来说收获很大。
LinkinStar
2022/09/01
4080
不吹不擂,你想要的Python面试都在这里了【315+道题】
来源:Python编程 ID:LovePython 各位大佬暂时先来315道题尝尝吧,后面有时间再继续补充。 有缘人如果看到这些题,不妨留言一下答案,来证明下你到底有多水,哈哈哈哈哈哈哈哈哈哈哈 第一部分 Python基础篇(80题) 1、为什么学习Python? 2、通过什么途径学习的Python? 3、Python和Java、PHP、C、C#、C++等其他语言的对比? 4、简述解释型和编译型编程语言? 5、Python解释器种类以及特点? 6、位和字节的关系? 7、b、B、KB、MB、GB 的关系?
小小科
2018/06/20
3.8K0
史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
以上是总结出的最全Java面试题目,以下是最新总结出的BAT面试java必考题目和答案。
Java
2018/09/13
1.6K0
史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
怒肝半月!Python 学习路线+资源大汇总
视频地址:https://www.bilibili.com/video/BV133411C7u5/
程序员鱼皮
2021/10/12
1.1K0
推荐阅读
scrapy分布式爬虫scrapy_redis一篇
1.6K0
某管1个月迅速赚钱经验及colly实战爬取美女图片站点源码级细节分享,绝对不容错过golang技能buff加成!
4610
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
2.3K0
不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据
2.5K1
一文学会爬虫技巧
1.1K0
分布式架构-SpringCloud如何实现CAP
1.1K0
Python面试题大全(三):Web开发(Flask、爬虫)
1.2K0
资深程序员骆昊:Python从新手到大师,100天完整学习路线
4.9K0
Python 爬虫面试题 170 道:2019 版
9020
爬虫总结 | 爬虫的那点事第一篇一、在(反)爬虫路上的心得和解决方案二、分布式爬虫的经验三、对于后期的内容精准推送有什么建议四、爬虫中遇到的一些坑五、视频落地和精准推送六、数据落地,后期做用户画像考虑
1.3K0
王老板Python面试(9):整理的最全 python常见面试题(基本必考)
1.8K0
如何设计真正高性能高并发分布式系统(万字长文)
2.4K0
分布式系统在 Kubernetes 上的进化
1.3K0
Kubernetes 上分布式系统的演化
5830
腾讯分布式数据库TDSQL金融级能力的架构原理解读
6.9K0
SDN实战团分享(三十三):Hurricane分布式实时处理系统架构及SDN领域的应用
1.4K0
GopherChina2020 个人总结
4080
不吹不擂,你想要的Python面试都在这里了【315+道题】
3.8K0
史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
1.6K0
怒肝半月!Python 学习路线+资源大汇总
1.1K0
相关推荐
scrapy分布式爬虫scrapy_redis一篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档