我正在编写个人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
查看响应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"> </div>
</body>
</html>
答案 0 :(得分:4)
当我查看您的用户代理时,您正在使用Mac和Apple的东西。
某些背景信息,Chrome使用Safari的呈现引擎,因为Apple不允许使用其他引擎,这是Apple的政策。实际上,Chrome只是GUI的盾,看起来像Chrome,但是其框架仍然是Safari。因此,当Safari引擎出现问题时,您将无法解决问题。当核心出现问题时,安装其他浏览器无济于事。您遇到的问题就是其中之一,很伤心,但却是事实。 让我解释一下。
过去,将(Luondo)网上商店嵌入(对象/ iframe)到网站中也遇到过类似的问题,还启用了交叉策略等,但是在Apple设备上不起作用(仅!)。只有Apple用户需要先 才能访问网上商店的域,然后才能下订单(与您所述的完全一样,Cookie问题)。这是一种与安全性有关的愚蠢策略,仅在使用Safari(或其必需的嵌入式引擎)时才存在。
我所做的(但是,我认为这对您没有帮助)是在检测到Apple设备时在页面上添加一条消息。该消息包括一个到Webshop域的链接,该链接将在另一个标签页中打开。之后,Apple用户可以下订单。另请参阅以下荷兰语消息(以下翻译):
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
标头。