新手问题 用其他爬虫工具 scrapy 采集的内容如何发布到 Rails 项目中呢?

keepeye · 2015年08月02日 · 最后由 nine 回复于 2015年08月05日 · 4482 次阅读

这是我论坛首贴,刚学 ruby 和 ror 半个月,现在想自己开发个项目练练手。

我是选择做一个小说站吧,先用 ror 快速搭了个架子,目前实现了分类、小说基本信息 (书名、作者、封面、介绍...) 两个模型。

第一阶段的打算是先从起点把小说基本信息采集下来录入数据库,大概一百多万部小说吧,之后再挂个常驻进程抓取每天更新的小说信息,并同步数据库。

现在爬虫我选择的 scrapy,一款 python 的异步网络爬虫吧,也是刚接触^^,爬虫规则部分已经写好了,现在的问题是如何入库,我想到的有两种方式:

1.在 scrapy 中 pipeline 中直接连接项目数据库,并进行读写操作。 2.在项目代码中暴露一个内部接口,scrapy 通过 http 协议将数据 post 到该接口,由 ror 统一进行入库操作。

方式 1 我觉得效率上要高,但要额外实现数据的验证。 方式 2 我觉得能保证数据的可靠性,但比较担忧其性能问题。

各位大婶以为如何是好呢?

楼主你如何解决 js 的结果,比如是使用浏览器可以看到结果,但是使用爬虫爬就是一个空白

headless browser

  1. 直接写数据库,过于暴力,容易搞坏线上系统,而且不方便变更数据库表类型,表名,ip 什么的
  2. 暴露接口直接 post 数据,容易导致爬虫性能缓慢,而且抓取下来的数据并没有备份到数据库

所以,爬虫的数据抓取到爬虫数据库吧,在 rails 里起一个定时任务,去读取爬虫数据,再去更新线上数据吧。这样也方便你更好的控制入库的细节

爬虫的数据量,直接写数据库好,否则会遇到性能问题。要快用 Redis 存。

可以在两边都做一个接口,ror 这边留一个更新小说基本信息和章节信息的,python 那边做一个取详细信息的。这样每次爬到新东西只更新章节信息就行了,不会有性能问题的。有读取阅读的时候,你再去通过接口取小说的章节内容什么的,取了后顺便缓存。

最好是用第二种,虽然我现在用的是第一种... 性能瓶颈不会有想象的那么多,从本地到本地 HTTP 的 POST 也不会影响带宽问题,

#7 楼 @netuser 我决定了,第一次采集数量比较多,也全是插入操作,就先用 python 直接写数据库。之后自动更新再改成 api 推送。

#3 楼 @keepeye 楼主,这东东的性能如何,不会引入到程序后,导致性能很差吧。

我有个项目是基于 padrino + scrapy 的 使用 padrino 的建好模型后,scrapy 中使用 peewee(ORM)建好相对应的模型,然后请采集到的数据入库就行了

爬虫数据以 json 格式插入 redis 一份(需要增量的话本地数据库需要有一份)

rake 任务 sleep n rpop redis,根据逻辑去重入库/更新

用 god 或 supervisor 持久 rake 脚本进程

#11 楼 @nine 这么做复杂了

scrapy 本身有去重功能,scrapy 本身也能以 daemon 的方式运行 (daemon 方式还很强大,详细看文档吧)

其实只要在 paser 里入库即可

#12 楼 @leopku 哦,我用的https://github.com/binux/pyspider,scrapy 我没用过,不知道他的去重和我的需求是否匹配。

直接入库的话耦合性太强,站点数量少的话还可以应付,长期运行的时候,有些目标站改版或反扒,有可能直接向 project 写入空白或不可预料的错误数据。 另外当 web 端模型改变的时候,rails/padrino 这边 migration 一下就搞定了,但是 scrapy 那边还是要去把对应模型修改一遍,容易出错。所以我选择了不直接入库,而是用统一格式的 json 在 redis 做中间层,逻辑由 rails 这边统一处理。

清空重爬的场景也会有很多。所以要求每个环节都可以停下来,单独 debug,而不影响其他。 事实上我后端的 rails project 也只是一个中间层,负责爬取数据的管理。而异步处理数据的 json 格式队列现在有 3 条。

爬虫、队列、总库、线上的项目都是分别部署,相互不会影响。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号