使用Scrapyd部署爬虫

为什么要用Scrapyd? Scrapyd是scrapinghub官方提供的爬虫管理、部署、监控的方案之一,另一个是Scrapy Cloud。 官方对它的定义是 Scrapy Doc

Scrapyd is an application for deploying and running Scrapy spiders. It enables you to deploy (upload) your projects and control their spiders using a JSON API.

Scrapyd是一个部署和运行Scrapy爬虫的应用程序。它使你能够通说JSON API部署(上传)工程,并且控制工程中的爬虫。

如果你像我一样受够了笨笨地手动启动爬虫,洋气点儿叫manully (-__-)b

scrapy crawl SPIDER_NAME

并且对多个爬虫的多进程运行、负载均衡等伤透了脑筋,那么Scrapyd是你的救星,快跟我一起使用吧!
最后,等项目完善了,我们把它部署到Scrapy Cloud上去,然后沏杯茶静静地看着爬虫爬呀爬……o()o


首先解决依赖

Python 2.6 or above
Twisted 8.0 or above
Scrapy 0.17 or above

然后安装,这里我推荐使用pip。虽然我的部署环境是Ubuntu。但是我习惯使用pip安装并管理Python依赖,而不是apt-get。当然你也可以全部使用apt-get。最忌讳的是pip和apt-get混用,管理起来你一定会奔溃的,相信我。

pip install scrapyd

运行Scrapyd服务

scrapyd

默认情况下Scrapyd监听0.0.0.0:6800端口,可以访问http://localhost:6800/查看。
如果你像我一样将Scrapyd安装在服务器上,并且还没有设置过验证方法,可以将localhost替换为服务器外网IP地址,同样可以查看。
Warning: 危险!
我通过SSH远程登陆服务器工作。
为了防止SSH中断连接使远程进程终止,推荐使用Screen管理每一条需要保持运行的命令,包括Scrapyd。Screen是Linux下的SSH远程会话管理工具,必备神器!

screen -S scrapyd (启动一个新会话,名字选你喜欢的,我习惯用进程名,在这里是scrapyd)

然后为了让这个会话保持不退出,使用快捷键

CTRL + A + D

同时按这四个键你会回到screen命令之前的终端。
可以查看当前所有screen

screen -ls

以后要想回到我们用启动的会话

screen -r scrapyd

为所欲为吧!
再也不用担心终端进程意外怀孕,哦不,意外退出了!

但是#

生产环境部署scrapyd服务的话要使用更专业的进程管理工具,例如Supervisor,参考


部署Scrapy项目
难道又要像我之前一样蠢萌蠢萌地manully deploy?(-__-)b
Of course NOT!(●’◡’●)
官方推荐使用scrapyd-deploy tool–scrapyd-client
安装

pip install scrapyd-client

之后我们就可以使用一个超方便的scrapyd-deploy命令了。
该命令通过读取scrapy项目目录下的配置文件scrapy.cfg来获取项目信息。
每一个scrapy.cfg对于scrapyd来说都是一个target。所以我们需要先编辑scrapy.cfg文件

[deploy:NAME]

如果你只有一个deploy配置那么可以不写NAME
但是如果你需要在多个远程服务器或者多个scrapyd进程上部署的话
应该为不同的deploy命名,方便部署。
Python 2.6 or above

Twisted 8.0 or above
Scrapy 0.17 or above

然后安装,这里我推荐使用pip。虽然我的部署环境是Ubuntu。但是我习惯使用pip安装并管理Python依赖,而不是apt-get。当然你也可以全部使用apt-get。最忌讳的是pip和apt-get混用,管理起来你一定会奔溃的,相信我。
shell pip install scrapyd
运行Scrapyd服务
shell scrapyd
默认情况下Scrapyd监听0.0.0.0:6800端口,可以访问http://localhost:6800/查看。
如果你像我一样将Scrapyd安装在服务器上,并且还没有设置过验证方法,可以将localhost替换为服务器外网IP地址,同样可以查看。
Warning: 危险!
我通过SSH远程登陆服务器工作。
为了防止SSH中断连接使远程进程终止,推荐使用Screen管理每一条需要保持运行的命令,包括Scrapyd。Screen是Linux下的SSH远程会话管理工具,必备神器!
shell screen -S scrapyd (启动一个新会话,名字选你喜欢的,我习惯用进程名,在这里是scrapyd)
然后为了让这个会话保持不退出,使用快捷键

CTRL + A + D

同时按这四个键你会回到screen命令之前的终端。
可以查看当前所有screen
shell screen -ls
以后要想回到我们用启动的会话
shell screen -r scrapyd
为所欲为吧!
再也不用担心终端进程意外怀孕,哦不,意外退出了!

但是#

生产环境部署scrapyd服务的话要使用更专业的进程管理工具,例如Supervisor,参考


部署Scrapy项目
难道又要像我之前一样蠢萌蠢萌地manully deploy?(-__-)b
Of course NOT!(●’◡’●)
官方推荐使用scrapyd-deploy tool–scrapyd-client
安装
shell pip install scrapyd-client
之后我们就可以使用一个超方便的scrapyd-deploy命令了。
该命令通过读取scrapy项目目录下的配置文件scrapy.cfg来获取项目信息。
每一个scrapy.cfg对于scrapyd来说都是一个target。所以我们需要先编辑scrapy.cfg文件

[deploy:NAME]

如果你只有一个deploy配置那么可以不写NAME
但是如果你需要在多个远程服务器或者多个scrapyd进程上部署的话
应该为不同的deploy命名,方便部署。
查看当前项目下的所有配置文件可以用命令

scrapyd-deploy -l

url = http://localhost:6800/
project = PROJECT_NAME

用于验证登陆scrapyd服务器,如果scrapyd没做验证,那么为空(默认不做验证,生产环境必须加验证!)
username = user
password = passwd

scrapyd-deploy [deploy_name]

deploy_name对应上述配置文件中的配置名
如果你没有为配置命名那么可以为空,表示使用默认配置,默认配置名为default

使用API
启动一个爬虫

curl http://localhost:6800/schedule.json -d project=PROJECT_NAME -d spider=SPIDER_NAME

停止一个爬虫

curl http://localhost:6800/cancel.json -d project=PROJECT_NAME -d job=JOB_ID

JOB_ID可以很方便地从web控制台获得

其他更多API

前文配置文件里我们提到了scrapd通过http验证登陆,可是遗憾的是截至发文,scrapyd本身是不支持的。参考
我知道你打不开Google的链接,(●ˇ∀ˇ●)
大体摘录如下

The authentication is for deploying the code, not for accesing the UI.Also, even though “scrapy deploy” does support using HTTP auth, Scrapyd doesn’tsupport it yet. To add HTTP auth to Scrapyd you need to host it behind a proxythat provides the auth.

可行的解决方案是将scrapyd服务挂在ngix后,让ngix负责验证工作。
参考ngix配置如下

# Scrapyd local proxy for basic authentication.
# Don't forget iptables rule.
# iptables -A INPUT -p tcp --destination-port 6800 -s ! 127.0.0.1 -j DROP

server {
        listen 6801;

        location ~ /.ht {
                deny all;
        }

        location / {
                proxy_pass            http://localhost:6800/;
                auth_basic            "Restricted";
                auth_basic_user_file  /etc/nginx/conf.d/.htpasswd;
        }
}

利用scrapinghub发布你的爬虫项目

用scrapy框架写了一个爬虫项目,想发布到线上让他自动执行,搜索了一下,发现有个叫scrapinghub的平台,可以免费发布scrapy项目,所以就来试一下。

注册scrapinghub账号并登陆

直接打开scrapinghub注册,这里没什么说的。

[图片上传失败…(image-242868-1542818498384)]

可以直接用Google账号或者GitHub账号登陆,我就选择GitHub登陆啦~
登录之后是这样的,是空的,没有项目:

[图片上传失败…(image-b3325e-1542818498384)]

我们点击右上角的Create Project来创建一个Project,这里和GitHub类似。

创建空的项目

[图片上传失败…(image-3f6be4-1542818498384)]

这里Organization已经填好了,用GitHub账号登陆的话,这里就是你的GitHub昵称,其他账号登录的应该类似。
Name这里就随便填写一个名称就好了,主要是为了方便以后的project管理。
项目类型就选Scrapy,那个Portia我还没去了解它到底是干啥的。弄好了之后就点Create。

[图片上传失败…(image-e67d3-1542818498384)]

创建好了之后,我们会得到一个空的project,里面是没有代码的,接下来需要将写好的scrapy爬虫放进去,这里和GitHub里面往仓库里面提交代码类似。

准备发布

点击那个Code & Deploys,到发布页面。这里有两种发布方式可供选择:

  • 第一种方式

[图片上传失败…(image-e96cc-1542818498384)]

在你的pycharm中安装shub库,这是一个用于发布scrapy项目到scrapinghub的库。或者你可以直接在命令行中使用pip install shub命令来安装,这里我选择方便的pycharm。
可能有的小伙伴不知道pycharm有如此方便的三方库管理功能。

[图片上传失败…(image-aaa521-1542818498384)]

打开项目下的pycharm命令行,如果你的项目不是在pycharm中构建的也没关系,可以在系统命令行中切换到项目目录中执行相关命令。
使用shub login命令进行登陆,这里会让你输入API key,你可以在这里找到你的API key:

[图片上传失败…(image-cc6038-1542818498384)]

[图片上传失败…(image-15285d-1542818498384)]

然后复制,粘贴到命令行就ok了。

在发布之前还有一个需要注意的地方:
如果你的项目中使用了scrapy之外的第三方库,则需要在项目中进行声明,这样scrapinghub才会为你的项目添加相应的第三方库。声明的过程很简单,在你的项目根目录下添加requirements.txt文件,并列出你所需要额外添加的第三方库,类似下面这样,写清楚你需要的三方库名称和版本。

[图片上传失败…(image-f66684-1542818498384)]

再新建一个scrapinghub.yml文件,里面是这样的:

[图片上传失败…(image-1a4534-1542818498384)]

这个大家应该知道是做什么的。其实这个文件在发布项目的时候可以自动生成,但是如果你的爬虫需要依赖一些scrapinghub所没有的三方库的时候,还是最好自己手动新建一个,如果你懒得自己建的话,可以先发布项目,生成了scrapinghub.yml文件之后,再去编辑它,当然scrapinghub会默认提供一部分常用的第三方库,不需要手动声明。

确认无误之后,就可以用shub deploy [project id]命令进行发布了。
project id可以在你的网页地址栏中找到:
细心的同学可以看到发布项目的步骤和命令已经在页面的右下方写出来了,如果看不懂的话还有贴心的视频教程。

[图片上传失败…(image-9a2fea-1542818498384)]

发布成功之后:

[图片上传失败…(image-a0c805-1542818498384)]

回到浏览器中刷新一下页面就看到项目中已经有代码了(请自动忽略shub的更新提示,如果你的shub版本是最新的,就不会出现这个提示)。

[图片上传失败…(image-3ab57d-1542818498384)]

  • 2.从GitHub发布
    接下来我们来说一说怎么从GitHub发布。
    把选项卡切换到GitHub,你会发现是这样的:

[图片上传失败…(image-5863f-1542818498384)]

点connect一步步操作,建立与GitHub的连接。

[图片上传失败…(image-bfb203-1542818498384)]

这里要选择你的scrapy项目所在的仓库,然后点击Connect repo建立连接。

[图片上传失败…(image-7669e3-1542818498384)]

然后点击绿色的发布分支按钮就可以了,发布成功之后会显示和之前从本地发布一样的页面,这里不再赘述。

项目管理

发布成功之后回到主面板,点击项目名称进入到项目管理页面。

[图片上传失败…(image-38eca0-1542818498384)]

看到右上角那个绿色的run按钮了没,点它,你的spider就在scrapinghub上运行起来了,完全不需要自己去架设服务器。
并且在下面可以看到爬虫的运行日志。如果你有多个爬虫,可以在scrapy的配置文件中声明爬虫的优先级,scrapinghub会按照优先级顺序依次执行。并且会根据当前的状态,分类列出你的爬虫任务。

定时执行

scrapinghub还有一个强大的功能就是定时执行爬虫任务,一般我们的需求就是每天定时爬取某个站点来获取更新的数据,刚好定时任务就派上用场了。
在scrapinghub中创建定时任务也非常的简单。

在菜单栏左侧点击Periodic Jobs,就进入到定时任务面板了。

[图片上传失败…(image-4ce5ec-1542818498384)]

点击绿色的Add Periodic job按钮:

[图片上传失败…(image-774a68-1542818498384)]

选择你需要定时执行的spider名称,在Priority中选择执行任务的优先级,在右边的时间设置面板中设置你要执行的时间,点save保存,这样一个定时的spider就创建好了,你就什么都不用关了,就每天从数据中取数据就完了。
当然还有一些高级用法,比如添加参数什么的,就靠大家自己摸索了。

最后

如果你的爬虫需要更新,就改完代码重新发布一遍就可以了。还有其他很多好用的功能,大家可以多多探索。

[图片上传失败…(image-d7f1e7-1542818498384)]

文章来源于互联网:Scrapyd部署爬虫干货

发表评论