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