Scrapyd在具有动态ip的服务器上部署项目

时间:2014-12-24 07:07:21

标签: python deployment web-scraping scrapy scrapyd

我想在scrapy.cfg文件中未列出的ip上部署我的scrapy项目,因为ip可以更改,我想自动执行部署过程。我尝试直接在deploy命令中提供服务器的IP,但它不起作用。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

首先,您应该考虑将域分配给服务器,因此无论其动态IP如何,您都可以随时访问它。 DynDNS有时会派上用场。

其次,您可能不会先做第一个,因为您无法访问服务器,或出于其他原因。在这种情况下,我建议使用系统的hosts文件来模仿上述行为。如wikipedia article所述:

  

hosts文件是操作系统用于将主机名映射到IP地址的计算机文件。

例如,假设您在url中将remotemachine设置为scrapy.cfg。您可以编写一个脚本,使用最新的IP地址编辑hosts文件,并在部署蜘蛛之前执行它。这种方法具有系统范围的效果,因此如果要部署多个蜘蛛,或者为了其他目的使用同一服务器,则不必更新多个配置文件。

此脚本可能如下所示:

import fileinput
import sys

def update_hosts(hostname, ip):

    if 'linux' in sys.platform:
        hosts_path = '/etc/hosts'
    else:
        hosts_path = 'c:\windows\system32\drivers\etc\hosts'

    for line in fileinput.input(hosts_path, inplace=True):
        if hostname in line:
            print "{0}\t{1}".format(hostname, ip)
        else:
            print line.strip()

if __name__ == '__main__':
    hostname = sys.argv[1]
    ip = sys.argv[2]
    update_hosts(hostname, ip)
    print "Done!"

当然,你应该做额外的参数检查等,这只是一个简单的例子 然后,您可以在部署之前运行它:

python updatehosts.py remotemachine <remote_ip_here>

如果您想更进一步并将此功能添加为scrapyd-deploy的简单参数,您可以继续编辑scrapyd-deploy文件(它只是一个Python脚本)以添加其他参数并从内部更新hosts文件。但是我不确定这是最好的事情,因为将这个实现分开并且更明确可能是更好的选择。

答案 1 :(得分:1)

这不是你可以在scrapyd方面解决的问题。

根据scrapyd-deploy的{​​{3}},需要在url的{​​{1}}部分中定义[deploy]

可能的解决方法之一可能是在scrapy.cfg中使用占位符,您可以在启动scrapy.cfg之前用目标服务器的真实IP地址替换。