通过抓取获取不同的网页
我们必须做出一个假设,如果给定相同的输入,网络服务器将返回相同的输出。有了这个假设,我们不可避免地得出结论,我们没有给它相同的输入。那里有两个browsers,或这种情况下的 http 客户端:为您提供所需结果的客户端(例如 Firefox、IE、Chrome 或 Safari),以及not为您提供所需的结果(例如 LWP、wget 或 cURL)。
首先消除简单的可能性
之前,首先继续确保简单的 UserAgents 相同,您可以通过浏览到Whatsmyuseragent.com http://whatsmyuseragent.com/并将另一个浏览器标头中的 UserAgent 字符串设置为该网站返回的任何内容。您还可以使用 Firefox 的Web 开发人员的工具栏 https://addons.mozilla.org/en-US/firefox/addon/60禁用 CSS、JavaScript、Java 和元重定向:这将帮助您通过消除真正简单的东西来追踪问题。
现在尝试复制工作浏览器
现在有了 Firefox,您可以使用FireBug http://www.getfirebug.com/来分析REQUEST
已发送。您可以在以下位置执行此操作NET
FireBug 中的选项卡,不同的浏览器应该具有可以完成 FireBug 与 FireFox 的功能的工具;但是,如果您不知道有问题的工具,您仍然可以使用tshark or 线鲨如下所述。重要的是要注意tshark and 线鲨总是会更准确,因为它们在较低的水平上工作,至少根据我的经验,犯错的空间更小。例如,您会看到浏览器正在执行的元重定向等操作,有时 FireBug 可能会丢失这些操作。
了解第一个有效的 Web 请求后,请尽力将第二个 Web 请求设置为第一个 Web 请求。我的意思是正确设置请求标头和其他请求元素。如果这仍然不起作用,您必须知道第二个浏览器正在做什么才能找出问题所在。
故障排除
为了解决这个问题,我们必须全面了解来自both浏览器。第二个浏览器通常是骗子,这些通常是库和非交互式命令行浏览器,缺乏检查请求的能力。如果他们有能力转储请求,您仍然可以选择简单地检查它们。为此,我建议wireshark 和 tshark 套件 http://www.wireshark.org/。您应该立即收到警告,因为这些操作是在浏览器下运行的。默认情况下,您将看到实际的网络 (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 == ''"
您需要检查所有内容,看看两个请求是否一致、cookies、GET url、用户代理等。确保网站不会做一些愚蠢的事情。
更新于 2010 年 1 月 23 日:根据新信息我建议设置Accept
, and Accept-Language
, Accept-Charset
and Accept-Encoding
。你可以通过以下方式做到这一点$ua->default_headers()
。如果您需要用户代理的更多功能,您始终可以对其进行子类化。我对我的 GData API 采用了这种方法,你可以找到我在 github 上的 UserAgent 子类示例 http://github.com/EvanCarroll/GoogleAPI/blob/master/lib/GoogleAPI/UserAgent.pm.