【发布时间】:2019-06-28 22:04:37
【问题描述】:
我正在编写个人 Chrome 扩展程序(注意:这些可以发出跨域请求。请参阅 https://developer.chrome.com/extensions/xhr)。
我正在尝试使用 XMLHttpRequest 访问某个网站,然后使用 javascript 从中提取数据。我的问题是该网站经常将其“机器人”页面而不是 HTML 返回给我。当然,当我在浏览器中访问该网站时,它运行良好。另外,如果我使用浏览器访问该网站,然后发出 XHR 请求,它也可以正常工作。
我认为问题可能是我的请求标头不正确。然后我修改了我的请求标头,使它们与我的浏览器相同(使用 chrome.webRequest)。不幸的是,这也不起作用。我注意到的一件事是我的浏览器在其请求标头中有一些 cookie,我不知道如何复制(见下文)。
因此,我的问题是:如何解决或调试此问题?有没有办法找出为什么该网站向我提供其“机器人”页面?如果我查看它的 robots.txt 文件,我并没有违反任何明显的规则。我对 javascript 和 web 编程很陌生,如果这是一个基本问题,很抱歉。
这是我的浏览器请求标头的示例:
GET /XXX/XXX HTTP/1.1
主机:www.example.com
连接:保持活动
升级不安全请求:1
用户代理:Mozilla/5.0(Macintosh;Intel 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
推荐人政策:no-referrer-when-downgrade
还有我的响应头:
缓存控制:私有、无缓存、无存储、必须重新验证
连接:保持活动
内容编码:gzip
内容类型:文本/html
日期:2019 年 2 月 6 日星期三,格林威治标准时间 XXX
边缘控制:无存储,绕过缓存
到期:格林威治标准时间 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"> </div>
</body>
</html>
【问题讨论】:
-
如果没有得到预期的 HTML,响应的 HTTP 状态码是什么?
-
@sideshowbarker 我添加了我的响应标头。我认为您要求的 HTTP 状态代码是“200 OK”。让我知道这是否回答了您的问题,或者我是否可以添加其他任何内容。谢谢。
-
@adnbps 嗨,我不确定这是否是您所说的帖子,因为我无法判断这两个问题是否相同。在前一种情况下,当您打开 CORS 请求的开发人员选项卡时,chrome 会隐藏标题 Cookie。在这种情况下,您似乎可以访问此标头。因此,您现在可以做的可能是尝试使用第三方 Web 请求工具(例如 Postman),并尝试隔离哪些标头使网站发送不同的响应。然后您可以尝试使用 developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/… 添加该标题
-
@semako 谢谢。我无法诊断问题。我的基本观察是,当我在浏览器中发出请求时,我的浏览器在标头中包含一些 cookie。但是,当我使用 XHR 发出请求时,它的标头中不包含 cookie。我不知道如何使用 XHR 复制浏览器的请求(包括 cookie)。你有什么想法,或者你能指出我正确的方向吗?谢谢。
-
@adnbps 下面是一个可以提供帮助的测试:当您在浏览器中以隐身模式打开页面并检查源代码时,它是否包含良好的 HTML?如果是,那么您可以通过添加/删除标头来做同样的事情,不需要 cookie(隐身模式不会在第一次请求时发送它们)。但是,如果 HTML 无效或者您必须先登录网站,则意味着您无法在不要求用户先登录网站的情况下使其工作。
标签: javascript html google-chrome google-chrome-extension xmlhttprequest