为什么我的XMLHttpRequest得到robots.txt响应

时间:2019-02-05 05:58:45

标签: javascript html google-chrome google-chrome-extension xmlhttprequest

我正在编写个人Chrome扩展程序(注意:这些可以发出跨域请求。请参见https://developer.chrome.com/extensions/xhr。)

我正在尝试使用XMLHttpRequest访问某个网站,然后使用javascript从中提取数据。我的问题是,该网站经常将其“机器人”页面返回给我,而不是HTML。当然,当我在浏览器中访问该网站时,它可以正常工作。另外,如果我使用浏览器访问该网站,然后提出XHR请求,它也可以正常工作。

我认为问题可能是我的请求标头不正确。然后,我修改了请求标头,以使其与我的浏览器标头相同(使用chrome.webRequest)。不幸的是,这也不起作用。我注意到的一件事是,我的浏览器的请求标头中有一些cookie,我不知道该如何复制(见下文)。

因此,我的问题是:如何解决或调试此问题?有没有办法找出为什么该网站向我提供其“机器人”页面?如果查看其robots.txt文件,则表示没有违反任何明显的规则。我对javascript和Web编程还很陌生,如果这是一个基本问题,敬请原谅。


这是我的浏览器请求标头的示例:

  

获取/ XXX / XXX HTTP / 1.1

     

主持人:www.example.com

     

连接:保持活动状态

     

不安全升级请求:1

     

用户代理:Mozilla / 5.0(Macintosh;英特尔Mac OS X 10_13_6)   AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 71.0.3578.98   Safari / 537.36

     

接受:   text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp,image / apng, / ; q = 0.8

     

引荐来源:https://www.example.com/XXX

     

接受编码:gzip,deflate,br

     

接受语言:en-US,en; q = 0.9

     

Cookie:D_IID = XXX-XXX-XXX-XXX-XXX; D_UID = XXX-XXX-XXX-XXX-XXX;   D_ZID = XXX-XXX-XXX-XXX-XXX; D_ZUID = XXX-XXX-XXX-XXX-XXX;   D_HID = XXX-XXX-XXX-XXX-XXX; D_SID = XXX / XXX / XXX


更新

我还包括了在Chrome中定义的“常规”标头:

  

请求网址:https://www.example.com/XXX

     

请求方法:GET

     

状态码:200 OK

     

远程地址:XXX

     

推荐人政策:降级时不推荐人

我的响应标题:

  

缓存控制:私有,无缓存,无存储,必须重新验证

     

连接:保持活动状态

     

内容编码:gzip

     

内容类型:text / html

     

日期:2019年2月6日星期三格林尼治标准时间

     

Edge-Control:无存储,绕过缓存

     

到期:格林尼治标准时间1970年1月1日,星期四00:00:01

     

服务器:XXX

     

代理控制:无存储,旁路缓存

     

传输编码:分块

     

变化:接受编码

     

X-DB:0

     

X-DW:0

     

X-DZ:XXX


更新2

查看响应HTML后,我不确定它是什么。我最初认为这是某种ROBOTS响应,因为它说META NAME =“ ROBOTS”,但现在我不太确定了。这是HTML的一般结构。

<!DOCTYPE html>
<html>
<head>
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 XXX GMT" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="refresh" content="10; url=example.com" />
<script type="text/javascript">
// SOME JAVASCRIPT
</script>
<script type="text/javascript" src="/example.js" defer></script></head>
<body>
<div id="XXX">&nbsp;</div>
</body>
</html>

2 个答案:

答案 0 :(得分:4)

当我查看您的用户代理时,您正在使用Mac和Apple的东西。

某些背景信息,Chrome使用Safari的呈现引擎,因为Apple不允许使用其他引擎,这是Apple的政策。实际上,Chrome只是GUI的盾,看起来像Chrome,但是其框架仍然是Safari。因此,当Safari引擎出现问题时,您将无法解决问题。当核心出现问题时,安装其他浏览器无济于事。您遇到的问题就是其中之一,很伤心,但却是事实。 让我解释一下。

过去,将(Luondo)网上商店嵌入(对象/ iframe)到网站中也遇到过类似的问题,还启用了交叉策略等,但是在Apple设备上不起作用(仅!)。只有Apple用户需要先 才能访问网上商店的域,然后才能下订单(与您所述的完全一样,Cookie问题)。这是一种与安全性有关的愚蠢策略,仅在使用Safari(或其必需的嵌入式引擎)时才存在。

我所做的(但是,我认为这对您没有帮助)是在检测到Apple设备时在页面上添加一条消息。该消息包括一个到Webshop域的链接,该链接将在另一个标签页中打开。之后,Apple用户可以下订单。另请参阅以下荷兰语消息(以下翻译):


apple webshop problem


Apple用户,请注意:

Safari浏览器存在安全问题,首先您必须访问我们的网上商店提供商才能下订单。

单击以下链接打开我们的网上商店提供商的网站,然后您可以关闭它: [link]在Apple设备上激活订单功能[/ link]

给您带来的不便表示歉意。


但是,这不是最好的翻译,我想你明白了。这是两年前(从现在开始,2019年),问题仍然存在,就像您向我们展示的那样。

-------------

解决方案:

是否仍然有解决方案,可能不是针对Apple用户的(因为Apple需要解决此问题),但是,您是否在装有Chrome的Linux / Windows计算机上尝试了该解决方案?我敢打赌,除非有一些避免使用ajax调用的安全限制服务器站点,否则它将起作用,但是,我认为没有问题。

另一个附属程序:

1 。我不知道您的技能,但是您可以考虑设置代理服务器来避免这些问题,将网站的内容嵌入(或更好地包括)到您的输出中(包括cookie)。一个警告,这可能是非法的,因为您将另一个站点的内容合并为您自己的内容;

2 。询问网站的所有者,他们为其服务提供API。


关于您的ajax方法的个人想法:

如果您想“合并” html或提取非您自己的另一个网站的内容(如您所说的)(通过使用javascript),那么我怀疑您试图做的是合法的。我认为这也是您不想提及“服务”的名称/域的原因(示例不是我想的服务)。尝试弄清楚您想做的事实际上是合法的,如果不这样做,这一切都是在浪费时间,除非像我上面解释的那样有一个API。


也许这一切听起来都不像您想要的答案,但是(希望)您可以对实际问题有所了解。

祝您星期六愉快,希望对您有帮助。

答案 1 :(得分:2)

  

我的问题是:我该如何解决或调试此问题?

要调试,请尝试使用Fiddler,mitmproxy,Wireshark或任何http(s)调试代理,并查看扩展如何发送XMLHttpRequest标头。

还尝试使用Postman模拟浏览器请求,或在Chrome devtool中运行XMLHttpRequest。

我的猜测是,因为X-Requested-With: XMLHttpRequest标头。