核心方法:Python实现*敏*感*词*爬虫的一些套路

优采云 发布时间: 2022-11-23 01:21

  核心方法: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网络爬虫宝典》就是下面这本书。关于大型爬虫的套路,可以从本书中找到答案。

  福利时间

  核心方法:怎么提高百度权重?利用枫树seo综合查询工具查询百度权重

  每个从事SEO工作的人都会接触到网站权重的概念。每个站长都渴望提高网站的权重,却又无从下手。今天枫树SEO小编就和大家一起去了解一下什么是百度权重?为什么网站的权重会下降?如何提高百度权重?

  什么是百度权重?

  网站权重是指一个网站在搜索引擎上的综合排名能力,但其实百度并没有网站权重这个词。百度权重由第三方站长工具平台估算,百度搜索引擎给出一个网站关键词的受欢迎程度,分为0到9个等级,权重越高的网站越受欢迎网站是有搜索引擎的。

  如何查看网站权限?

  可以使用站长工具查询网站权重,例如:枫叶SEO、爱站、站长之家等平台可以进行全面的seo查询,定期查看网站权重,分析网站数据,并给出有效的发展计划。

  为什么网站的权重会下降?

  1、网站使用关键词堆砌、BLOG群发、披风法等黑帽SEO手段,被百度发现。网站被判定为作弊后,降级维权;

  2、服务器空间宕机,导致无法访问网站或访问速度过慢,搜索引擎蜘蛛无法顺利抓取网页,用户浏览体验不佳;

  3、网站过度的SEO优化会被搜索引擎认为是垃圾站点和作弊站点;

  4、网站结构过于模仿其他网站;

  5、本站大部分内容为从其他网站采集

、转载文章,具有实质意义的原创内容不多;

  6、网站随时更新。搜索引擎有记忆。频繁的网站改版会导致搜索引擎无法为下次访问找到相应的内容,从而降低抓取和权重;

  7、网站标题频繁更换,会导致搜索引擎无法稳定收录网站,权重可能下降,影响网站排名;

  

" />

  8、网站被恶意镜像;

  9、竞争对手在网站评论下留下过多垃圾锚文本链接,影响网站外链质量;

  10、网站长期未更新,或更新内容大部分与网站主题无关,内容无意义;

  11、网站在短时间内添加了大量外链,被搜索引擎判断为作弊,导致网站降级;

  12、短时间内大量减少外链也会导致网站的权威性下降;

  13、本站友链或同IP地址有网站被搜索引擎判定为作弊并被处罚。

  如何提高百度权重?

  如何增加百度权重

  1.域名和服务器的选择

  注册网站域名时,尽量选择有记录、历史悠久、无黑历史的老域名。旧域名可以增加搜索引擎的信任度;在预算范围内选择最好的服务器,高速稳定的服务器可以保证搜索引擎蜘蛛和用户可以正常访问网站查看内容。

  2.设置首选域

  由于一个网站至少有两个域名展示给搜索引擎,虽然搜索引擎会默认带WWW和不带www的域名指向同一个网站,但是为了防止网站有多个域名的情况会导致权重分散的域名,网站应选择其中一个域名作为首选域名,这样可以使网站的PR值更加集中和准确。

  3. URL标准化

  如果网站的首页可以通过不同的URL访问,则需要指定某个URL指向首页,将所有的内外链接都指向一个URL。

  

" />

  4.选择合适的关键词

  在关键词网站上慎重选择,不要选择过于竞争排名的词。举个例子:如果枫树SEO网直接用“SEO”作为网站的关键词,你想想如果成千上万的人都在做“SEO”关键词,你怎么保证你的网站站得住脚在成千上万的人中?竞争太激烈了,这时候可以缩小范围,把关键词设为“南宁SEO”,竞争力会不会小很多?这样的关键词排名会更快,也会让网站获得权重的时间有效缩短。

  5、交换友链,为网站添加优质外链

  高质量的外链权重高,受到搜索引擎的信任。将它们链接到网站也可以增加您自己网站的权重。

  6.创建百度百科词条

  百度百科具有很高的权威性。如果在百度上建立自己的百科词条,就可以获得大量的流量、曝光率和转化率。

  7、稳定更新优质网站内容

  网站上线后,需要持续稳定地更新网站内容。不要一下子全部更新,一下子停止更新。您可以在某个时间点发布内容。更新的内容必须与网站相关,出发点是解决用户的需求。用户和搜索引擎提供有价值的内容。也可以使用maple seoURL推送工具绑定网站,让站长工具自动抓取网站更新的网页提交给百度,可以减少百度蜘蛛发现网页的时间,加快收录,提高网站排名。

  8.现场定位锚文本

  网站的每一个内页都应该是锚文本,把网站的权重集中到网站首页。

  9.面包屑

  面包屑导航可以反映网站的结构,让用户了解当前位置,引导用户浏览网站,帮助用户快速了解网站内容,降低网站跳出率;搜索引擎蜘蛛也可以跟随面包屑导航的链接,随时抓取网页,非常方便。面包屑不仅有利于搜索引擎的抓取,也有助于提高用户的浏览体验,因此可以在网站上设置。

  10.关注竞争对手的动态

  古语有云:知己知彼,百战不殆。要想网站排名稳定,就要不时观察竞争对手的网站有什么变化,关键词是如何优化的,网站排名和收录有没有变化等等,采取取其精华,去其过程中的糟粕,这样你才有超越别人的机会。

  以上就是小编根据实践经验总结出的百度权重下降的13个原因和网站权重下降的13个原因以及增加百度权重的10个方法。如果您觉得本文对您有帮助,请关注并采集

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线