scrapy简单分布式爬虫
经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得。
虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘。有能人改变了scrapy的队列调度,将起始的网址从start_urls里分离出来,改为从redis读取,多个客户端可以同时读取同一个redis,从而实现了分布式的爬虫。就算在同一台电脑上,也可以多进程的运行爬虫,在大规模抓取的过程中非常有效。
准备:
1、windows一台(从:scrapy)
2、linux一台(主:scrapy\redis\mongo)
ip:192.168.184.129
3、python3.6
linux下scrapy的配置步骤:
、安装python3. yum install openssl-devel -y 解决pip3不能使用的问题(pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available) 下载python软件包,Python-3.6..tar.xz,解压后 ./configure --prefix=/python3 make make install 加上环境变量: PATH=/python3/bin:$PATH:$HOME/bin export PATH 安装完成后,pip3默认也已经安装完成了(安装前需要先yum gcc) 、安装Twisted 下载Twisted-17.9..tar.bz2,解压后 cd Twisted-17.9., python3 setup.py install 、安装scrapy pip3 install scrapy pip3 install scrapy-redis
、安装redis 见博文redis安装与简单使用
错误:You need tcl 8.5 or newer in order to run the Redis test
、wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz 、tar -xvf tcl8.6.1-src.tar.gz
、cd tcl8.6.1/unix ; make; make install
cp /root/redis-3.2.11/redis.conf /etc/
启动:/root/redis-3.2.11/src/redis-server /etc/redis.conf &
、pip3 install redis
、安装mongodb 参考菜鸟教程:http://www.runoob.com/mongodb/mongodb-linux-install.html
启动:# mongod --bind_ip 192.168.184.129 &
、pip3 install pymongo
windows上scrapy的部署步骤:
、安装wheel
pip install wheel
、安装lxml
https://pypi.python.org/pypi/lxml/4.1.0
、安装pyopenssl
https://pypi.python.org/pypi/pyOpenSSL/17.5.0
、安装Twisted
https://www.lfd.uci.edu/~gohlke/pythonlibs/
、安装pywin32
https://sourceforge.net/projects/pywin32/files/
、安装scrapy
pip install scrapy
部署代码:
我以美剧天堂的电影爬取为简单例子,说一下分布式的实现,代码linux和windows上各放一份,配置一样,两者可同时运行爬取。
只列出需要修改的地方:
settings
设置爬取数据的存储数据库(mongodb),指纹和queue存储的数据库(redis)
ROBOTSTXT_OBEY = False # 禁止robot
CONCURRENT_REQUESTS = # scrapy调试queue的最大并发,默认16
ITEM_PIPELINES = {
'meiju.pipelines.MongoPipeline': ,
}
MONGO_URI = '192.168.184.129' # mongodb连接信息
MONGO_DATABASE = 'mj'
SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 使用scrapy_redis的调度
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 在redis库中去重(url)
# REDIS_URL = 'redis://root:kongzhagen@localhost:6379' # 如果redis有密码,使用这个配置
REDIS_HOST = '192.168.184.129' #redisdb连接信息
REDIS_PORT =
SCHEDULER_PERSIST = True # 不清空指纹
piplines
存储到MongoDB的代码
import pymongo class MeijuPipeline(object):
def process_item(self, item, spider):
return item class MongoPipeline(object): collection_name = 'movies' def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db @classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
) def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db] def close_spider(self, spider):
self.client.close() def process_item(self, item, spider):
self.db[self.collection_name].insert_one(dict(item))
return item
items
数据结构
import scrapy class MeijuItem(scrapy.Item):
movieName = scrapy.Field()
status = scrapy.Field()
english = scrapy.Field()
alias = scrapy.Field()
tv = scrapy.Field()
year = scrapy.Field()
type = scrapy.Field()
爬虫脚本mj.py
# -*- coding: utf- -*-
import scrapy
from scrapy import Request class MjSpider(scrapy.Spider):
name = 'mj'
allowed_domains = ['meijutt.com']
# start_urls = ['http://www.meijutt.com/file/list1.html']
def start_requests(self):
yield Request(url='http://www.meijutt.com/file/list1.html', callback=self.parse) def parse(self, response):
from meiju.items import MeijuItem
movies = response.xpath('//div[@class="cn_box2"]')
for movie in movies:
item = MeijuItem()
item['movieName'] = movie.xpath('./ul[@class="list_20"]/li[1]/a/text()').extract_first()
item['status'] = movie.xpath('./ul[@class="list_20"]/li[2]/span/font/text()').extract_first()
item['english'] = movie.xpath('./ul[@class="list_20"]/li[3]/font[2]/text()').extract_first()
item['alias'] = movie.xpath('./ul[@class="list_20"]/li[4]/font[2]/text()').extract_first()
item['tv'] = movie.xpath('./ul[@class="list_20"]/li[5]/font[2]/text()').extract_first()
item['year'] = movie.xpath('./ul[@class="list_20"]/li[6]/font[2]/text()').extract_first()
item['type'] = movie.xpath('./ul[@class="list_20"]/li[7]/font[2]/text()').extract_first()
yield item
for i in response.xpath('//div[@class="cn_box2"]/ul[@class="list_20"]/li[1]/a/@href').extract():
yield Request(url='http://www.meijutt.com' + i)
# next = 'http://www.meijutt.com' + response.xpath("//a[contains(.,'下一页')]/@href")[].extract()
# print(next)
# yield Request(url=next, callback=self.parse)

看一下redis中的情况:

看看mongodb中的数据:

scrapy简单分布式爬虫的更多相关文章
- 纯手工打造简单分布式爬虫(Python)
前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...
- scrapy进行分布式爬虫
今天,参照崔庆才老师的爬虫实战课程,实践了一下分布式爬虫,并没有之前想象的那么神秘,其实非常的简单,相信你看过这篇文章后,不出一小时,便可以动手完成一个分布式爬虫! 1.分布式爬虫原理 首先我们来看一 ...
- Scrapy 框架 分布式 爬虫
分布式 爬虫 scrapy-redis 实现 原生scrapy 无法实现 分布式 调度器和管道无法被分布式机群共享 环境安装 - pip install scrapy_redis 导包:from sc ...
- 16 Scrapy之分布式爬虫
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- scrapy补充-分布式爬虫
spiders 介绍:在项目中是创建爬虫程序的py文件 #1.Spiders是由一系列类(定义了一个网址或一组网址将被爬取)组成,具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. #2.换句 ...
- Python简单分布式爬虫
分布式爬虫采用主从模式.主从模式是指由一台主机作为控制节点,负责管理所有运行网络爬虫的主机(url管理器,数据存储器,控制调度器),爬虫只需要从控制节点哪里接收任务,并把新生成任务提交给控制节点.此次 ...
- 基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL
为了学习机器学习深度学习和文本挖掘方面的知识,需要获取一定的数据,新浪微博的大量数据可以作为此次研究历程的对象 一.环境准备 python 2.7 scrapy框架的部署(可以查看上一篇博客的简 ...
- 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询
第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...
- 四十四 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询
1.elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内 ...
随机推荐
- 没有安装hiredis
在redis的发行包中的deps目录中就包含hiredis的源码,手动编译安装,或者自行下载一份.地址:hiredis的地址 cd /deps/hiredis make make install 然后 ...
- [每天解决一问题系列 - 0010] ADB Not Responding - Android Studio
问题描述: 最近安装了Android Studio v1.0,运行的时候老是这个错误 解决方案: 网上有人说是已经有adb的进程在运行,可是打开任务管理器,找不到对应的adb 进程. 无奈之下,想到a ...
- MobaXterm不能读取C:\Windows\system32作为系统变量
OS环境:Win7 pro x64 已勾选:Settings-->Terminal-->勾选Use Windows PATH environment 然后在MobaXterm中查看系统变量 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十五):系统服务监控
系统服务监控 新建监控工程 新建Spring Boot项目,取名 kitty-monitor,结构如下. 添加项目依赖 添加 spring boot admin 的相关依赖. pom.xml < ...
- 分布式系统CAP理论以及注册中心选择
CAP定理:指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可同时获得. 一致性(C-数据 ...
- Adam
Adam 方法 Adam 方法将惯性保持和环境感知这两个优点集于一身.一方面, Adam 记录梯度的一阶矩(first moment),即过往梯度与当前梯度的平均,这体现了惯性保持:另一方面,Adam ...
- visual studio code (vsc)中查看 php 数组的全部元素
在 vsc 调试 php 时,如果数组元素过多,只能查看前面 30个左右的元素,如果需要看更多的元素,可以配置 xDebugSettings 修改项目中的 .vscode/launch.json 文件 ...
- leetcode — letter-combinations-of-a-phone-number
import java.util.*; /** * Source : https://oj.leetcode.com/problems/letter-combinations-of-a-phone-n ...
- 【jQuery源码】整体架构
jQuery源码可以精简为以下内容: 方框上面的代码根据Jq注释我们可以知道是对AMD规范的支持. jQuery整体上被包裹在一个匿名函数中,这个匿名函数再作为另一个匿名函数的参数被传入,形参fact ...
- 朴素贝叶斯分类器及Python实现
贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据 ...