3700字!爬虫数据清洗已经不重要了,我这样的爬虫架构,如履薄冰腾讯云开发者社区

爬虫的目的就是获取数据,我总结了一下采集数据的步骤:

所以说大多时候,爬虫程序的开发是以数据为驱动的。在开发程序前明确目标数据,在程序开发过程中清洗数据。

数据清洗其实是对每个数据中的字段进行处理。我在开发爬虫的过程中,常用的数据清洗方法有:字段缺失处理、数据转换、数据去重、异常值处理。下面就使用Python的requests来开发实际操作一下,在数据去重等部分时,我也会使用Scrapy来实现,来展现一下Scrapy的优势所在。

大家可能对requets用的比较多,所以这里也简单得介绍一下Scrapy。

Scrapy是一个分布式爬虫框架,我把它比作成爬虫界的Spring。reqeusts就像是servlet一样,各种功能逻辑都需要自己去实现,而Spring做了集成,底层对用户透明。

就像我们知道,Spring是在application配置文件中初始化bean,在mapper中定义数据库操作一样,而使用者无需关心Spring是如何读取这些配置文件进行各种操作的。同样,Scrapy也提供了这样的功能配置。

所以说,Scrapy是一个爬虫框架,requests是一个爬虫模块,这就是两者区别的根本所在。下面是我画的Scrapy的架构图。

无论使用Java的Jsoup也好,python的requests也罢,开发爬虫除了要解决网站反爬限制之外,还会面临下面几个问题:

爬虫程序一般只运行在一台主机上,如果是一模一样的爬虫程序部署在不同的主机上,那都是独立爬虫程序。如果想要弄一个分布式的爬虫,通常的思路是将爬虫程序分为url采集和数据采集两个部分。

现将url爬取下来放入到数据库中,然后通过where条件限制,或者直接使用redis的list结构,让不同主机上的爬虫程序读取到不同的url,然后进行数据爬取。

假如有1000个页面需要爬取,爬到第999个页面,进度条马上满格的时候,程序咯噔一下挂了,就差一个,但是还是没爬完啊,咋整?我选择重新启动程序,那么你说我怎么样才能直接从第999个开始爬取呢?

这里先讲讲我写的第一个爬虫:爬取10+个地市的poi信息。

实习,第一次开发爬虫,也不知道有高德poi接口啥的,于是就找了个网站来爬取poi信息。当时那个网站估计还在起步阶段,服务器带宽应该不高,访问速度是真的慢,而且动不动维护停站,所以我的程序也得跟着停止。如果每次启动都重新爬取,估计几年也爬不完,于是我想了个办法。

我先将所有地市下所有区县数据的条数(网站上有)先手动录入到数据库表中,每次重新启动爬虫程序的时候,先统计结果数据表中各个区县已经爬取的条数,与总条数进行对比。如果小于的话,说明还没有爬取完,然后通过某区县已爬取条数/网站每页展示条数计算出我已经爬取到此区县的页数,再通过余数定位到我爬到了此页面的第几个。通过这种方法,最后无丢失爬取了163w条数据。

换种思路,将爬取的url放到表中,重启程序开始爬取url的时候,先去判断url是否存在于数据表中,如果存在就不进行爬取,这样也能实现断点续爬。也是沿用了原始的url的去重的思路。

so,有没有一种方式让我既能脱离阅读分析js,还能绕过动态加载?

sure!!首先关于动态加载,可以理解为浏览器内核通过执行js在前端渲染数据。那么我们在程序中搞个浏览器内核,我们直接获取js渲染后的页面数据不就可以了么?

通常使用selenium+chrome、phantomjs、pyvirtualdisplay来处理动态加载,但是或多或少都会有性能问题。

如果手动实现这些功能,费时费力。所以,如果我说关于上述问题,Scrapy都提供了现成的解决方案(开箱即用的插件),那么你会心动吗?

数据采集其实也属于数据清洗,同时也是数据清洗的前提。因为要将从获取的html或者json使用selector转换成csv格式的数据。所以在从网页获取数据时,需要先判断数据是静态网页渲染还是XHR异步请求。

静态网页渲染,就是用户访问网站发起请求时,是网站后台将数据渲染(填写)到html上,返回给浏览器展示,这里的数据渲染是后台来做。爬虫使用css或者Xpath选择器处理数据,对应Python的BS4或者Slector模块。

而XHR异步请求,是网站先将空的html返回给浏览器,然后浏览器再发起XHR(Ajax)来请求数据(大部分是Json),最后浏览器将数据渲染到空html上进行展示,所以这里的数据渲染是浏览器(前端)去做。所以Python使用json模块来处理数据。

这里就拿腾讯视频来简单介绍一下:

我们在F12进入开发者控制台时,可以看到动漫列表和热搜榜的数据。

当我们点击热搜搜索框是时,热搜榜的div就会修改,这就是局部刷新的XHR异步加载。

我们在控制台看一下Network中的XHR信息。

所以,判断是静态网页渲染还是XHR,有很多种方法。

数据清洗可以发生在数据采集阶段,也可以发生在数据存储阶段,数据大都存储在数据库中,然后使用SQL进行数据清洗。但是我更偏向于前者,在源头制定好数据规范,这也是数据治理的一部分。所以,能在程序中处理,就不要把数据问题丢给使用者,

用SQL处理重复数据,使用distinct()方法,传入的字段来确定数据的唯一性,例如一个视频的id。这个唯一字段需要自己在开发过程中去确定。

在原生爬虫requets中,我给出两种数据去重的方案:

方案一优点是不需要与外部系统频繁交互,缺点就是程序重启集合数据就会清空,而且多线程情况下还要考虑线程安全。方案二稳定,但是需要依赖数据库,数据库的响应速度会影响程序的性能。在上面讲的poi爬虫就使用了方案二。

这里先启动程序,爬取一个指定的url。

当爬取完上面url之后,第二次启动再遇到这个url时,就会看到Ignoring关键字,提示忽略已经爬取的url,不再进行爬取。

这里的用url作为数据去重的标准,如果想要重新爬取之前爬取过的url,启动前添加deltafetch_reset=1参数即可。

同时,这个插件也解决了爬虫问题中的断点续爬的问题。

在爬取某些网页时,爬取的都是字段的并集。所以某些字段在某个网页并不存在,当使用选择器获取这些字段时,就会出现空指针或者数据越界的异常。

数据字段缺失还是比较好处理的。通常是使用if进行判断,然后设置缺省值。下面是scrapy处理字段缺失的代码:

代码很简单,主要用到了datetime模块。

在上面的代码中,使用replace()进行了字符串的替换,其中包括将空格、换行等字符替换成空字符。

异常值在爬虫开发中还是比较少见的,常见的有网页编码问题导致数据的乱码,还有一些数据填充的错误。这两个问题我记得遇到过,找了好久代码没有找到,这里就简单的说一下思路。

乱码就通过chardet.detect(str)来检测一下字符串的编码格式,或者直接去看一下网页信息。使用charset关键字进行搜索:

通过meta可以看到字符集是UTF-8。至于数据填充错误,只能具体情况具体分析,通过错误数据来反推,然后在程序中进行改进。

看到这里可能会有人问:前面写的分布式、断点续爬、url去重以及动态加载和数据清洗有什么关系呢?

站在我个人的角度,我觉得是紧密联系的。我在上面谈及数据去重的时候,说了有两种方案:集合和数据库。如果在多台机器上使用分布式,集合去重这一个方案绝对是被pass了,因为你没法在多个进程共用一个集合对象。至于数据库,就要考虑如何设计才能保证数据的一致性了。

至于断点续爬、url去重就是数据去重的一个思路介绍。动态加载就是对数据采集中XHR的一个介绍。所以,爬虫也有很多东西可以学,学会requets≠精通爬虫。

上面就是个人在爬虫开发过程中,对常用的数据清洗方式的一个总结,都是一些简单的程序处理逻辑,希望对大家了解爬虫、开发爬虫有所帮助。

THE END
1.深度学习数据清洗的目的mob649e81673fa5的技术博客深度学习数据清洗的目的,#深度学习数据清洗的目的与实现深度学习的成功依赖于高质量的数据。在深度学习之前,数据清洗是一个至关重要的步骤。本文将详细介绍数据清洗的目的,流程及实现步骤,帮助初学者更好地理解这一过程。##数据清洗目的数据清洗的主要目的是去除噪声和https://blog.51cto.com/u_16175512/12697067
2.数据清洗的重要性与技巧:提升大数据分析的准确性和效率数据清洗在大数据分析中扮演着至关重要的角色,它直接关系到分析的准确性和效率。以下将详细探讨数据清洗的重要性以及相关的技巧。 一、数据清洗的重要性 提高数据质量:数据清洗能够去除或修正数据集中的错误、重复、不完整或不一致的数据,从而提高数据质量。脏数据(包含错误、重复、不完整的数据)可能导致误导性的结论,https://blog.csdn.net/Shaidou_Data/article/details/144110971
3.数据清洗的目的何在,你是如何理解数据清洗这一概念的?阅读下面文段,完成4~6题。 众人都轰动了,拥着往棋场走去。到了街上,百十人走成一片。行人见了,纷纷问怎么回事,可是知青打架?待明白了,就都跟着走。走过半条街,竟有上千人跟着跑来跑去。商店里的店员和顾客也都站出来张望。长途车路过这里开不过,乘客们纷纷探出头来,只见一街人头攒动,尘土飞起https://www.shuashuati.com/ti/9f5cb84ad5f2480193e676b8fdcc32f7.html
4.一文了解数据治理全知识体系!怎么引导客户呢?这里要引入一个众所周知的概念:二八原则。实际上,二八原则在数据治理中同样适用:80%的数据业务,其实是靠20%的数据在支撑;同样的,80%的数据质量问题,其实是由那20%的系统和人产生的。在数据治理的过程中,如果能找出这20%的数据,和这20%的系统和人,毫无疑问,将会起到事半功倍的效果。 https://www.clii.com.cn/lhrh/hyxx/202204/t20220427_3953726.html
5.机器学习中的数据清洗与特征处理综述机器学习中的数据清洗与特征处理综述 收藏 机器学习中的数据清洗与特征处理综述 背景 随着美团交易规模的逐步增大,积累下来的业务数据和交易数据越来越多,这些数据是美团做为一个团购平台最宝贵的财富。通过对这些数据的分析和挖掘,不仅能给美团业务发展方向提供决策支持,也为业务的迭代指明了方向。目前在美团的团购系统http://api.cda.cn/view/8897.html
6.如何在数据分析中进行数据清洗?数据清洗的作用主要有:野值判断和缺失值处理 一、野值判别。所谓野值,就是在一组数据中的“异常”数据,这些数据明显的与其他数据存在区别,野值包括以下这几个类型:在数据采集的过程中,完整性是基本的要求,也是相对来说比较好判别的数据。2、数据不准确 二、野值判断https://aiqicha.baidu.com/qifuknowledge/detail?id=17001272656
7.新澳门一码中精准一码免费中特,多元回归分析18.74.80小成绿毛虫在日用玻璃制品制造发布了:新澳门一码中精准一码免费中特,多元回归分析_18.74.80小成, 新澳门一码中精准一码免费中特,多元回归分析_18.74.80小成 在当今的数据驱动时代,如何利用数据来优化决策变得尤为重要。澳门新模式的精准数据分析,尤其是“一码中”系https://cdyabz.com/post/15064.html
8.研究生学术训练营之信息素养系列回顾(20182018年-2020年,图书馆依托“双一流”校研究生院的“学术训练营”项目,开启了研究生学术训练营之信息素养系列讲座及工作坊,主要对象为本校在读研究生、青年学者,结合本校学科特色,以高端学术讲座、工作坊和数据竞赛等形式,培养研究人员信息意识,提高收集、分析、处理、应用信息的能力,内容涉及数据检索、数据挖掘、数字https://wmcj.shisu.edu.cn/1a/15/c990a137749/page.htm
9.77778888王中王最新精准,你的成功之路,qs,V数据,如同现代社会的血脉,流淌在商业决策的每一个角落,而精准数据更是企业竞争中不可或缺的“王中王”,我们将一同探索“77778888王中王”这一神秘代码背后的故事,以及它是如何在复杂多变的数据海洋中,为追求成功的你铺设一条清晰路径的。 一、数据的王国:寻找“77778888王中王” https://wap.sdxmky.cn/kexue/5277.html