福利:日数据过亿的*敏*感*词*爬虫是怎么实现的? | 文末免费赠书
优采云 发布时间: 2022-11-21 06:16福利:日数据过亿的*敏*感*词*爬虫是怎么实现的? | 文末免费赠书
(点击上方快速关注,设为星标一起学习Python)
我们身边接触最频繁、规模最大的爬虫是几大搜索引擎。但是搜索引擎的爬取方式和我们爬虫工程师联系我们的方式有很大的不同,没有太大的参考价值。今天要讲的是大众舆论方向的爬虫(架构及关键技术原理),主要涉及:
1、网页文字智能提取;2、分布式爬虫;3、爬虫DATA/URL去重;4、爬虫部署;5、分布式爬虫调度;6、自动渲染技术;7、消息队列在爬虫领域的应用;8、多种形式的反爬虫;
请大家买瓜子,搬凳子坐下学习,准备好角逐文末奖品!
1、网页文本智能提取
舆论其实就是舆论的形势。掌握舆论,必须掌握足够的内容信息。除了一些大型的内容/社交平台(比如微博)开放了商业接口外,其他的都需要依靠爬虫来采集。因此,舆论方向的爬虫工程师需要面对上千个不同内容和结构的站点。我们用一张图来表示他们面临的问题:
没错,他们的采集器必须能够适应数以万计的网站结构,从不同风格的HTML文本中提取出主要内容——标题、正文、发布时间、作者。
如果是你,你会用什么样的设计来满足业务需求?
曾经想象过这样一个问题,在技术群里看到有朋友问过类似的问题,但是很难得到满意的回答。有人说:
1、使用分类方法将相似的内容归为一类,然后为一类内容配置抽取规则;2.使用正则化提取指定标签中的内容;3.利用深度学习和NLP语义分析,找出哪里有意义 4.利用计算机视觉,让人点击,然后根据页面的相似度进行分类提取(其实是分类方法的自动化版本) ; 5.使用算法计算文本的密度,然后提取;
总之,各种想法层出不穷,但最终都没有听到实际应用的消息。目前大部分公司都采用手动配置XPATH规则的方式。采集时,通过URL匹配相应的提取规则,然后调用规则实现多站爬取。这种方法很有效,在企业中也长期使用,比较稳定,但缺点也很明显——费时费力,成本高!
偶然有一天,看到微信技术群里有人(优秀的Python工程师青楠)发布了一个文本自动抽取的算法库GeneralNewsExtractor[1](以下简称GNE)。本库参考了武汉邮电学院洪宏辉、丁世涛、黄傲、郭志远等人撰写的论文——《基于文本和符号密度的网页文本提取方法》,并在此基础上使用Python代码的纸。实现,即GNE。它的原理是提取网页DOM中的文本和其中的标点符号,根据文本中标点符号的疏密程度,利用算法从一个句子扩展为一段文字和一篇文章。
GNE能有效剔除正文以外的广告、推荐栏目、介绍栏目等“噪音”内容,准确识别网页正文,识别率高达99%(所选内容为测试是国内主流门户/媒体平台的文章)。
GNE的具体算法细节和源码分析请参考《Python3网络爬虫宝典》第五章。
有了它,基本上可以解决90%以上爬虫分析的舆情方向需求,剩下的10%可以根据抽取规则进行调整或完全定制,解放了大量的XPATH工程师。
2. 爬虫DATA/URL去重
舆论业务要密切关注网站是否有新内容发布。要求是越快越好,但由于各种软硬件的限制,通常要求在30分钟或15分钟内监控到新内容。要监控目标网站的内容变化,我们可以选择的更好的方式是轮询。不断访问网页,判断是否有“新内容”,有则进行爬取,无“新内容”则不爬取。
那么问题来了,应用程序如何知道哪些内容是“新”的,哪些内容是“旧”的?
拆解问题,“新内容”就是没有被抓取的内容。这时候我们就需要用一些东西来记录这篇文章是否被爬取过,每次有文章要爬取的时候进行比较。这是这个问题的解决方案。
那靠什么来比较呢?
我们都知道文章的url几乎都是一样的,不会重复,所以我们可以选择文章的url作为判断的依据,也就是把抓取到的url像列表一样存放在一个容器中。判断要抓取的URL是否已经存储在容器中,如果是,则表示已经抓取到,直接丢弃,进入下一个URL的判断过程。整体逻辑如下图:
这就是爬虫领域的“去重”。其实去重大致可以分为内容(DATA)去重和链接(URL)去重。这里我们只是顺着舆论的方向说一下去重要求。如果是电商方向的去重,那么URL不能作为判断依据,因为电商爬虫(比如比价软件)的目的主要是判断价格变化。这时候判断变化的依据应该是商品的关键信息(比如价格、折扣),也就是DATA去重。
去重原理了解了,那么用什么作为存储去重基础的容器呢?MySQL?雷迪斯?数据库?记忆?其实大部分工程师选择Redis作为存储去重基础的容器,但实际上MySQL、MongoDB、内存都可以作为容器。至于他们为什么选择Redis,它比其他数据存储好在哪里?可以看《Python3网络爬虫宝典》第三章。
3.分布式爬虫
" />
无论是舆情方向的爬虫,还是电商方向的爬虫,要承担的爬取量都非常大。少则每天百万条数据,多则每天数十亿条数据。以往大家熟知的单机爬虫,无论是性能还是资源,都无法满足需求。1个不够,那就10个,100个!这就是分布式爬虫出现的背景。
众所周知,分布式系统和单机系统面临的问题是有区别的。除了相同的业务目标,分布式系统还需要考虑多个个体之间的协作,特别是资源的共享和竞争。
当只有一个爬虫应用时,只有一个读取待爬队列,只有一个存储数据,只有一个判断URL是否重复。但是,当有几十个或上百个爬虫应用时,需要区分先后顺序,避免出现多个爬虫应用访问同一个URL的情况(因为这不仅浪费时间,也浪费资源)。而且,当只有一个爬虫应用的时候,你只需要在一台电脑(服务器)上运行,但是突然有那么多爬虫应用,它们应该如何部署在不同的电脑上呢?手动一张一张上传,然后一张一张开始?
资源问题
先说资源共享和竞争。为了解决待爬取的URL队列和已经爬取的队列共享的问题,队列(也就是上面提到的存放URL的容器)必须放在一个公共的(多个爬虫应用)访问的地方,比如作为部署在服务器上的Redis。
这时,一个新的情况出现了。随着数据量的增加,需要存储的URL越来越多,可能会出现存储空间需求过大导致成本增加的问题。因为Redis使用内存来存储数据,存储的URL越多,需要的内存也就越多,而内存在硬件设备中是比较昂贵的硬件,所以不得不考虑这个问题。
幸运的是,一个叫布卢姆的人发明了一种算法——布隆过滤器(Bloom filter),它使用哈希图来标记一个对象(这里是一个URL)是否存在,这样就可以大大降低内存的占用率。根据1亿个长度为32个字符的URL的MD5值计算,使用Bloom Filter前后差距约为30倍。关于Bloom Filter的算法原理和代码实现的解读请参考《Python3网络爬虫宝典》第三章。
部署问题
一个一个上传文件,一遍又一遍手动跑爬虫,太累了。你可以向你的运维同事寻求技术支持,也可以探索这些可以减少你工作量的自动化部署方式。目前业界比较知名的持续集成和部署是GitLab的GitLab Runner和GitHub Action,也可以借助K8S容器化来实现。但是它们只能帮你部署和启动,爬虫应用的一些管理功能是不能指望的。那么,今天要给大家介绍的是另一种实现方式——使用Crawlab。
Crawlab是由国外知名公司的工程师开发的分布式爬虫管理平台。它不仅支持用Python语言编写的爬虫,还兼容大多数编程语言和应用程序。借助Crawlab,我们可以将爬虫应用分发到不同的电脑(服务器),可以在可视化界面设置定时任务,查看爬虫应用在平台上的状态,环境依赖等信息。具体如下图所示:
面对如此实用的平台工具,身为工程师的我们不禁要问:
1. 它如何将文件分发到不同的计算机?2、如何实现不同计算机(多节点)之间的通信?3、它是如何做到多语言兼容的?4....
其中,我们比较关心的多节点通信是借助Redis实现的,文件的去中心化同步是借助MongoDB实现的。更多内容请参考《Python3网络爬虫宝典》第六章。
除了这类平台,Python爬虫工程师还经常接触到Scrapy框架和相关的衍生库。Scrapy团队官方开发了一个名为Scrapyd的库,专门用于部署Scrapy框架开发的爬虫应用。在部署Scrapy应用时,我们通常只需要执行一行命令就可以将爬虫程序部署到服务器上。你想知道背后的逻辑吗:
1、程序以什么形式上传到服务器?2、程序如何在服务器上运行?3、为什么可以看到每个任务的开始时间和结束时间?4、中途取消任务执行的功能是如何实现的?5、它的版本控制是如何实现的?6、如果Python应用不是Scrapy框架写的,是否可以实现以上几点的监控和操作?
实际上,Scrapy应用程序会被打包成后缀为“.egg”的压缩包,以HTTP的形式上传到服务器。服务器程序需要执行该程序时,先将其复制到操作系统的临时文件夹中,执行时将其导入到当前Python环境中,执行完毕后删除该文件。至于它的执行时间和中断操作,其实是用了Python的进程接口。详见《Python3网络爬虫宝典》第六章。
4.自动渲染技术
为了达到炫酷的效果,或者节省静态资源占用的带宽,很多网站都使用JavaScript来优化页面内容。Python程序本身无法解释JavaScript和HTML代码,因此无法获取我们在浏览器中“看到”的内容,但实际上并不是“真实的”,因为这些内容都是浏览器渲染出来的,只存在在浏览器中,HTML文档中的文本,JavaScript文件中的代码,图片、视频以及那些特效都没有出现在代码中,我们看到的一切都是浏览器的功劳。
由于Python获取不到浏览器渲染的内容,所以当我们像往常一样编写代码爬取上面的数据时,会发现获取到的数据和看到的不一样,任务就会失败。
这时候就需要用到自动渲染技术了。事实上,像 Chrome 和 FireFox 这样的浏览器已经开放了接口,允许其他编程语言按照协议规范来操作浏览器。基于这种技术背景,一些团队开发了像Selenium和Puppeteer这样的工具,然后我们就可以使用Python(其他语言 )代码来操作浏览器了。让浏览器帮我们完成用户名密码输入、登录按钮点击、文字图片渲染、验证码滑动等操作,从而打破Python与浏览器本身的差异壁垒,回归本源在浏览器的帮助下呈现内容后的 Python 程序。然后得到和我们在网页上看到的一样的内容。
除了浏览器,APP也有类似情况。具体操作做法和案例详见《Python3网络爬虫宝典》第二章。
五、消息队列在爬虫领域的应用
在前面的描述中,我们并没有提到爬取的细节。假设这样一个正常的爬虫场景:爬虫首先访问网站的文章列表页,然后根据列表页的URL进入详情页进行爬取。这里需要注意的是,文章详情页数必须是列表页数的N倍。如果列表显示 20 条内容,则多出 20 倍。
如果我们需要爬取很多网站,那么就会用到分布式爬虫。如果分布式爬虫只是复制一个爬虫程序的N份来运行,那么就会出现资源分配不均衡的情况,因为在上述情况下,每个爬虫都需要做这项工作。其实我们可以有更好的搭配方式来最大限度的利用自己的资源。比如从列表页到详情页可以抽象成生产者和消费者模型:
" />
4号和5号爬虫应用只负责从列表页中提取详情页的URL,然后推入队列,其他爬虫从队列中提取详情页的URL进行爬取. 当列表页和详情页的数量差距比较大时,我们可以增加右边的爬虫数量,减少右边的爬虫数量(或者增加左边的爬虫数量,具体取决于情况)当差距很小。
与队列的“数据采集生产线”相比,左边的爬虫程序是生产者,右边的爬虫程序是消费者。有了这样的结构,我们就可以根据实际情况调整生产者或消费者的熟练程度,以最大限度地利用资源。还有一个好处就是,当生产者拿到的URL越来越多,但是消费者一时消费不过来的时候,这些URL会一直存在队列中,等消费能力增加的时候可以再次达到平衡。有了这样的生产线,我们就不用担心突然涌入的URL,或者突然消耗掉队列中的URL。队列削峰填谷的能力不仅在后端应用中大放异彩,在爬虫中也同样如此。
爬虫(和分布式爬虫)程序访问消息队列的具体实现和细节请参考《Python3网络爬虫宝典》第四章。
6.多种形式的反爬虫
你要的我不给你!
网站不会轻易让您抓取网站上的内容。他们往往在网络协议、浏览器特性、编程语言差异、人机差异等方面给爬虫工程师设置障碍,常见的有滑块验证码和拼图验证码。, 屏蔽IP, 检查COOKIE, 要求登录, 设置复杂的加密逻辑, 混淆前端代码等。
水来掩护,兵来将挡!爬虫工程师与目标网站工程师的斗智斗勇,精彩纷呈。《Python3反爬虫原理与绕过实战》一书收录了市面上80%以上的反爬虫方法和爬虫技术。详细解释了双方使用的战术,让观众可以从中学到很多东西。具体细节可以看书领略科技世界!
概括
今天,我们学习了日数据量过亿的*敏*感*词*爬虫实践之路上的关键技术点,包括文本智能抽取、分布式爬虫、爬虫部署调度、去重、自动化渲染。学习并掌握这些技术后,实现日数据过亿的爬虫不成问题。
这些经验来自于一线爬虫工程师。同时,这些技术和设计经过了长期工作的验证,可以直接应用到工作中。
活动
上面多次提到《Python3网络爬虫宝典》,小编买了好几本书感谢大家对小编的支持。想要书的朋友,请在评论区留言,告诉我为什么要这本书,然后就可以参与到本次赠书活动中了。
购买链接:
活动规则:
1、本次活动评论区点赞数前3名的好友,赠送书籍1本。每个人都以评论和喜欢的排名获胜。禁止刷赞,刷赞无效。欢迎举报;
2、参与活动的朋友,请转发此文至朋友圈。抽奖的时候小编会去看看的。如未转发,奖品顺延至下一位;
3、活动时间为文章发布时间至2020年12月6日22:00;
4.活动书将由发布者邮寄(7个工作日)。抽奖后小编会联系中奖的朋友提供收割地址;
参考
[1]GeneralNewsExtractor:
注:本次活动最终解释权归本公众号所有;
(结束)
看完这篇文章你有收获吗?请转发分享给更多人关注《Python那些事》,成为全栈开发工程师
点“在看”的人都变美了
福利:友情链接出售,*敏*感*词*被动收入赚钱
两个站点的站点之间互相添加链接,可以增加对方站点的权重,包括和搜索排名,这是传统站点优化最基本的方法之一。
在交换友情链接的过程中,一般仅限于权重相近的网站。如果一个新站没有足够的权重,网站历史也没有相应的网站权重,那么就很难找到合适的网站来交换友情链接。.
互联网行业本来就是一个市场,就像淘宝80%的销售额不是靠那些爆款贡献的,而是靠那些销量平平和小众的大众产品。
哪怕是一个小小的需求,也足以产生一个项目、一个市场、买卖友情链接,也就是网站上最不起眼却非常暴力的生意。
说暴力是因为暴利,因为一个网站可以加不同的链接,不会因为增加友情链接而增加成本。
我们知道搜索引擎有上千万个网站,所以在这些百度搜索中,总会有一个关键词,而这个关键词在搜索中显示的位置是有限的。搜索引擎如何识别这些网站?首先对它们进行排序。
哪个网站有网站支持,也就是友情链接多,哪个网站被优质搜索引擎相信,信任度不高,也就是说会给出更好的排名。对于一个新网站,在前期购买一些友情链接有助于获得搜索引擎的信任,便于搜索引擎排名。
目前,搜索引擎也是用户需求最准确的渠道之一。互联网上还有大量行业依赖搜索引擎的流量。那么为什么在PC市场持续下滑的情况下,还有大量的人坚持做网站呢?准确的说是PC端的个人网站。
这是一个有门槛的项目。对于运营者来说,一定要了解一些基本的建站知识,并不需要对代码非常精通。
然后我们可以看看权重为1的友情链接,一般一个月两块钱。如果一个网站最多可以添加100个友情链接,利润在200元左右。一个网站使用网站程序批量建站,利润非常可观。的。
我们的成本是服务器成本,还有域名成本。一个固定的服务器可以建立很多网站。每个网站的服务器成本不会改变,但域名的成本需要增加。
像top这样的域名费用在9元左右。
前期可以买一些配置合适的域名和服务器,但是爸爸的配置要根据建站的多少来定。建议使用香港或其他服务器。
使用站群程序建站批量采集内容时,设置采集规则,每天自动采集,无需手动更新网站内容。
" />
然后,网站采集
了数百条内容后,一般会慢慢开始产生收入和流量。
这样,您就可以访问友情链接平台并开始销售友情链接以获取*敏*感*词*。
交友平台有哪些?
如果你搜索友情链接,你会发现各种各样的友情链接交易平台。不用担心没有销量。网站上整理了一些以前用过的。
这是一个长期的操作过程。后期权重高了还可以定制,网站也可以卖。
只要它存在于PC端和搜索引擎上,那么这个友情连接,交易就会继续下去,后期就是你自己的被动收入。
友情链接是所有网站变现方式中门槛最低的变现方式,因为它不需要做seo,更不用说内容,也不需要做流量,可以直接批量操作。
有多种方法可以通过网站获利。如果你做SEO和内容,那么流量的赚钱渠道立马就变多了。