如何获取指定网页的响应标头

经验创意 · 319 次浏览
ZTOA10 创建于 2024-03-13 22:32

最近在学习JavaScript爬虫方面的知识,本人小白没系统学过,写代码全靠GPT,可能方向有跑偏,熟悉的大佬随便聊两句也行。

目的:获取指定网页的「响应标头」。

如获取网址https://getquicker.net/的响应标头

(只是举个例子,群里Zryan大佬有提过「http模块请求」获取的方案,实测不需登陆的可以行!因为我实际应用需要登陆网站,所以可能此方案不太适合,用浏览器控制--后台运行代码可以绕过登陆环节进行获取)

用浏览器控制模块--后台运行代码,下面是gpt写的代码,发现不起作用,特来求助,熟悉的大佬指点一下

const url = 'https://getquicker.net/';

fetch(url, {
 method: 'HEAD'
})
.then(response => {
 const headers = response.headers.entries();
 const headersJson = {};
 for (const [key, value] of headers) {
   headersJson[key] = value;
}
 
 console.log(headersJson);
})
.catch(error => {
 console.error('Error:', error);
});


sendReplyToQuicker(true, "ok", headersJson, qk_msg_serial);

 

下面是动作链接:https://getquicker.net/Sharedaction?code=135a9cd4-231e-4bb3-a429-08dc435c8f91

这里提别感谢一下zetalpha巨佬的帮助:https://getquicker.net/Sharedaction?code=58fe6922-0c3e-406b-a42b-08dc435c8f91

zetalpha巨佬的方案不用登陆的网址的已经解决;需要登陆的网址目前获取为空,或者获取不到全部内容。

 

4圈-北京 大佬的方案:https://getquicker.net/Sharedaction?code=f6a0ae5e-40e2-4432-a42d-08dc435c8f91

感谢zetalpha大佬多次耐心出手:https://getquicker.net/Sharedaction?code=58fe6922-0c3e-406b-a42b-08dc435c8f91(标签url 不可能有重定向 因为已经跳转了)

 
ZTOA10 最后更新于 2024/3/14

回复内容
ZTOA10 2024-03-14 00:35
#1

把帖子单做是笔记,回头时不时再过来学习一下

onlyclxy 2024-03-14 00:56
#2

我也是gpt大概了解的...  你要的这个响应标头. 是你访问一个地址. 返回给你的信息. 

因为你需求并不是看这些东西. 你要获取一个图片地址. 这个你需要先构造一个地址.  你先构造好了网址, 请求后, 才能获取网页内容. 这个构造的需要在 请求头里找  请求头是浏览器构造的. 是浏览器发起的请求, 你要模拟的也是浏览器请求. 所以上面那个响应标头, 没什么大用

然后因为你要图片地址. 现在网页里资源地址一般是存在这三种里. 静态网页,  XHR 和 js构造. 

在上面获取完地址后, 需要构建"请求头"模拟浏览器发起请求,   然后从返回的网页源码里.取得图片下载地址

(如果有加密的话, 比如网页地址加密, 网页源码加密,请求头加密,还需要解密)

有需要登录的话,  需要带cookie. 这个还算好点

这一套要是下来. 首先正经学这个. 包括不限于, 前端的一些简单知识, js解密, 代码的实现. 也得根据教程先学个10天半个月.  然后学完后,需要自己去分析你要的网站

学完基础后,

这个其实自己上手 除非那种比较简单的. 好弄. 要是稍微麻烦点 ,就很难搞.  

但是你这个要是直接全部让别人搞..  这个就容易了. 没准他一下午就搞出来了..你就直接用就行..

所以...

ZTOA10 回复 onlyclxy 2024-03-14 09:06 :

谢谢大佬发言解惑!

乐昂岚 2024-03-14 09:06
#3

需要登录的可能要按网站进行不一样的处理

乐昂岚 回复 乐昂岚 2024-03-14 09:08 :

我一般是先通过http请求模块去登录,之后进行需要登录才能获取的请求

ZTOA10 回复 乐昂岚 2024-03-14 09:22 :

目前4圈-北京 大佬和zetalpha巨佬的方案已经解决了登陆的问题,只是因为需要重定向,目前对标签页运行模块标签url 不可能有重定向所以没办法获取到。

http请求模块我之前也有考虑过用浏览器控制模块去获取已经登陆的请求头和cookie信息,但是我解析的网址是个下载url,想获取里面的直链,只是知识水平有限,目前到这一步卡住了。

ZTOA10 最后更新于 2024-03-14 09:23
乐昂岚 回复 ZTOA10 2024-03-14 09:26 :

给个链接我试试

ZTOA10 回复 乐昂岚 2024-03-14 09:35 :

这个是下载的url:https://alidocs.dingtalk.com/core/api/resources/img/5eecdaf48460cde5fe8078f410d3e291b0ce3199586f58e370729668ff47cd83fbf03f974c5a170939e8703ac5556d0d311f0bd38b2a38eabae12a79b7f17a52f4e6c6f6c26fb591badc9b09c099041940ab3d149cbe6dce27dbea0dda52f39c?x-oss-process=image/resize,w_1280,m_lfit,limit_1

实际下载的URL是:https://alidocs2.oss-cn-zhangjiakou.aliyuncs.com/res/Q35O8L7JP4AWO9Vb/img/f722358d-3da0-4dfc-b822-80690a96cb4a.png?Expires=1710387246&OSSAccessKeyId=LTAI1XUz8ModxrPd&Signature=jQkoZwNLO2oe6BmlIWL1IWmaAJ4%3D&x-oss-process=image%2Fresize%2Cw_1280%2Cm_lfit%2Climit_1&

第一个URL需要登陆才能访问,第二个应该可以直接下载。

获取到直链后就可以用下载模块直接下载到指定的位置了,就可以摆脱浏览器默认的下载路径了,但是这不是主要目的,主要还是想弄清楚应该怎么实现。

ZTOA10 最后更新于 2024-03-14 09:40
乐昂岚 回复 ZTOA10 2024-03-14 09:37 :

补个网站链接方便我登录测试

ZTOA10 回复 乐昂岚 2024-03-14 09:41 :

https://alidocs.dingtalk.com 回头你随便上传一张图片就可以获取到图片的路径了

乐昂岚 回复 ZTOA10 2024-03-14 09:52 :

上传了图片, 但是尝试了很多方式获取到的图片路径格式和你都不一样

ZTOA10 回复 乐昂岚 2024-03-14 10:03 :

我用浏览器获取的,前面要补上https://alidocs.dingtalk.com/


ZTOA10 最后更新于 2024-03-14 10:04
乐昂岚 回复 ZTOA10 2024-03-14 10:11 :


好奇怪我这个不用登录也能访问

ZTOA10 回复 乐昂岚 2024-03-14 10:16 :

换个没有登录的浏览器试试,下面是我粘贴并反问浏览器的过程截图


ZTOA10 回复 ZTOA10 2024-03-14 10:23 :

正常应该是这种情况的


乐昂岚 回复 ZTOA10 2024-03-14 10:28 :

我这测试好像图片链接都和你的格式不一样, 暂时没办法了

ZTOA10 回复 乐昂岚 2024-03-14 10:29 :

还是感谢你的耐心尝试,这个我也不知道咋回事

ZTOA10 2024-03-14 15:15
#4

问题已解决,通过修改zetalpha巨佬的代码完成的,再次表示感谢!

具体可以查看示例:获取当前页响应标头 

要获取重定向的网址,可以在fetch方法中加入credentials: 'include'选项来包含cookie信息,以确保已登录状态被保持。同时需要处理重定向,可以通过response.redirected属性来判断是否重定向,并通过response.url获取重定向后的网址。

修改后的代码如下:

$$var url = '{url}';
var headersJson = {};
fetch(url, {
 method: 'HEAD',
 credentials: 'include'
})
.then(response => {
 if(response.redirected) {
   headersJson["redirectedUrl"] = response.url;
}
 const headers = response.headers.entries();
 headersJson["status"] = response.status;
 for (const [key, value] of headers) {
   headersJson[key] = value;
}
 
 console.log(headersJson);
})
.catch(error => {
 console.error('Error:', error);
});

setTimeout(function(){
 sendReplyToQuicker(
   true,
   'ok',
   headersJson,
   qk_msg_serial
);
}, 1000);


ZTOA10 最后更新于 2024-03-14 16:26
回复主贴