使用scrapy,redis,mongodb实现的一个分布式网络爬虫

这个工程是对垂直搜索引擎中分布式网络爬虫的探索实现,它包含一个针对http://www.woaidu.org/ 网站的spider, 将其网站的书名,作者,书籍封面图片,书籍概要,原始网址链接,书籍下载信息和书籍爬取到本地: 分布式使用redis实现,redis中存储了工程的request,stats信息,能够对各个机器上的爬虫实现集中管理,这样可以解决爬虫的性能瓶颈,利用redis的高效和易于扩展能够轻松实现高效率下载:当redis存储或者访问速度遇到瓶颈时,可以通过增大redis集群数和爬虫集群数量改善。 底层存储实现了两种方式: 1、将书名,作者,书籍封面图片文件系统路径,书籍概要,原始网址链接,书籍下载信息,书籍文件系统路径保存到mongodb 中,此时mongodb使用单个服务器,对图片采用图片的url的hash值作为文件名进行存储,同时可以定制生成各种大小尺寸的缩略 图,对文件动态获得文件名,将其下载到本地,存储方式和图片类似,这样在每次下载之前会检查图片和文件是否曾经下载,对 已经下载的不再下载; 2、将书名,作者,书籍封面图片文件系统路径,书籍概要,原始网址链接,书籍下载信息,书籍保存到mongodb中,此时mongodb 采用mongodb集群进行存储,片键和索引的选择请看代码,文件采用mongodb的gridfs存储,图片仍然存储在文件系统中,在每次下载 之前会检查图片和文件是否曾经下载,对已经下载的不再下载; 避免爬虫被禁的策略:禁用cookie 实现了一个download middleware,不停的变user-aget 实现了一个可以访问google cache中的数据的download middleware(默认禁用) 调试策略的实现:将系统log信息写到文件中,对重要的log信息(eg:drop item,success)采用彩色样式终端打印文件,信息存储。 实现了FilePipeline可以将指定扩展名的文件下载到本地; 实现了MongodbWoaiduBookFile可以将文件以gridfs形式存储在mongodb集群中; 实现了SingleMongodbPipeline和ShardMongodbPipeline,用来将采集的信息分别以单服务器和集群方式保存到mongodb中。 访问速度动态控制:跟据网络延迟,分析出scrapy服务器和网站的响应速度,动态改变网站下载延迟,配置最大并行requests个数,每个域名最大并行请求个数和并行处理items个数。 爬虫状态查看:将爬虫stats信息(请求个数,文件下载个数,图片下载个数等)保存到redis中。 实现了一个针对分布式的stats collector,并将其结果用graphite以图表形式动态实时显示; mongodb集群部署:在commands目录下有init_sharding_mongodb.py文件,可以方便在本地部署。

项目的地址:https://github.com/gnemoug/distribute_crawler.git

爬虫运行状态graphite实时显示

爬虫运行终端截图

下载的图片截图

mongodb集群运行

数据mongodb存储

原文发布于微信公众号 - Python中文社区(python-china)

原文发表时间:2016-08-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏狂码一生

使用 Nginx 为 Linux 实例绑定多个域名

2504
来自专栏有趣的Python

8- Flask构建弹幕微电影网站-后台页面搭建后台页面搭建

已上线演示地址: http://movie.mtianyan.cn 项目源码地址:https://github.com/mtianyan/movie_proj...

4853
来自专栏微服务

Linux系统从安装开始

  已经很久很久没来得及写博客了,想想之前自己开始安装使用Linux系统的尝试,好像很简单!下面开始Linux系统的安装:这里推荐U盘安装   首先你必须下载一...

3907
来自专栏技术翻译

如何在微服务之间共享和同步代码

微服务架构非常适合构建可扩展的代码库,具有更少的耦合,更好的关注点分离,更高的弹性,结合不同的技术,最重要的是,更好的模块化和构建它的组件的可重用性。

3160
来自专栏知晓程序

不小心给了小程序「授权」,怎么撤回?| 小程序问答 #49

最常见的,大概就是请求「获取你的昵称、头像」。除此之外,当小程序想要使用你的地理位置、麦克风等的时候,也需要你的授权才能获取。

1432
来自专栏linux驱动个人学习

静态库和动态库的区别

什么是库? 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 所谓静态...

4129
来自专栏繁花云

私有git仓库gitlab搭建教程

最近比较无聊,想研究下gitlab,所以就尝试了一下centos7下面gitlab的搭建

1950
来自专栏Crossin的编程教室

如何安装 Python 的第三方模块

正所谓“人生苦短,我用 Python”。Python 的一大优势就是有丰富且易用的第三方模块,省去了大量重复造轮子的时间,节约了众多开发者的生命。对于已经熟悉 ...

2909
来自专栏jouypub

Linux流量复制工具

对于一些有并发要求的业务,特别是对接外部流量时,产品上线前一定要做的就是压力测试,但是常规的压力测试并不能覆盖所有情况。以gemeter、ab,、webbenc...

2461
来自专栏更流畅、简洁的软件开发方式

js的动态加载、缓存、更新以及复用(三)

总体思路 1、  建立一个js服务,该服务实现通用js文件的加载、依赖、缓存、更新以及复用。 2、  各个项目如果使用通用js,可(bi)以(xu)使用js服务...

4009

扫码关注云+社区

领取腾讯云代金券