我在一个房地产网站上工作,我们即将获得大约 100 万个列表的外部提要。假设每个列表有约 10 张照片与之关联,即约 1000 万张照片,我们需要将每张图片下载到我们的服务器,以免“热链接”到它们。
我完全不知道如何有效地做到这一点。我玩了一些数字,我得出结论,基于每张图像 0.5 秒的下载速率,这可能需要大约 58 天才能完成(从外部服务器下载大约 1000 万张图像)。这显然是 Not Acceptable 。
每张照片似乎大约为 ~50KB,但这可能会有所不同,有些更大,更大,有些更小。
我一直在通过简单地使用进行测试:
copy(http://www.external-site.com/image1.jpg, /path/to/folder/image1.jpg)
我也尝试过 cURL、wget 和其他。
我知道其他网站也在这样做,而且规模要大得多,但我一点也不知道他们是如何在不花几个月时间的情况下管理这类事情的。
Sudo 代码基于我们设置接收的 XML 提要。我们正在使用 PHP 解析 XML:
<listing>
<listing_id>12345</listing_id>
<listing_photos>
<photo>http://example.com/photo1.jpg</photo>
<photo>http://example.com/photo2.jpg</photo>
<photo>http://example.com/photo3.jpg</photo>
<photo>http://example.com/photo4.jpg</photo>
<photo>http://example.com/photo5.jpg</photo>
<photo>http://example.com/photo6.jpg</photo>
<photo>http://example.com/photo7.jpg</photo>
<photo>http://example.com/photo8.jpg</photo>
<photo>http://example.com/photo9.jpg</photo>
<photo>http://example.com/photo10.jpg</photo>
</listing_photos>
</listing>
所以我的脚本将遍历特定列表的每张照片并将照片下载到我们的服务器,并将照片名称插入我们的照片数据库(插入部分已经完成,没有问题)。
有什么想法吗?
最佳答案
我很惊讶供应商不允许您进行热链接。事实上,您不会每个月都提供每张图片,所以为什么要下载每张图片?允许你热链接是更好地利用每个人的带宽。
我管理一个包含数百万个项目的目录,其中数据是本地的,但图像大部分是热链接的。有时我们需要隐藏图片来源或者厂商要求我们缓存图片。为了实现这两个目标,我们使用代理。我们编写了自己的代理,但您可能会找到满足您需求的开源软件。
代理的工作方式是我们对加密的 URL 字符串进行加密和 URL 编码。所以http://yourvendor.com/img1.jpg变成 xtX957z。在我们的标记中,img src 标签类似于 http://ourproxy.com/getImage.ashx?image=xtX957z。 .
当我们的代理收到图像请求时,它会解密图像 URL。代理首先在磁盘上查找图像。我们从 URL 中导出图像名称,因此它正在寻找类似 yourvendorcom.img1.jpg 的内容。如果代理无法在磁盘上找到图像,则它会使用解密的 URL 从供应商处获取图像。然后它将图像写入磁盘并将其返回给客户端。这种方法的优点是按需提供,不会浪费带宽。我只得到我需要的图像,而且我只得到一次。
关于php - 从外部网站下载数百万张图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27990937/
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
我理解(我认为)Ruby中类变量和类的实例变量之间的区别。我想知道如何从该类外部访问该类的实例变量。从内部(即在类方法中而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename?我没有任何具体原因要这样做,只是学习Ruby并想知道是否可行。 最佳答案 classMyClass@my_class_instance_var="foo"class上述yield:>>foo我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。我从这篇文章中提取了上述内
我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1
这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e
我想在Windows7上安装带有ruby1.9.3的rspec-railsgem。我收到一些错误消息,提示无法安装某些json库。所以,我使用下面的说明来解决它。来源=The'json'nativegemrequiresinstalledbuildtools从[rubyinstaller.org][3]下载[Ruby1.9.3][2]从[rubyinstaller.org][3]下载DevKit文件对于Ruby1.9.3,使用[DevKit-tdm-32-4.5.2-20110712-1620-sfx.exe][4]将DevKit解压到路径C:\Ruby193\DevKit运行cd
是否有可能以某种方式访问Class.new范围内的a?a=5Class.new{defb;aend}.new.b#NameError:undefinedlocalvariableormethod`a'for#:0x007fa8b15e9af0>#:in`b' 最佳答案 即使@MarekLipka的回答是正确的——改变变量范围总是有风险的。这是可行的,因为每个block都带有创建它的上下文,因此您的局部变量a突然变得不那么局部了——它变成了一个“隐藏的”全局变量:a=5object=Class.new{define_method(
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.