通过抓取获取不同的网页
我们必须做出一个假设,如果给定相同的输入,Web 服务器将返回相同的输出。有了这个假设,我们不可避免地得出结论,我们没有给它相同的输入。在这种情况下,有两种浏览器或 http 客户端:一种为您提供所需的结果(例如,Firefox、IE、Chrome 或 Safari),另一种未为您提供所需的结果(例如.、LWP、wget 或 cURL)。
首先消除简单的可能性
在此之前,首先确保简单的 UserAgent 相同,您可以通过浏览whatsmyuseragent.com并将另一个浏览器标题中的 UserAgent 字符串设置为该网站返回的任何内容来执行此操作。您还可以使用 Firefox 的Web 开发人员工具栏来禁用 CSS、JavaScript、Java 和元重定向:这将帮助您通过消除非常简单的东西来跟踪问题。
现在尝试复制工作浏览器
现在有了 Firefox,您可以使用FireBug来分析REQUEST
发送的内容。您可以NET
在 FireBug 的选项卡下执行此操作,不同的浏览器应该具有可以执行 FireBug 对 FireFox 所做的工具;但是,如果您不了解相关工具,您仍然可以使用tshark或wireshark,如下所述。重要的是要注意tshark和wireshark总是更准确,因为它们在较低级别上工作,至少以我的经验来看,出错的空间较小。例如,您会看到浏览器正在执行的元重定向等内容,有时 FireBug 可能会忘记这些内容。
在您了解第一个有效的网络请求后,请尽力将第二个网络请求设置为第一个。我的意思是正确设置请求标头和其他请求元素。如果这仍然不起作用,您必须知道第二个浏览器在做什么才能查看问题所在。
故障排除
为了解决这个问题,我们必须全面了解来自两个浏览器的请求。第二种浏览器通常比较狡猾,它们通常是库和非交互式命令行浏览器,它们缺乏检查请求的能力。如果他们有能力转储请求,您仍然可以选择简单地检查它们。为此,我建议使用wireshark 和 tshark 套件。立即,您应该被警告,因为这些在浏览器下运行。默认情况下,您将看到实际的网络 (IP) 数据包和数据链路帧。您可以使用这样的命令过滤掉您特别需要的内容。
sudo tshark -i <interface> -f tcp -R "http.request" -V |
perl -ne'print if /^Hypertext/../^Frame/'
这将捕获所有 TCP 数据包,仅显示过滤器http.requests
,然后 perl 过滤器仅用于第 4 层 HTTP 内容。您可能还想添加到显示过滤器以仅获取单个 Web 服务器-R "http.request and http.host == ''"
您将要检查所有内容以查看这两个请求是否一致、cookie、GET url、用户代理等。确保该站点没有做一些愚蠢的事情。
2010 年 1 月 23 日更新:根据新信息,我建议设置Accept
, and Accept-Language
, Accept-Charset
and Accept-Encoding
。你可以通过 through 做到这一点$ua->default_headers()
。如果您需要从用户代理中获得更多功能,您总是可以将其子类化。我为我的 GData API 采用了这种方法,您可以在 github 上的 UserAgent 子类中找到我的示例。