爬虫工作量由小到大的思维转变---<第十二章 Scrapy之sql存储与爬虫高效性的平衡艺术>

news/2024/7/19 10:28:15 标签: 爬虫, scrapy

前言:

(本文仅属于技术性探讨,不属于教文)

刚好,前阵子团队还在闲聊这个问题呢。你知道吗,在数据收集这个行当里,怎么存数据这问题就跟“先有鸡还是先有蓝”一样,没完没了的循环往复。老规矩,咱们先搞清楚我们的“鸡”是啥,然后再刨根问底到底该怎么孵这个“蛋”。


说到底,爬虫这货其实就和拉货的卡车司机没两样。要做的事儿其实就是把货物——这里指的是数据——从A地搬到B地,一路上还得保证数据这货不掉链子。听着挺简单的吧?但实际上,这过程中牵扯的细节和难点也不比开大卡车简单多少。


每次拉一车数据回来,心里最闹心的就是这些数据怎么处理。先清洗再存,感觉就像是把货物过一道质检;直接存,又怕到时候取起来麻烦;加点逻辑处理,又担心效率慢上不少。这得取舍之间,痛苦无比啊。


但是,时间不等人,特别是爬虫这一行,快是王道。你在那儿犹豫,咱们对手可是横着刷数据走了。

正文:

------在这种压力下,你得优先考虑的是效率和完整性。如果处理得慢腾腾的,效率就没了;数据弄丢了,完整性也跟着没了。那怎么办?得找个两全其美的方案。

如今最火的爬虫框架Scrapy,抓数据挺利索,但到了处理item,特别是存储环节,就开起了倒车。它在pipeline里处理数据是同步的,跟它那异步抓取的节奏严重不符。一旦数据一多,特别是涉及多张表,你那存储的效率就得打大大的折扣。


这不,我就被这事儿给卡住过。拉回来的数据多得吓人,想着要是按Scrapy的节奏来,这存储效率能低到家了。用同步的方式慢吞吞地存,那爬虫的速度优势不就成了纸老虎吗?深思熟虑后,决定,把握住快和标准这两个关键词。


我摸索出了一套新的方案:用aiomysql这样的异步数据库连接库。别看这异步两字,它可真是里面的玄机所在。它让我们在存储item时也能走上异步的快车道。咱们pipeline虽是单线程,但利用aiomysql可以同时进行多个数据写入操作,大大提升了数据存储的效率。


可能你会问,那这样改来改去,值得吗?我告诉你,太值了!那速度就像火箭,嗖嗖的。尤其是对于我们这种数据量巨大、必须跟时间赛跑的项目来说,秒就是金钱,效率就是生命。再说了,技术不就是用来解决问题的吗?既然有更优的选择,岂不是傻子不用?


不过,这技术上的升级只是解决问题的一部分。这其中还牵扯到了一个更深层次的话题——数据库的设计和优化。没错,咱们将数据从网页上抓下来,整得利利索索存到数据库里是第一步。但别忘了,设计一个既能承受高并发又高效利用资源的数据库结构才是咱笔挺爬虫后续要面对的大挑战。


说到库的结构,得变着法儿想。表设计得规范、关系搭配得和谐、索引建得当,这可都是技术活儿。要知道,一次次的查询和更新可能对数据库的性能影响特别大。咱们得利用各种数据库性能优化技术,比如缓存策略、慢查询优化、读写分离,甚至是对热点数据的分布式存储。这样一来,这批爬下来的宝贵货物能被妥善地利用起来,为下个环节——数据分析和挖掘打下坚实的基础。


其实,技术上的这些操作和提升,都是为了事情能往前走。咱们像是在铺路,让收集来的数据能够存储得当,又能供未来的分析师们发掘价值。毕竟,数据本身没意义,意义在于咱们如何去使用这数据。


最终,这一切的一切,从爬虫硬拉数据,到高效存库,再到数据的进一步提炼和分析,都是串起来的,一个依赖于另一个。在这个过程中,任何一个环节的弱点,都可能成为数据流转的瓶颈。咱这爬虫工程师可不仅仅是个普通的司机,咱们更是个协调者,要确保这每一步都在最佳状态。


这就是爬虫和数据库存储的千丝万缕的联系,硬件、软件、技术和策略,它们共同为了一个目标而打拼——让数据变得有价值。没了这些,那些网上的数据就像散落一地的珍珠,得不到妥善的收集和整理,它们的光彩也就照不到哪儿去了。


所以,下次你在写爬虫的时候,别只想着怎么把数据抓下来,也要多想想后面这些事儿。越是早打算,到后头越是省心。这个行业的精髓就在于此——预见未来,在现在的基础上找到答案。


http://www.niftyadmin.cn/n/5270731.html

相关文章

【跨域】同源策略、跨域解决

文章目录 1. 什么是同源策略及其限制内容?2. JSONP的实现流程3. CORS 需要浏览器和后端同时支持。IE 8 和 9 需要通过 XDomainRequest 来实现。4. Node中间件代理(两次跨域)5. nginx反向代理6. 总结1. 什么是同源策略及其限制内容? 同源策略是一种约定,它是浏览器最核心也最…

Azure Machine Learning - 提示工程简介

OpenAI的GPT-3、GPT-3.5和GPT-4模型基于用户输入的文本提示工作。有效的提示构造是使用这些模型的关键技能,涉及到配置模型权重以执行特定任务。这不仅是技术操作,更像是一种艺术,需要经验和直觉。本文旨在介绍适用于所有GPT模型的提示概念和…

php的Url 安全的base64编码解码类

/*** Url安全的Base64编码方法* author JerryLi* version 20231217*/ final class UrlSafeB64Fun{/*** 编码* param string $sData 原始字符串* return string*/static public function encode(string $sData): string{$aTmp base64_encode($sData);return strtr($aTmp, [>…

RabbitMQ 消息持久化

默认情况下,exchange、queue、message 等数据都是存储在内存中的,这意味着如果 RabbitMQ 重启、关闭、宕机时所有的信息都将丢失。 RabbitMQ 提供了持久化来解决这个问题,持久化后,如果 RabbitMQ 发送 重启、关闭、宕机&#xff…

第三十七章 XML 模式的高级选项 - 超类如何表示为类型

文章目录 第三十七章 XML 模式的高级选项 - 超类如何表示为类型超类如何表示为类型基于多个支持 XML 的超类的类 第三十七章 XML 模式的高级选项 - 超类如何表示为类型 超类如何表示为类型 如果需要 XML 架构来显示特定的类型层次结构,则需要了解映射如何解释 IRI…

OpenSergo Dubbo 微服务治理最佳实践

*作者:何家欢,阿里云 MSE 研发工程师 Why 微服务治理? 现代的微服务架构里,我们通过将系统分解成一系列的服务并通过远程过程调用联接在一起,在带来一些优势的同时也为我们带来了一些挑战。 如上图所示,可…

IDEA中,如何将maven项目变为SpringBoot项目?

第一步&#xff1a;新建Maven工程 这很简单不做过多赘述。 第二步&#xff1a;修改pom.xml文件 分别加入springboot父依赖&#xff0c;web依赖&#xff0c;test测试依赖&#xff0c;maven打包依赖。 <?xml version"1.0" encoding"UTF-8"?> <…

2023/12/17 初始化

普通变量&#xff08;int,float,double变量&#xff09;初始化&#xff1a; int a0; float b(0); double c0; 数组初始化&#xff1a; int arr[10]{0}; 指针初始化&#xff1a; 空指针 int *pnullptr; 被一个同类型的变量的地址初始化&#xff08;赋值&#xff09; int…