javascript – 为什么我的XMLHttpRequest获得了robots.txt响应

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

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

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

因此,我的问题是:我该如何解决或调试这个问题?有没有办法找出网站为我提供“机器人”页面的原因?如果我查看它的robots.txt文件,我没有违反任何明显的规则.我是javascript和网络编程的新手,很抱歉,如果这是一个基本问题.

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

GET /XXX/XXX HTTP/1.1

Host: www.example.com

Connection: keep-alive

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6)
AppleWebKit/537.36 (KHTML,like Gecko) Chrome/71.0.3578.98
Safari/537.36

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

Referer: 07001

Accept-Encoding: gzip,deflate,br

Accept-Language: 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

UPDATE

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

Request URL: 07001

Request Method: GET

Status Code: 200 OK

Remote Address: XXX

Referrer Policy: no-referrer-when-downgrade

我的回复标题:

Cache-Control: private,no-cache,no-store,must-revalidate

Connection: keep-alive

Content-Encoding: gzip

Content-Type: text/html

Date: Wed,06 Feb 2019 XXX GMT

Edge-Control: no-store,bypass-cache

Expires: Thu,01 Jan 1970 00:00:01 GMT

Server: XXX

Surrogate-Control: no-store,bypass-cache

Transfer-Encoding: chunked

Vary: Accept-Encoding

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>

解决方法

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

一些背景信息,Chrome使用Safari的渲染引擎,因为Apple不允许其他引擎,Apple政策.实际上Chrome只是一个GUI屏蔽,看起来像Chrome,但骨架仍然是Safari.这就是为什么当Safari,引擎出现问题时,你无法解决问题.当核心出现问题时,安装另一个浏览器无济于事.你遇到的问题之一就是悲伤而且是真实的.让我解释.

过去类似的问题是将(Luondo)网上商店嵌入(对象/ iframe)到一个网站,也启用了交叉策略等但是在Apple设备上不能工作(仅限!).只有Apple用户才能在下订单之前首先访问网店域名(完全像您所描述的那样,cookie问题).这是一种愚蠢的安全相关策略,只存在使用Safari(或使用其所需的嵌入式引擎).

我所做的(但在你的情况下,我认为没有帮助)是在检测到Apple设备时在页面上添加消息.该消息包含将在另一个标签页中打开的网上商店域的链接.在此之后,Apple用户可以下订单.另见荷兰语的这条消息(翻译如下):

apple webshop problem

Apple用户,请注意:

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

点击以下链接打开我们网站供应商的网站,然后关闭它:[link]激活订购设备到Apple设备[/ link]

为此带来的不便表示歉意.

然而,不是最好的翻译,你猜对了.这是(从现在开始,2019年)两年前,问题仍然存在,就像你向我们展示的那样.

————-

解:

是否有解决方案,可能不适用于Apple用户(因为Apple需要解决此问题)但是,您是否已在安装了Chrome的Linux / Windows计算机上试用过它?我打赌它会起作用,除非有一些安全限制的服务器站点避免了ajax调用,但是,我认为没有问题.

另一个approuch:

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

2.询问网站所有者为其服务提供API.

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

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

也许这对你来说听起来并不像答案,但它会给你(希望)一些有关实际问题的见解.

祝周六愉快,希望有所帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)