首页 > 解决方案 > 使用 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 的错误。

有没有人知道如何让它们中的任何一个可以访问?

标签: rubycurlweb-scrapingnokogirietag

解决方案


如果您发送 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)

你会得到一个解析的页面


推荐阅读