首页 > 其他分享 >scrapyd_client deploy 内部实现简单说明

scrapyd_client deploy 内部实现简单说明

时间:2024-07-07 09:11:37浏览次数:16  
标签:py settings os setup deploy client egg scrapyd

scrapyd_client deploy 提供了对于开发的spider 的打包,同时push 到scrapyd server 中,因为python 的特殊性,我们开发的spider 可能有依赖,scrapyd_client 会结合实际命令打包应用为是否包含依赖的egg 包

egg 包处理

对于egg 包处理,scrapyd_client deploy 会先检查spider 项目中是否包含setup.py 没有的话,会自己生成一个

  • setup.py 模版

settings 使用了spider 项目中的settings , 实际上就是一个scrapy 的扩展

_SETUP_PY_TEMPLATE = """
# Automatically created by: scrapyd-deploy
 
from setuptools import setup, find_packages
 
setup(
    name         = 'project',
    version      = '1.0',
    packages     = find_packages(),
    entry_points = {'scrapy': ['settings = %(settings)s']},
)
""".lstrip()
  • 构建egg
    包含了是否包含依赖,对于包含依赖的基于了uberegg 实现一个uber egg 的打包,否则使用默认的
    构建命令
    实际上就是python setup.py bdist_egg 或者 python setup.py bdist_uberegg
def _build_egg(opts):
    closest = closest_scrapy_cfg()
    os.chdir(os.path.dirname(closest))
    if not os.path.exists("setup.py"):
        settings = get_config().get("settings", "default")
        _create_default_setup_py(settings=settings)
    d = tempfile.mkdtemp(prefix="scrapydeploy-")
    o = open(os.path.join(d, "stdout"), "wb")
    e = open(os.path.join(d, "stderr"), "wb")
 
    if opts.include_dependencies:
        _log("Including dependencies from requirements.txt")
        if not os.path.isfile("requirements.txt"):
            _fail("Error: Missing requirements.txt")
        command = "bdist_uberegg"
    else:
        command = "bdist_egg"
 
    retry_on_eintr(
        check_call,
        [sys.executable, "setup.py", "clean", "-a", command, "-d", d],
        stdout=o,
        stderr=e,
    )
    o.close()
    e.close()
 
    egg = glob.glob(os.path.join(d, "*.egg"))[0]
    return egg, d
  • push scrapyd 服务
    我只说明http 处理部分,核心是对于通过addversion.json endpoint 进行数据post 处理
def _upload_egg(target, eggpath, project, version):
    with open(eggpath, "rb") as f:
        eggdata = f.read()
    data = {
        "project": project,
        "version": version,
        "egg": ("project.egg", eggdata),
    }
    body, content_type = encode_multipart_formdata(data)
    url = _url(target, "addversion.json")
    headers = {
        "Content-Type": content_type,
        "Content-Length": str(len(body)),
    }
    req = Request(url, body, headers)
    _add_auth_header(req, target)
    _log('Deploying to project "%s" in %s' % (project, url))
    return _http_post(req)

说明

以上是关于scrapyd_client deplo 处理的简单说明,后边会结合scrapyd 的spider 调度说明内部运行

参考资料

https://github.com/scrapy/scrapyd-client
https://packaging.python.org/en/latest/specifications/entry-points/

标签:py,settings,os,setup,deploy,client,egg,scrapyd
From: https://www.cnblogs.com/rongfengliang/p/18230899

相关文章

  • Kubernetes client-go源码走读
    Informer机制Kubernetes使用Informer代替Controller去访问APIServer,Controller的所有操作都和Informer进行交互,而Informer并不会每次都去访问APIServer。Informer使用ListAndWatch的机制,在Informer首次启动时,会调用LISTAPI获取所有最新版本的资源对象,然后再通过WATCH......
  • Winform中使用HttpClient实现调用http的post接口并设置传参content-type为application
    场景Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124157296上面使用HttpClient调用post接口时使用的HttpContent的格式为application/x-www-form-urlencoded对应的代码......
  • qt windeployqt 打包qt程序
    1、windeployqt路径2、增加环境变量3、运行指令windeployqtexe绝对路径--qmldir工程的绝对路径【注意1】最好单独建立一个目录,将exe单独复制进去,因为windeployqt会将依赖的各种文件和库拷贝到exe所在的目录【注意2】--qmldir是一个可选参数,如果没有使用qml则可以不......
  • dfsvc.exe 是 Windows 操作系统中的一个系统进程,它的全称是 "ClickOnce Deployment Se
    dfsvc.exe是Windows操作系统中的一个系统进程,它的全称是"ClickOnceDeploymentService"。这个进程主要用于支持ClickOnce技术,它是一种用于在Windows平台上发布和部署应用程序的技术。具体来说,ClickOnce是一种轻量级的、易于部署的应用程序部署技术,通常用于分发和更新.NE......
  • ASP.NET Core如何使用HttpClient调用WebService
    原文链接:https://www.yisu.com/jc/691937.html我们使用VS创建一个ASP.NETCoreWebAPI项目,由于是使用HttpClient,首先在ConfigureServices方法中进行注入。public void ConfigureServices(IServiceCollection services){    // 注入HttpClient    services.AddHt......
  • Could not recover RibbonLoadBalancerClient.choose ServiceInstance
    org.springframework.retry.TryException:Couldnotrecover;nestedexceptionisjava.lang.AbstractMethodError:org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(Ljava/lang/String;Lorg/springframework/cloud/client/loadbalancer/Request;......
  • k8s-09-Deployment
    Deployment微服务化:将一个大规模系统拆分成各个独立运行的组件更新pod:直接删除所有现有的pod,然后创建新的pod。先创建新的pod,并等待它们成功运行之后,再删除旧的pod。按顺序创建新的pod,然后逐渐删除旧的pod。第1种会导致应用程序在一定的时间内不可......
  • httpClient使用GetStringAsync、GetByteArrayAsync、GetStreamAsync三种方法的使用场
     `HttpClient`类中的`GetStringAsync`、`GetByteArrayAsync`和`GetStreamAsync`方法用于从远程服务器获取不同类型的数据。它们的主要使用场景如下:1.`GetStringAsync`方法:-使用场景:当您需要从远程服务器获取文本数据时,可以使用`GetStringAsync`方法。这通常用于......
  • C#如何使用HttpClient对大文件进行断点上传和下载
    什么是Http的断点上传和下载断点上传:在向服务商上传大文件的时候,将一个大的文件拆分成多个小的文件,每个文件通过单独的Http请求上传给服务器。断点下载:在向服务器请求下载一个大的资源文件的时候,不是一次Http请求返回所有的资源文件内容。而是先通过Head请求,拿到资源文件的大小(......
  • .Net Core8下Elasticsearch7.x+Nest升级到Elasticsearch8.x+Elastic.Clients.Elastics
    背景Elasticsearch升级到8.11了,对应的客户端插件也跟着升级,以为会兼容Nest的语法,发现自己TooYoungTooSimple!没办法,只能去官网找,结果官网只有最基本的增、删、改、查,只能继续查资料,发现网上资料很少,避免大家少走弯路,这里做个简单的分享。分享1.ElasticsearchClientvaresS......