windows 下 scrapyd的配置

1、Scrapyd是一个用来部署和运行Scrapy项目的应用,由Scrapy的开发者开发。其可以通过一个简单的Json API来部署(上传)或者控制你的项目。

2、Scrapyd可以用来管理多个项目,并且每个项目还可以上传多个版本,不过只有最新的版本会被使用。

3、在安装并开启Scrapyd之后,它将会挂起一个服务来监听运行爬虫的请求,并且根据请求为每一个爬虫启用一个进程来运行。

4、Scrapyd同样支持同时运行多个进程,进程的数量由max_proc和max_proc_per_cpu选项来限制

Scrapyd 使用详解:

一、安装scrapyd

pip install scrapyd

二、安装scrapyd-client

pip install scrapyd-client

三、命令行输入 scrapyd  ( 测试scrapyd 是否安装成功如果是这样子就表示安装完成)

si 

四、然后我们打开浏览器输入 127.0.0.1:6800 会出现这样一个页面表示scrapyd 安装成功。

五、修改scrapyd的配置,修改成允许远程访问

配置文件路径:D:\mytools\Anconda3\envs\py36\Lib\site-packages\scrapyd

修改 bind_address = 127.0.0.1   为  bind_address = 0.0.0.0

六、添加scrapyd-deploy.bat 文件(因为 scrapyd-deploy  运行会报错, 找不到XXX)

编写内容如下:

@echo off

"D:\mytools\Anconda3\envs\py36\python.exe" "D:\mytools\Anconda3\envs\py36\Scripts\scrapyd-deploy" %*

七、修改scrapyd-deploy文件, 否则scrapyd-deploy 会报导包错误

注释23行, 添加24行代码

from w3lib.http import basic_auth_header

八、配置scrapy项目

image

进入你的scrapy项目目录,输入  scrapy-deploy –l  列出当前的项目

上传项目:

a、scrapy项目根目录下运行scrapyd-deploy 部署名 -p 项目名,将项目上传至scrapyd服务器  (注意: 必须是scrapy项目根目录)

b、scrapyd运行期间修改scrapy代码无效,必须重启scrapyd

c、运行爬虫命令为curl http://localhost:6800/schedule.json -d project=项目名 -d spider=爬虫名

注意: 这有个大坑: scrapyd 启动 最好在scrapy 项目下启动, 否则一直会报找不到文件的报错。 

scrapyd-deploy 部署名 -p 项目名

更多命令参照官网: Scrapyd — Scrapyd 1.2.0 documentation

常用的基本命令:

打包上传项目 : scrapyd-deploy 爬虫名称 -p 项目名称

查看已经上传至scrapyd服务的项目:curl http://localhost:6800/listprojects.json

查看某一个项目中的所有爬虫名称  curl http://localhost:6800/listspiders.json?project=爬虫项目名称

启动爬虫: curl http://localhost:6800/schedule.json -d project="爬虫项目名称" -d spider="项目中某一个爬虫名称"


删除上传项目: 如果上传的项目无法运行,在本地调整代码之后,需要重新打包上传,将失效的项目删除
curl http://localhost:6800/delproject.json -d project=爬虫项目名称

关闭爬虫: curl http://localhost:6800/cancel.json -d project=爬虫项目名称 -d job=jobid  (启动爬虫的时候分配的)

九、启动成功之后, 得到的scrapyd 日志会显示乱码, 此时修改文件 website.py,  修改路径和修改内容如下:

  

from datetime import datetime

import socket

from twisted.web import resource, static
from twisted.application.service import IServiceCollection

from scrapy.utils.misc import load_object

from .interfaces import IPoller, IEggStorage, ISpiderScheduler

from six.moves.urllib.parse import urlparse

class Root(resource.Resource):

    def __init__(self, config, app):
        resource.Resource.__init__(self)
        self.debug = config.getboolean('debug', False)
        self.runner = config.get('runner')
        logsdir = config.get('logs_dir')
        itemsdir = config.get('items_dir')
        local_items = itemsdir and (urlparse(itemsdir).scheme.lower() in ['', 'file'])
        self.app = app
        self.nodename = config.get('node_name', socket.gethostname())
        self.putChild(b'', Home(self, local_items))
        if logsdir:
            self.putChild(b'logs', static.File(logsdir.encode('ascii', 'ignore'), 'text/plain'))
        if local_items:
            self.putChild(b'items', static.File(itemsdir, 'text/plain'))
        self.putChild(b'jobs', Jobs(self, local_items))
        services = config.items('services', ())
        for servName, servClsName in services:
          servCls = load_object(servClsName)
          self.putChild(servName.encode('utf-8'), servCls(self))
        self.update_projects()

    def update_projects(self):
        self.poller.update_projects()
        self.scheduler.update_projects()

    @property
    def launcher(self):
        app = IServiceCollection(self.app, self.app)
        return app.getServiceNamed('launcher')

    @property
    def scheduler(self):
        return self.app.getComponent(ISpiderScheduler)

    @property
    def eggstorage(self):
        return self.app.getComponent(IEggStorage)

    @property
    def poller(self):
        return self.app.getComponent(IPoller)


class Home(resource.Resource):

    def __init__(self, root, local_items):
        resource.Resource.__init__(self)
        self.root = root
        self.local_items = local_items

    def render_GET(self, txrequest):
        vars = {
            'projects': ', '.join(self.root.scheduler.list_projects())
        }
        s = """
<html>
<head><title>Scrapyd</title></head>
<body>
<h1>Scrapyd</h1>
<p>Available projects: <b>%(projects)s</b></p>
<ul>
<li><a href="/jobs">Jobs</a></li>
""" % vars
        if self.local_items:
            s += '<li><a href="/items/">Items</a></li>'
        s += """
<li><a href="/logs/">Logs</a></li>
<li><a href="http://scrapyd.readthedocs.org/en/latest/">Documentation</a></li>
</ul>

<h2>How to schedule a spider?</h2>

<p>To schedule a spider you need to use the API (this web UI is only for
monitoring)</p>

<p>Example using <a href="http://curl.haxx.se/">curl</a>:</p>
<p><code>curl http://localhost:6800/schedule.json -d project=default -d spider=somespider</code></p>

<p>For more information about the API, see the <a href="http://scrapyd.readthedocs.org/en/latest/">Scrapyd documentation</a></p>
</body>
</html>
""" % vars
        return s.encode('utf-8')

class Jobs(resource.Resource):

    def __init__(self, root, local_items):
        resource.Resource.__init__(self)
        self.root = root
        self.local_items = local_items

    def render(self, txrequest):
        cols = 8
        s = "<html><head><title>Scrapyd</title></head>"
        s += "<body>"
        s += "<h1>Jobs</h1>"
        s += "<p><a href='..'>Go back</a></p>"
        s += "<table border='1'>"
        s += "<tr><th>Project</th><th>Spider</th><th>Job</th><th>PID</th><th>Start</th><th>Runtime</th><th>Finish</th><th>Log</th>"
        if self.local_items:
            s += "<th>Items</th>"
            cols = 9
        s += "</tr>"
        s += "<tr><th colspan='%s' style='background-color: #ddd'>Pending</th></tr>" % cols
        for project, queue in self.root.poller.queues.items():
            for m in queue.list():
                s += "<tr>"
                s += "<td>%s</td>" % project
                s += "<td>%s</td>" % str(m['name'])
                s += "<td>%s</td>" % str(m['_job'])
                s += "</tr>"
        s += "<tr><th colspan='%s' style='background-color: #ddd'>Running</th></tr>" % cols
        for p in self.root.launcher.processes.values():
            s += "<tr>"
            for a in ['project', 'spider', 'job', 'pid']:
                s += "<td>%s</td>" % getattr(p, a)
            s += "<td>%s</td>" % p.start_time.replace(microsecond=0)
            s += "<td>%s</td>" % (datetime.now().replace(microsecond=0) - p.start_time.replace(microsecond=0))
            s += "<td></td>"
            s += "<td><a href='/logs/%s/%s/%s.log'>Log</a></td>" % (p.project, p.spider, p.job)
            # -------------------------增加代码如下-----------------------------
            s += "<td><a href='/logs/UTF-8.html?project=%s&spider=%s&job=%s' target='_blank'>UTF-8</a></td>" % (p.project, p.spider, p.job)
            #------------------------------------------------------------------
            if self.local_items:
                s += "<td><a href='/items/%s/%s/%s.jl'>Items</a></td>" % (p.project, p.spider, p.job)
            s += "</tr>"
        s += "<tr><th colspan='%s' style='background-color: #ddd'>Finished</th></tr>" % cols
        for p in self.root.launcher.finished:
            s += "<tr>"
            for a in ['project', 'spider', 'job']:
                s += "<td>%s</td>" % getattr(p, a)
            s += "<td></td>"
            s += "<td>%s</td>" % p.start_time.replace(microsecond=0)
            s += "<td>%s</td>" % (p.end_time.replace(microsecond=0) - p.start_time.replace(microsecond=0))
            s += "<td>%s</td>" % p.end_time.replace(microsecond=0)
            s += "<td><a href='/logs/%s/%s/%s.log'>Log</a></td>" % (p.project, p.spider, p.job)
            # -------------------------增加代码如下-----------------------------
            s += "<td><a href='/logs/UTF-8.html?project=%s&spider=%s&job=%s' target='_blank'>UTF-8</a></td>" % (p.project, p.spider, p.job)
            #------------------------------------------------------------------
            if self.local_items:
                s += "<td><a href='/items/%s/%s/%s.jl'>Items</a></td>" % (p.project, p.spider, p.job)
            s += "</tr>"
        s += "</table>"
        s += "</body>"
        s += "</html>"

        txrequest.setHeader('Content-Type', 'text/html; charset=utf-8')
        txrequest.setHeader('Content-Length', str(len(s)))

        return s.encode('utf-8')

十、解决日志乱码问题: 在项目路径下找到logs文件,在logs文件,在logs下增加UTF-8.html文件

UTF-8.html文件中代码如下:

<html>
<head><meta charset="UTF-8"></head>
<iframe src="" width="100%" height="100%"></iframe>
    <script>
        function parseQueryString(url) {
            var urlParams = {};
            url.replace(
                new RegExp("([^?=&]+)(=([^&]*))?", "g"),
                function($0, $1, $2, $3) {
                    urlParams[$1] = $3;
                }
            );
            return urlParams;
        }
        var kwargs = parseQueryString(location.search);
        document.querySelector('iframe').src = "/logs/" + kwargs.project + '/' + kwargs.spider + '/' + kwargs.job + '.log'
    </script>
<html>

点击 UTF-8  就可以正常的显示中文了

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值