js逆向——origin/refer请求头反爬

今日受害网站:

https://www.regulations.gov/docket/FDA-2016-D-1399/document

最终目标:爬取该网站中的新闻摘要

首先打开网页,刷新一下,观察都返回了哪些数据

然后我们ctrl+f进行关键字搜索

 

进一步,只过滤含有document接口的请求

 

选择有数据的那个包(4.3KB)

 

右键》 copy as cURL cmd

我们使用python爬虫工具将cURL转为requests

爬虫工具库网址:https://spidertools.cn

 

然后复制生成的测试代码尝试在pycharm当中运行 

结果报错400,请求参数错误

这是因为网页转换的过程中,参数字符串出现了乱码

我们对照网页重新构造params即可

 

或者可以直接在url当中携带参数,这样就不用单独构造字典了(适用于参数固定的情况) 

我们去除一部分不必要的参数

保留有用的参数(当然都保留也行,我们主要是想看一下哪些参数会对爬虫进行检查)

 

新的参数:

headers = {"authority": "api.regulations.gov","accept": "application/vnd.api+json","user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.253.400 QQBrowser/12.6.5678.400","x-api-key": "5F20SbTVakeYfU9i5gX1dxx96sw4KELUQxAHhcHa","origin": "https://www.regulations.gov","referer": "https://www.regulations.gov/","accept-language": "zh-CN,zh;q=0.9"
}

我们注释掉x-api-key返回了403,这个参数是必不可少的,而且有可能是动态生成用于检测爬虫的

 

我们接连注释了好几个参数发现都不影响其实

 

但是如果将origin和refer同时注释就会报错403,说明这里是一个检测点,服务端需要判断客户端是不是点击链接进来的,如果直接请求会失败

 

下面就是最后一个参数x-api-key的分析了

我们直接搜索x-api-key的值看看它是静态/动态参数

结果发现是静态参数,那么我们就需要定位它在文件当中的位置

排除掉在请求头当中的目标之后,我们顺利找到静态参数在文件当中的位置

 

 

所以我们应当首先请求网页接口获取参数x-api-key

先爬取下来返回的document,也就是html文档

 

然后搜索关键字5f205b...观察其在响应文本当中位置的特征 

 

使用正则表达式提取出来静态参数x-api-key的值,为二次请求真正的摘要做准备

第一次请求的代码:

import re
import requestsheaders = {"authority": "api.regulations.gov","accept": "application/vnd.api+json","user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.253.400 QQBrowser/12.6.5678.400","x-api-key": "5F20SbTVakeYfU9i5gX1dxx96sw4KELUQxAHhcHa","origin": "https://www.regulations.gov","referer": "https://www.regulations.gov/","accept-language": "zh-CN,zh;q=0.9"
}# 第一次请求获取静态参数:x-api-key
doc_url = 'https://www.regulations.gov/docket/FDA-2016-D-1399/document'response = requests.get(doc_url, headers=headers, timeout=10)
print("第一次请求状态码:", response)
print(response.text)
api_key = re.search(r"apiKey%22%3A%22(.*?)%22%2C%22", response.text).group(1)
doc_id = re.search(r"/(FDA.*?)/document", doc_url).group(1)
headers.update({"x-api-key": api_key})

第二次真正请求文档发现返回的是一个json串

 

我们解析相应的json串,拿到最终的摘要内容:

第二次请求代码如下:

# 第二次请求获取真正的文档内容
url = "https://api.regulations.gov/v4/documents"
params = {'filter[docketId]': doc_id,'page[number]': 1,'sort': '-commentEndDate'
}
response_doc = requests.get(url, headers=headers, params=params)
print("第二次请求状态码:", response_doc)
print(response_doc.text)
print('爬取到的摘要内容:')
for item in response_doc.json()['data']:abstract = item['attributes']['title']print(abstract)

最后附上本文所使用的完整代码:

import re
import requestsheaders = {"authority": "api.regulations.gov","accept": "application/vnd.api+json","user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.253.400 QQBrowser/12.6.5678.400","x-api-key": "5F20SbTVakeYfU9i5gX1dxx96sw4KELUQxAHhcHa","origin": "https://www.regulations.gov","referer": "https://www.regulations.gov/","accept-language": "zh-CN,zh;q=0.9"
}# 第一次请求获取静态参数:x-api-key
doc_url = 'https://www.regulations.gov/docket/FDA-2016-D-1399/document'response = requests.get(doc_url, headers=headers, timeout=10)
print("第一次请求状态码:", response)
# print(response.text)
api_key = re.search(r"apiKey%22%3A%22(.*?)%22%2C%22", response.text).group(1)
doc_id = re.search(r"/(FDA.*?)/document", doc_url).group(1)
headers.update({"x-api-key": api_key})# 第二次请求获取真正的文档内容
url = "https://api.regulations.gov/v4/documents"
params = {'filter[docketId]': doc_id,'page[number]': 1,'sort': '-commentEndDate'
}
response_doc = requests.get(url, headers=headers, params=params)
print("第二次请求状态码:", response_doc)
print(response_doc.text)
print('爬取到的摘要内容:')
for item in response_doc.json()['data']:abstract = item['attributes']['title']print(abstract)

以上就是本次js逆向的全部内容了,喜欢的朋友欢迎一键三连支持一下哦~🥰🥰 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux_实现TCP网络通信

目录 1、实现服务器的逻辑 1.1 socket 1.2 bind 1.3 listen 1.4 accept 1.5 read 1.6 write 1.7 服务器代码 2、实现客户端的逻辑 2.1 connect 2.3 客户端代码 3、实现服务器与客户端的通信 结语 前言: 在Linux下,实现传输层协议为TCP…

MySQL数据库-备份恢复

一、MySQL日志管理 1.为什么需要日志 用于排错用来做数据分析了解程序的运行情况,了解MySQL的性能 2.日志作用 在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,就必须保证数据的安全性和完整性&#…

鸿蒙SDK开发能力

什么是鸿蒙SDK:HarmonyOS(Software Development Kit)是面向应用和服务开发的开放能力合集,本质就是工具集,与JDK、AndroidSDK在逻辑上有相似之处 18N:1指的是手机,8指的是车机、音箱、耳机、手表/手环、平板、大屏、PC、AR/VR&am…

PCL-基于超体聚类的LCCP点云分割

目录 一、LCCP方法二、代码实现三、实验结果四、总结五、相关链接 一、LCCP方法 LCCP指的是Local Convexity-Constrained Patch,即局部凸约束补丁的意思。LCCP方法的基本思想是在图像中找到局部区域内的凸结构,并将这些结构用于分割图像或提取特征。这种…

DolphinScheduler学习

1.查看文档 点击访问:https://dolphinscheduler.apache.org/zh-cn/docs 我们可以看到相关的文档简介里有 介绍 DolphinScheduler是Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化…

太原高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着科技的不断进步,智能制造已经成为推动制造业转型升级的重要力量。太原高校大学智能制造实验室紧跟时代步伐,积极推进数字孪生可视化系统平台的建设,并于近日圆满完成了项目的验收工作。这一里程碑式的成果,不仅标志着实验室在…

uniapp安卓plus原生选择系统文件

uniapp安卓plus原生选择系统文件 效果&#xff1a; 组件代码&#xff1a; <template xlang"wxml" minapp"mpvue"><view></view> </template> <script>export default {name: file-manager,props: {},data() {return {is…

靶场实战 _ ATTCK 实战 Vulnstack 红队

环境配置 网络拓扑图 (仅供参考) 攻击机&#xff1a;kali ip:192.168.111.5靶机&#xff1a;web-centos 外网ip:192.168.111.10 内网ip:192.168.93.100web1-ubuntu ip: 192.168.93.120PC ip: 192.168.93.30win 2008 ip:192.168.93.20win 2012 ip:192.168.93.10 信息搜集 端口…

【C++】string类(下)

个人主页~ string类&#xff08;上&#xff09; string类 二、模拟实现string类1、头文件string.h2、常见构造3、容量函数4、访问及遍历5、类对象修改6、流插入流提取重载 二、模拟实现string类 今天我们来实现一下上篇文章中详细介绍过的接口 1、头文件string.h #pragma onc…

Redis的应用场景及类型

目录 一、Redis的应用场景 1、限流 2、分布式锁 3、点赞 4、消息队列 二、Redis类型的命令及用法 1、String类型 2、Hash类型 3、List类型 4、Set类型 5、Zset类型 6、Redis工具类 Redis使用缓存的目的就是提升读写性能 实际业务场景下&#xff0c;我们就可以把 Mys…

【常微分方程】

框架 常微分方程的概念一阶微分方程可变离分量齐次方程一阶线性微分方程可降阶的高阶微分方程二阶常系数齐次线性微分方程二阶常系数非齐次线性微分方程 讲解 【1】 常微分方程&#xff1a;是微分方程的特殊情况&#xff1b; 阶&#xff1a;是方程未知函数的最高阶导数的阶数&…

ElementUI,修改el-table中的数据,视图无法及时更新

需求&#xff1a;点击table表格中的“修改”之后&#xff0c;当前行变为可输入状态的行&#xff0c;点击“确定”后变为普通表格&#xff1b; 先贴上已经完美解决问题的代码 实现代码&#xff1a; <section><div style"display: flex;justify-content: space-b…

爬虫学习1:初学者简单了解爬虫的基本认识和操作(详细参考图片)

爬虫 定义&#xff1a;爬虫&#xff08;Web Crawler 或 Spider&#xff09;是一种自动访问互联网上网页的程序&#xff0c;其主要目的是索引网页内容&#xff0c;以便搜索引擎能够快速检索到相关信息。以下是爬虫的一些关键特性和功能&#xff1a; 自动化访问&#xff1a;爬虫能…

【React】事件绑定:深入解析高效处理用户交互的最佳实践

文章目录 一、什么是事件绑定&#xff1f;二、基本事件绑定三、绑定 this 上下文四、传递参数五、事件对象六、事件委托七、常见事件处理八、优化事件处理 React 是现代前端开发中最受欢迎的框架之一&#xff0c;其组件化和高效的状态管理能力使得构建复杂的用户界面变得更加容…

嵌入式MCU固件的几种Flash划分方式详解

通过OTA远程等方式下载的程序,其实还需要提前下载bootloader程序,才能进一步下载APP程序。 今天就来说说通过OTA方式升级固件时,几种flash划分方式。 独立型 所谓独立型就是专门划出一部分闪存(Flash)空间用来存储引导程序(BootLoader)。 如下图: BootLoader:引导…

扫地机器人离线语音识别芯片,工业级智能交互ic,NRK3301

随着科技的飞速发展&#xff0c;智能家居已成为人们追求高品质生活的新趋势。扫地机器人&#xff0c;作为智能家居的重要一员&#xff0c;正逐步从简单的清扫工具进化为具备高度智能的家居助手。 在这一背景下&#xff0c;离线语音识别技术显得尤为重要。传统的扫地机器人大多依…

问题记录-Spring Security- bean httpSecurity not found

问题描述 最近使用Security的时候报了下面的错误&#xff1a; 配置如下&#xff1a; EnableWebSecurity Slf4j public class SecurityConfig {Resourceprivate CustUserService custUserService;Beanpublic AuthenticationProvider authenticationProvider() {return new A…

element-plus时间组件el-date-picker只能选择当前及之前日期

<el-date-picker v-model"timeVal" type"daterange" value-format"YYYY-MM-DD" range-separator"To" start-placeholder"开始时间" end-placeholder"结束时间" />默认是这样的&#xff0c;需要绑定disabled…

一款基于Cortex-M0+的单片机音频编解码 - CJC2100

USBCodec芯片可以对数字音频信号进行多种处理&#xff0c;例如增加音量、均衡调节、音效处理等。这些处理可以通过耳机的控制按钮来实现&#xff0c;让用户可以根据自己的喜好来调整音频效果。USBCodec芯片还可以控制噪声和失真的水平&#xff0c;以提供高品质的音频输出。噪声…

[IMX6ULL]移植NXP Linux Kernel 5.15

移植NXP Linux Kernel 5.15 2024-7-7 hongxi.zhu 1. 下载NXP Linux Kernel 5.15 仓库[nxp-imx/linux-imx] git clone -b lf-5.15.y https://github.com/nxp-imx/linux-imx.git 2. 编译NXP Linux Kernel 5.15 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distclean make…