scrapy分布式碰到的一些问题和解决方案

在这里插入图片描述

1. scrapy多个items类piplines如何分别存储

简书,用if isinstance(item, items.py里面的类)进行判断就可以了。

2. Linux安装Scrapy

linux: ubuntu16.04-64bit
python: 3.5.2

2.1 安装环境

sudo apt-get install build-essential
sudo apt-get install python3-dev
sudo apt-get install libxml2-dev
sudo apt-get install libxslt1-dev
sudo apt-get install python3-setuptools

sudo apt-get install libssl-dev
apt-get install libffi-dev

2.2 安装Scrapy: [scrapy运行必备组件需要(OpenSSL, lxml(lxml一般默认有安装,可以import xml验证是否有安装))]

sudo python3 -m pip install Scrapy

2.3 安装OpenSSL:

sudo python3 -m pip install pyopenssl

2.4 重新安装python3版本的这两个软件:

sudo apt-get install python3-dev
sudo apt-get install python3-setuptools

2’ 教学视频讲解的安装的方法

2.1 安装操作系统级的配置

sudo apt-get install python3-dev build-essential python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
如果出错 unable to fetch some archieve,maybe run apt-get update or...,可能太旧了,更新下 
su
apt-get update
再运行命令

2.2 安装项目依赖的包

windows写好的scrapy文件

cmd到文件目录
将安装的包都冻结,重定向到项目下的requirements.txt文件中
pip freeze > requirements.txt

2.3 xshell读取包内容

sz
rz 
找到文件传输
安装包
pip install virtualenvwrapper
mkvirtualenv -p /usr/bin/python3 crawler-env # 自己写的虚拟环境名字
创建虚拟环境后自动进入
pip install -r requirements.txt 
一次性把依赖的包全部安装完成
会报错找不到pywin32包,进入文件删掉这个包就可以了,再安装就可以

3. xshell服务器拒绝密码

想着可能自己忘记密码了,答案见3.1,都是泪
参考百度知道
问题解决不了,没办法卸载重新安装
答案:通过看YouTube视频,解决了该问题,原来用户名和密码都是自己在Ubuntu设的,蠢哭了><

4. 切换root显示su:认证失败

sudo passwd
更新密码
重新执行就好了

5. pip install virtualenvwrapper出错

错误类型:/usr/bin/pip: 行 11: 未预期的符号 __main__._main' 附近有语法错误 /usr/bin/pip: 行 11: sys.exit(main._main())’

解决方法:获得root权限

python3 -m pip install xxxx

安装完

root@wangjinliang-virtual-machine:~# vim .bashrc
root@wangjinliang-virtual-machine:~# source ~/.bashrc
/usr/bin/python: No module named virtualenvwrapper
virtualenvwrapper.sh: There was a problem running the initialization hooks.

If Python could not import the module virtualenvwrapper.hook_loader,
check that virtualenvwrapper has been installed for
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python and that PATH is
set properly.

python安装位置 /usr/bin
vitualenvwrapper /usr/local/lib/python3.5/dist-packages
进入虚拟环境步骤:

source ~/.bashrc
mkvirtualenv -p /usr/bin/python3 crawler-env
sz
rz
pip install -r requirements.txt

6.mkvirtualenv:未找到命令

先尝试下切换成root,输入之前的命令,如果不行,再尝试以下方法
1.升级python包管理工具pip

pip install --upgrade pip备注:当你想升级一个包的时候 pip install --upgrade 包名

2.python虚拟环境安装

sudo apt-get install python-virtualenvsudo easy_install virtualenvwrapper

上述工具装好后找不到mkvirtualenv命令,需要执行以下环境变量设置。

1.创建目录用来存放虚拟环境 mkdir \$HOME/.virtualenvs
2.在~/.bashrc中添加行:

export WORKON_HOME=$HOME/.virtualenvs    
source /usr/local/bin/virtualenvwrapper.sh

3.运行: source ~/.bashrc

3.创建python虚拟环境

mkvirtualenv [虚拟环境名称]workon [虚拟环境名称]

4.退出虚拟环境 离开 deactivate

6.2 windows虚拟环境的安装和配置

挖坑待填

7.改造为scrapy-redis

7.1 在spider里面修改

from scrapy_redis.spiders import RedisSpider
class SfwSpider(RedisSpider):

7.2 将爬虫的start_urls删掉,增加redis_key=“xxx”

redis_key作用就是在redis中控制爬虫启动,爬虫的第一个url就是在redis中通过这个发送的

    # start_urls = ['http://www.fang.com/SoufunFamily.htm']
    redis_key = "fang:start_urls"

7.3 修改配置文件

7.3.1 网络上搜集得到的
#启用Redis调度存储请求队列

SCHEDULER="scrapy_redis.scheduler.Scheduler"

#确保所有的爬虫通过Redis去重

DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"

#默认请求序列化使用的是pickle 但是我们可以更改为其他类似的。PS:这玩意儿2.X的可以用。3.X的不能用

#SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"

#不清除Redis队列、这样可以暂停/恢复 爬取

#SCHEDULER_PERSIST = True

#使用优先级调度请求队列 (默认使用)

#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'

#可选用的其它队列

#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'

#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'

#最大空闲时间防止分布式爬虫因为等待而关闭

#SCHEDULER_IDLE_BEFORE_CLOSE = 10

#将清除的项目在redis进行处理

ITEM_PIPELINES={

'scrapy_redis.pipelines.RedisPipeline':300

}

#序列化项目管道作为redis Key存储

#REDIS_ITEMS_KEY = '%(spider)s:items'

#默认使用ScrapyJSONEncoder进行项目序列化

#You can use any importable path to a callable object.

#REDIS_ITEMS_SERIALIZER = 'json.dumps'

#指定连接到redis时使用的端口和地址(可选)

#REDIS_HOST = 'localhost'

#REDIS_PORT = 6379

#指定用于连接redis的URL(可选)

#如果设置此项,则此项优先级高于设置的REDIS_HOST 和 REDIS_PORT

#REDIS_URL = 'redis://user:pass@hostname:9001'

#自定义的redis参数(连接超时之类的)

#REDIS_PARAMS  = {}

#自定义redis客户端类

#REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'

#如果为True,则使用redis的'spop'进行操作。

#如果需要避免起始网址列表出现重复,这个选项非常有用。开启此选项urls必须通过sadd添加,否则会出现类型错误。

#REDIS_START_URLS_AS_SET = False

#RedisSpider和RedisCrawlSpider默认 start_usls 键

#REDIS_START_URLS_KEY = '%(name)s:start_urls'

#设置redis使用utf-8之外的编码

#REDIS_ENCODING = 'latin1'
7.3.2 实践中需要的
# Scrapy-Redis相关的配置:
# 确保request存储到redis中
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 确保所有爬虫共享相同的去重指纹
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 设置redis为item pipeline
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300
}
#不清除Redis队列、这样可以暂停/恢复 爬取
SCHEDULER_PERSIST = True

# 设置链接redis信息
REDIS_HOST = '192.168.252.1'
REDIS_PORT = 6379

7.4

项目打包,Linux虚拟环境下解包,

sz rz 

进入spider目录

scrapy runspider sfw

开始监听状态
主机打开redis-cli
推入一个开始的url链接

λ redis-cli
127.0.0.1:6379> lpush fang:start_urls http://www.fang.com/SoufunFamily.htm

8.redis

8.1 Linux的redis下载

下载地址
官网直接有下载安装步骤
或者观看菜鸟教程

8.2 配置其他机器连接本机

8.2.1 视频教学得到

需要修改本机的redis.conf的配置文件,将bind改为bind[自己的ip地址或者0.0.0.0]
注意:bind的是本机网卡的ip地址,而不是想让其他机器连接的ip地址。
redis.conf
如何扎到Ubuntu的redis.conf
slave端无需启动redis-server,Master端启动即可。只要slave端取到Master的redis数据库,就表示连接成功,可以分布式。

8.2.2下边是自己实践:

老是报错:Redis protected-mode 配置文件没有真正启动

  • 查看主机和虚拟机能否互相ping通,最开始自己忽略了,主机能ping通虚拟机,但是虚拟机ping不通主机
    解决方案: windows的防火墙没有打开ICMPv4-in这个规则,防火墙→高级→入站规则→配置文件类型为“公用”的“文件和打印共享(回显请求 – ICMPv4-In)”规则,设置为允许。
  • 修改主机的redis.conf 进入文件sudo vim /etc/redis/redis.conf
    • bind 127.0.0.1改为 #bind 127.0.0.1
    • protected-mode yes 改为 protected-mode no
    • 加入 daemonize no(这个是是否在后台启动不占用一个主程窗口)
    • 如果需要设置密码,requirepass foobared修改个强度高的密码
  • 启动服务的时候需要将配置文件作为参数,例如:
D:\pythonic\redis
    λ redis-server.exe redis.windows.conf

9.离线后重启

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值