
显然不能直接储存,你还得解析出自己需要的内容。
比如我爬取某新闻网今日的国内新闻,那么我创建一个实体类,里面有属性:新闻标题,新闻时间,正文等等。解析出你需要的内容,封到实体里面,然后在dao层直接save到数据库即可
如果你爬下的是整个网页,这个好办,把它当做文件一样,用流 *** 作保存到电脑上即可。当然保存网页会遇到编码问题,这个很棘手。
档案系统初期算是告一段落了,利用一点时间继续爬取POI。和领导聊聊,受益匪浅。之前我的想法是爬取一份poi数据,直接能用;而领导听了之后,觉得更好的方式是爬取多个渠道来源的POI数据,然后做一个数据比较融合(最终事情能不能成不好说,但是经过这么一回,细节技术上有所提高,宏观把控整体项目流程能力有所长进,更重要的是通过和能人交流,以更高的眼界更宏观的看待数据、应用以及问题,这就是成长)。 我之前采用的方式,可以满足需求,但是POI数据获取效率差一些(虽然已经很快,但是相比本文这种还是慢一些)、数据现势性不好,高德数据和百度数据虽然是两套,但是仅仅是坐标不同(所以显然还是一套)。所以,我加一种方式来爬取百度poi。
一 调研: 百度API提供了一个叫Place API获取poi的接口,有个城市内检索 实例为
ce/v2/searchquery=银行&page_size=10&page_num=0&scope=1®ion=北京&output=json&ak={您的密钥}
它返回的是个json类型数据,一个区域最大返回数为400,每页最大返回数为20。显然一个城市内不管什么类别的poi,不可能只有400个,会遗漏数据,故舍去
还有一个矩形区域检索,实例为
ucom/place/v2/searchquery=美食&page_size=10&page_num=0&scope=1&bounds=39915,116404,39975,116414&output=json&ak={您的密钥}只要区域划分得当,这个可以使用
二 要解决的问题
1 区域划分
网上有人通过递归写代码的方式来划分,这样划分有问题,第一,划分的区域不能完全对应一个城市的市区;第二,算法设计比较麻烦。解决办法,后面详细说。
2 类别问题
百度API的接口必须要指定query的类别,那么如果类别指定不准,或者类别不全,根本无法完成爬取一个城市所有poi的任务。解决办法,说实话,这个问题在我做这件事情的时候,
十分棘手,不过我最终找到了这个网页
/indexphptitle=lbscloud/poitags,一切都不是问题了
三 整体流程
1 区域划分,2km2km的区域基本可以满足需求,获取每个区域的对角坐标(经纬度),逐行写入一个txt文本里
2 爬虫程序编写 读取1中的txt文本,逐行循环;调用百度API接口,爬取json;将爬取的数据存入数据库中; 每个类别跑一次程序
3 爬下的POI数据处理 poi显示,投影坐标转换,与地图叠加
后文将详细介绍流程
Scrapy-redis可以通过Redis数据库实现分布式爬虫,其天然具备断点续爬的功能。因为在使用Redis作为调度器和去重器时,所有的请求、URL队列和爬取过的数据都被存储在Redis数据库中,而Redis具有持久化存储的功能,因此在Scrapy-redis中实现断点续爬就非常简单了。只需要在重新启动爬虫之后,从Redis中加载上一次爬虫运行的状态,即可从上次停止的地方继续爬取数据。这种方式不仅可以保证爬虫的可靠性和稳定性,还可以提高爬虫的效率。
因为数据库柄插入 *** 作是次线程的,与主线程不同步,但是你传递给数据库柄的item 是引用传递,如果主线程中改变item的值了,那么次线程中的item也会改变,所以当数据库真正要插入第一条记录时,可能已经成了第三条记录了。
前面两条记录就没有了。
解决办法:将引用传递 修改成值传递,或者 生成多个item对象,每次yeild的item对象不是同一个。
MySQL
是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。
:《Python基础教程》
应用环境
与其他的大型数据库例如Oracle、DB2、SQLServer等相比,MySQL自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
MongoDB
是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
特点
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
面向集合存储,易存储对象类型的数据。
mongodb集群参考
模式自由。
支持动态查询。
支持完全索引,包含内部对象。
支持查询。
支持复制和故障恢复。
使用高效的二进制数据存储,包括大型对象(如视频等)。
自动处理碎片,以支持云计算层次的扩展性。
支持RUBY,PYTHON,JAVA,C,PHP,C#等多种语言。
文件存储格式为BSON(一种JSON的扩展)。
可通过网络访问。
对于程序员来说基本上不存在重复性的工作,任何重复劳动都可以通过程序自动解决。下面千锋带你一起了解爬虫需要哪些相关的技能。
1、基本的编码基础(至少一门编程语言)
这个对于任何编程工作来说都是必须的。基础的数据结构你得会吧。数据名字和值得对应(字典),对一些url进行处理(列表)等等。事实上,掌握的越牢固越好,爬虫并不是一个简单的工作,也并不比其他工作对编程语言的要求更高。
熟悉你用的编程语言,熟悉相关的框架和库永远是百益无害。我主要用Python,用Java写爬虫的也有,理论上讲任何语言都可以写爬虫的,不过最好选择一门相关的库多,开发迅速的语言。用C语言写肯定是自找苦吃了。
2、任务队列
当爬虫任务很大的时候,写一个程序跑下来是不合适的:
如果中间遇到错误停掉,重头再来?这不科学
我怎么知道程序在哪里失败了?任务和任务之间不应该相互影响
如果我有两台机器怎么分工?
所以我们需要一种任务队列,它的作用是:讲计划抓取的网页都放到任务队列里面去。然后worker从队列中拿出来一个一个执行,如果一个失败,记录一下,然后执行下一个。这样,worker就可以一个接一个地执行下去。也增加了扩展性,几亿个任务放在队列里也没问题,有需要可以增加worker,就像多一双亏筷子吃饭一样。
常用的任务队列有kafka,beanstalkd,celery等。
3、数据库
这个不用讲了,数据保存肯定要会数据库的。不过有时候一些小数据也可以保存成json或者csv等。我有时想抓一些就直接按照文件夹保存文件。推荐使用NoSQL的数据库,比如mongodb,因为爬虫抓到的数据一般是都字段-值得对应,有些字段有的网站有有的网站没有,mongo在这方面比较灵活,况且爬虫爬到的数据关系非常非常弱,很少会用到表与表的关系。
4、>
>
5、运维
这个话题要说的有很多,实际工作中运维和开发的时间差不多甚至更多一些。维护已经在工作的爬虫是一个繁重的工作。随着工作时间增加,一般我们都会学着让写出来的爬虫更好维护一些。
比如爬虫的日志系统,数据量的统计等。将爬虫工程师和运维分开也不太合理,因为如果一个爬虫不工作了,那原因可能是要抓的网页更新了结构,也有可能出现在系统上,也有可能是当初开发爬虫的时候没发现反扒策略,上线之后出问题了,也可能是对方网站发现了你是爬虫把你封杀了,所以一般来说开发爬虫要兼顾运维。
数据库使用较长一段时间后,因为一些增,删,改等 *** 作,使得数据的分布索引及相关数据会变得比较凌乱,从而影响数据库的效率。数据库重组即是将数据库的相关信息重新组织
数据库重组可分为:
①索引的重组
②单表的重组确
③表空间的重组
数据库重组是比较底层且比较费时的 *** 作,在重组时会停止前端业务,把数据库里表的数据放到磁盘的空闲空间上删除原有的表或索引,重建空的表或索引后,再把数据导入新表或索引中这个过程无误即数据库重组成功但也有导入数据失败的情况所以数据库重组的风险也比较大。
以上就是关于用爬虫从网站爬下的数据怎么存储全部的内容,包括:用爬虫从网站爬下的数据怎么存储、怎么使用python爬取百度网的数据、为什么说scrapy-redis天然具备断点续爬的功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)