ruby - 使用 Nokogiri 打开网站时出现问题 - 请求超时 - 应该归咎于 Etags?
问题描述
我正在尝试使用 nokogiri 打开 MrPorter.com
Nokogiri::HTML(open("https://www.mrporter.com"))
我收到以下错误:
Net::ReadTimeout: Net::ReadTimeout with #<TCPSocket:(closed)>
from /Users/8bithero/.rbenv/versions/2.6.5/lib/ruby/2.6.0/net/protocol.rb:217:in `rbuf_fill'
这以前有效,但他们后来添加了 etags,我不确定它是否可能是罪魁祸首。
有没有办法解决?是否仍然可以使用 Nokogiri 打开此页面(或类似页面)?也许我缺少一些必需的参数?
您可以使用邮递员(并添加content-type: application/json
)进行 API 调用
https://www.mrporter.com/api/inseason/search/resources/store/mrp_gb/productview/666467151985458?locale=en_GB
但是如果你直接点击它,除非你首先访问产品页面,否则它不会起作用: https ://www.mrporter.com/en-gb/mens/product/red-wing-shoes/shoes/lace-up-boots /8138-moc-皮靴/666467151985458
这似乎设置了 etags 的到期时间约为 5 分钟,这让我觉得它可能是 etags 的错误。
有没有人知道如何让它们中的任何一个可以访问?
解决方案
如果您发送 net/http 请求,该站点将受到用户代理验证的保护。您可以按如下方式解析页面:
require 'nokogiri'
page = `curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" https://www.mrporter.com/en-gb/`
parse_page = Nokogiri::HTML(page)
你会得到一个解析的页面
推荐阅读
- sql - 复制行和另一个表中的依赖行,以及另一个表中的依赖行等
- javascript - 如何编写正确缩进方案代码的 JavaScript 函数?
- swift - 在协议中实现某种形式的枚举
- sql-server - 链接服务器“(null)”的 OLE DB 提供程序“MSDASQL”报告了错误。提供商没有提供有关错误的任何信息
- javascript - 如何同步分页和输入范围?
- kotlin - vert.x JDBCAuth 不在 RoutingContext 中存储用户对象
- pgadmin-4 - pgadmin4:创建 SSH 隧道失败(在 W10 上)
- c# - 从代码隐藏中正确使用新实例化的用户控件
- c# - 在 C# winform 中删除运行时生成的控件
- r - 忽略R中列顺序的数据框的行频