一般情况下
scrapy是这样的
![1bbad2ba72a863c5a7fb2552c1be8495.png](https://i-blog.csdnimg.cn/blog_migrate/539fce6b1dd4a4185b5c264d8d94e030.jpeg)
可以看到1、调度器 Scheduler 会调度 Requests 队列中的请求2、然后将每个请求交给下载器 Downloader 下载3、这时候就会得到相应的 item 数据交给 item Pipeline 处理
如果我们希望有多个爬虫
来爬取一个网站的数据
那么我们的请求队列就要共享而不能说都是 Request 队列要不然爬到的数据就都乱套了
![77239ad8156a99fa3b02b118577bb5e5.png](https://i-blog.csdnimg.cn/blog_migrate/75dd9b4624bc4c35c22037bcd76ff3ee.jpeg)
所以我们需要一个共享的队列
就比如说你希望一块蛋糕能被快速吃掉
你叫来了小明
可是小明只有一张嘴啊
于是你又叫来了他的 py 们小红和小紫
![e7236f5c7e6e4c0f3cd6a2dba64fe712.png](https://i-blog.csdnimg.cn/blog_migrate/946dee9bc5d21b357459fba04235b25c.jpeg)
但是你总不能说给他们每人各一块蛋糕吧
你是希望一块蛋糕被快速吃掉
你要他们 3 张嘴一起吃掉 同一块蛋糕
你把他们的嘴比作爬虫
把蛋糕比作要爬取的网站
是不是就比较容易理解了
![313f9978f2599aea8464765098806348.gif](https://i-blog.csdnimg.cn/blog_migrate/21e7c2174546a8ebc073e2c0b51b4cb6.gif)
那么多个爬虫如何共享一个请求队列以及如何搭建分布式部署爬虫呢
接下来就是学习 Python 的正确姿势
![88c54b6e383907acbb0ca1b6f1b5ba84.png](https://i-blog.csdnimg.cn/blog_migrate/40282680bdece62b3660f5bc3aa7a7c8.jpeg)
我们需要用到 redis 队列来共享
巧的是scrapy-redis这个库就可以使用 redis 队列
![f1c03637957f18a30221c32c728d95a8.png](https://i-blog.csdnimg.cn/blog_migrate/9fa5b73deb0211382570d63917da1261.jpeg)
在此之前我们先搞几台服务器一台用来搭建 redis一台用来搭建数据库再搞三台来运行爬虫
服务器买起
![e5c6003cdfa7d94e1123421c14107cd7.png](https://i-blog.csdnimg.cn/blog_migrate/59cd75612e6f42b1011afba8c9cc2fa7.jpeg)
别问我哪来这么多服务器
有钱任性(良心帅b喊起来)
![cfd9875431783b7ec5089ce264849fb8.png](https://i-blog.csdnimg.cn/blog_migrate/c60e8e178c1137fdc71aa469bc0d484f.jpeg)
服务器有了搭建起来呗先把 redis 装上
连接到 redis 服务器
![e7811b643e5ad808e8e7a4d9ba587184.png](https://i-blog.csdnimg.cn/blog_migrate/dacc380ab09515b5679deb7b371e5d62.jpeg)
下载 redis
![51152e61df62d9d982a46f5f6730d202.png](https://i-blog.csdnimg.cn/blog_migrate/957f7e322315dce89e36748da7d1e194.jpeg)
解压到 /usr/local 下
![360aba9d031befe23b41476a93c6ed8e.png](https://i-blog.csdnimg.cn/blog_migrate/c9a4b55fe0cae8d60c34b62d3239aaf9.jpeg)
解压完之后
进入
![fba77a931cf5f9ca9671142ab62ea852.png](https://i-blog.csdnimg.cn/blog_migrate/d9c126d956f4126658ae8c22e9e906bf.jpeg)
安装一波
![df51ea44d3313e1a264c8251c6779c89.png](https://i-blog.csdnimg.cn/blog_migrate/fffc47511bce70de4ea8247b99ee0322.jpeg)
安装完之后可以顺便复制一下 redis 所需的配置文件
![afde4e0bd78afd4f8c08dd8e3c7dee1c.png](https://i-blog.csdnimg.cn/blog_migrate/c43acde9b873e995a08c6210849fe8a0.jpeg)
接着进入 bin 目录
![a52ee2382ab82bfc170f6f6f5d39c91c.png](https://i-blog.csdnimg.cn/blog_migrate/2b0834f98b383e1cc32dad54973fb15f.jpeg)
启动 redis
![869a00b6844df09d154636c52226cef1.png](https://i-blog.csdnimg.cn/blog_migrate/e757d526d6e118aa0de5fd950e9d1c66.jpeg)
没毛病
使用本地连接一下
![26b1e2657ef8877e1e5a23bd2049c806.png](https://i-blog.csdnimg.cn/blog_migrate/71ddc6c7f77a11d161952939d1094eb8.jpeg)
恩~连上了
![5521afc9873f48980a463f2626a802db.png](https://i-blog.csdnimg.cn/blog_migrate/a32011aef7fc3febee223bf1559922d9.jpeg)
redis 搭建完
接着我们来搭建数据库的服务器把 MongoDB 给装上
先连接到数据库的服务器上
![2254b32bf92c0d28d5504b9ae6c70fc2.png](https://i-blog.csdnimg.cn/blog_migrate/cd7f5bc46f9f048094da884fa68bdcc6.jpeg)
下载 mongoDB
![649c756a07f6e886afad5fb1cafce116.png](https://i-blog.csdnimg.cn/blog_migrate/f398e51158d3f4a980467771f48a575b.jpeg)
解压一波
![53c6cd856a3bc8aa44912b579f26b5fb.png](https://i-blog.csdnimg.cn/blog_migrate/d980f2688e1de0abb31e8fca03cbba31.jpeg)
把解压下来的文件夹
轻轻的移动一下位置
![befd01a7a3aefaa378bfa2a76d7d1da2.png](https://i-blog.csdnimg.cn/blog_migrate/488421d5814747d36beed7670c5bacc1.jpeg)
创建个 db 文件夹
![371471204facab2d4160f35a4c44b0fb.png](https://i-blog.csdnimg.cn/blog_migrate/69dda9cf78f457916b50b9ad6fd7a8da.jpeg)
开启 mongodb
这里顺便把 bind_ip 设置一下
这样才能被远程访问
![7e484186268d155967f6970110474436.png](https://i-blog.csdnimg.cn/blog_migrate/01d6bf5d4eb27bcaabe2ce02d327e924.jpeg)
往下拉可以看到
mongoDB 监听的是 27017 端口
说明安装和启动成功
![5b2251c611ba822e5cfe1f1b4d7b3332.png](https://i-blog.csdnimg.cn/blog_migrate/edf889e88e2cdf61d568639bd008e8d1.jpeg)
使用本地连接试试
![32f27d1886c8cf501db81e5bf1f6fef4.png](https://i-blog.csdnimg.cn/blog_migrate/b1a454634be9878ed453af1cf12377d6.jpeg)
可以可以
![98f771d8260df28c22650ed95694e1ed.png](https://i-blog.csdnimg.cn/blog_migrate/4ab85cca65440457c4aa203d63bca0c3.jpeg)
接着我们需要在
爬虫服务器安装 Python3 环境
![bc91de9ba82cdd5e60c3ee151bfe74f8.png](https://i-blog.csdnimg.cn/blog_migrate/57d3b3bcfaf1000eaba3d9c984a390ed.jpeg)
![d75f05c34acc75c478f0f9db1eb2a941.png](https://i-blog.csdnimg.cn/blog_migrate/9390db08a024c47fce63e9fcecaf6979.jpeg)
slave-02 和 slave-03 服务器
同上安装 python3
![e3c1380a85aa95a3339f03adb5a08155.png](https://i-blog.csdnimg.cn/blog_migrate/7cce60d795a1be35cdd53986af780a43.jpeg)
ok
环境搭起来了
![d8fc859db277662b7450f73691338815.png](https://i-blog.csdnimg.cn/blog_migrate/ec10b9718cf5f24ee4ac9172b49a6752.jpeg)
回到我们之前写的代码
使用 scrapy 爬取 stackoverflow 上的所有 Python 问答
我们把它改成适用分布式的
将 Pipeline 中的数据库地址配置成
我们创建的 mongodb 数据库地址
![c742cd95b4d238cc79df533be55f09d5.png](https://i-blog.csdnimg.cn/blog_migrate/db7f674c7a34e317a4e60d214c9ece2f.jpeg)
接着在 setting 中配置
redis 调度和去重
![f163cffaa7d8406a6437c11fc18f4ddb.png](https://i-blog.csdnimg.cn/blog_migrate/fac25e26371ee41dfadcc5d5acae4ead.jpeg)
再设置一下延迟访问
![281e6aa8f951212dfed9b65ebfc9b9e1.png](https://i-blog.csdnimg.cn/blog_migrate/88ba9282487b0f1bb25b3210f009ca0b.jpeg)
搞完了之后
将虚拟环境中的库打包一下
![a3736ab387f0254091a4dc93df9ed82d.png](https://i-blog.csdnimg.cn/blog_migrate/69fa62a21cb16b419a7faac1dc278358.jpeg)
![cb6e38e97aa101399e1cc7f46d417eb0.png](https://i-blog.csdnimg.cn/blog_migrate/bcafdc9081f3fccbfaf3952f1bfda6f3.jpeg)
接着把项目
都扔到爬虫服务器上去
![feaa6aefaaf290418d2d8338b9b30247.png](https://i-blog.csdnimg.cn/blog_migrate/c58afad2deb463e1000b5f306f11984c.jpeg)
连接到爬虫服务器
可以看到刚刚传来的文件
![ebfe038c1a38142c555086d5959d766e.png](https://i-blog.csdnimg.cn/blog_migrate/2b981ce5c505723b3e640a15d5aa2df7.jpeg)
把刚刚在虚拟环境中
生成的第三方库列表
在服务器上一顿安装
![584c06e2865169306051c40ba8625d60.png](https://i-blog.csdnimg.cn/blog_migrate/40e47630f00b807554eda1d644b99531.jpeg)
其它两台爬虫服务器
和上面一样安装所需要的库
都安装完之后
就终于可以都 TM 跑起来了
![bfea5f6bd4d18d3e0755b614884e9c3c.png](https://i-blog.csdnimg.cn/blog_migrate/742592004d303fab6665e4f26ccec072.jpeg)
所有的爬虫
都特么给我跑起来
![271e65f2edea34a6cbb711e4f971b0b9.png](https://i-blog.csdnimg.cn/blog_migrate/58cc01fe9b87aa3c7d1e277df671b42c.jpeg)
哈哈哈哈哈
4台机器开始一顿爬取
![4e113af4ab9214f6e39d9627d4cce9cc.png](https://i-blog.csdnimg.cn/blog_migrate/999ea10dbffbf8c58ec6a59575acefc6.jpeg)
可以看到 mongodb 都监听到了
这几台服务器的连接了
![bdc044e7259509e4d11a9b0eb137cef3.png](https://i-blog.csdnimg.cn/blog_migrate/fad5a8fab115e65c67d3eecc893bce3d.jpeg)
我们连到 redis 看看
![74ef4bd325502563f4b84f12286ff232.png](https://i-blog.csdnimg.cn/blog_migrate/e3809f3c068595cf93b0b9aac1150120.jpeg)
可以看到
redis 在调度着请求的消息队列
以及过滤重复的请求
再连接到 mongodb 看看
![72f8feda4ffaecbe799b671949b5fa78.png](https://i-blog.csdnimg.cn/blog_migrate/f07593a9cc91bde1a2034a493a332aec.jpeg)
![b1f5430108737cf7928728976e090f0f.png](https://i-blog.csdnimg.cn/blog_migrate/73b9d088437f5cdbbc03921a493240e4.jpeg)
小帅b每隔一小会就查询一下
爬取下来的数量
可以看到
速度还是可以的
![1b782654d2352af2347df9b38cb1f579.gif](https://i-blog.csdnimg.cn/blog_migrate/3357657dfb34b547012779faed6e6257.gif)
ok
以上就是分布式爬虫的
搭建及部署的过程了
当然了
数据库还可以搭建一下集群
数据库之间的连接最好设置账户
进行安全访问等
主要还是让你了解这个过程中
分布式爬虫的搭建和使用
以及体会它的可扩展性和高效性
那么咱们就到这里了
我们下回见,peace
![31c2b733fb55e78fd7c4701046431320.gif](https://i-blog.csdnimg.cn/blog_migrate/66190f83f52583d0bf17bf9f13008051.gif)
扫一扫学习 Python 没烦恼
![55b53d613531a5ef6f8c74c4fd6a2006.png](https://i-blog.csdnimg.cn/blog_migrate/fd5beaa3e12cd7c5a63471b285c46550.jpeg)
阅读原文