使用 SSL 卡住 ruby​​ http 请求

标签 ruby http

我正在尝试使用 ruby​​ 下载图像并发现有趣的问题

它是我下载图像的部分代码(仅限 HTTP 请求):

HTTParty.get(url)

或与

Net::HTTP.new(URI.parse(url))

当我尝试从 Nike 下载图片时

url = 'https://c.static-nike.com/a/images/t_PDP_1728_v1/f_auto,b_rgb:f5f5f5/bfau7aauvleh5puvuiqa/zoom-pegasus-turbo-mens-running-shoe-Z163c3.jpg'

效果不错

但由于某些原因,当我打开 Adidas 时它会卡住:

url = 'https://www.adidas.com.sg/dis/dw/image/v2/bcbs_prd/on/demandware.static/-/Sites-adidas-products/default/dw0eb054ad/zoom/G27805_01_standard.jpg'

我有烂日志

    SSL established
<- "GET /dis/dw/image/v2/bcbs_prd/on/demandware.static/-/Sites-adidas-products/default/dw0eb054ad/zoom/G27805_01_standard.jpg HTTP/1.1\r\nUser-Agent: Mozilla/5.0\r\nConnection: close\r\nHost: www.adidas.com.sg\r\n\r\n"

试图通过

关闭 SSL 验证
 verify: false,

但它并没有解决我的痛苦¯\_(ツ)_/¯

但是,对于两个 URL,它都可以与 curl -O 配合使用

最佳答案

服务器端正在对阿迪达斯 URL 进行过滤,可能会阻止自动抓取。您至少必须指定额外的 header 才能成功建立连接。

以下示例成功返回来自 Adidas URL 的响应:

url = 'https://www.adidas.com.sg/dis/dw/image/v2/bcbs_prd/on/demandware.static/-/Sites-adidas-products/default/dw0eb054ad/zoom/G27805_01_standard.jpg'

headers = {
  'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Encoding' => 'br, gzip, deflate',
  'Accept-Language' => 'en-us'
}

response = HTTParty.get(url, headers: headers)
=> #<HTTParty::Response:0x7fcb02856298 parsed_response="\xFF\xD8\xFF\xE0\x00\x10JFIF ...

列出的三个 header 是获得响应所需的唯一 header ,但所有三个 header 都是必需的。

从返回的response可以看出是返回了a JPEG , 所以这个例子应该按要求工作。

关于使用 SSL 卡住 ruby​​ http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54064829/

相关文章:

arrays - 从数组中删除元素的复杂度是多少?

mysql - rake 数据库中的问题 :load command while switching to mysql database

c# - 在 .NET 4.5 中为 websocket 握手设置自定义 header

php - 将文件作为附件发送到浏览器

Linux 工具批量更改 http ://to https://网站

ruby - 如何检查字符串是否仅包含 Ruby 中的空格和字母?

ruby - 如何使用 Mongoid3 为 15k 用户解决 "out of memory"错误和 'heroku run console'?

ruby-on-rails - 无法将 current_user.name 作为注释的属性传递

java - 有没有办法在 Android/Java 发送之前获取 HttpUriRequest 的内容长度?

javascript - Node.js 和 XAMPP 有什么区别