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