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,一经查实,立即删除!

相关文章

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】014 - UBOOT 内存分布梳理

【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】014 - UBOOT 内存分布梳理 一、 UBOOT 内存分布梳理系列文章汇总:《【OpenHarmony4.1 之 U-Boot 源码深度解析】000 - 文章链接汇总》 本文链接:《【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】014 - UBOOT 内存分布梳…

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方法的基本思想是在图像中找到局部区域内的凸结构,并将这些结构用于分割图像或提取特征。这种…

后端面试题日常练-day03 【Java基础】

题目 希望这些选择题能够帮助您进行后端面试的准备,答案在文末 在Java中,以下哪个关键字用于表示父类? a) super b) parent c) base d) root Java中的包(package)是用来做什么的? a) 组织和管理类 b) 定义…

ThinkPHP对接易联云打印

引入composer包 composer require yly-openapi/yly-openapi-sdk <?phpnamespace app\common\library;use app\admin\model\yp\Order; use App\Api\PrintService; use App\Config\YlyConfig; use App\Oauth\YlyOauthClient; use think\Cache; use think\Config;class Yly {…

DolphinScheduler学习

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

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

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

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…

服务器选择租用还是托管?托管和租用哪个比较划算

在构建或扩展IT基础设施时&#xff0c;服务器作为关键组件&#xff0c;其选择方式——租用或托管&#xff0c;直接关系到企业的运营成本、灵活性、安全性及长期发展战略。本文将从技术、经济、安全等多个维度&#xff0c;深入解析这两种方案的优缺点&#xff0c;并探讨在何种情…

Dav_笔记11:SQL Tuning Overview-sql调优 之 1

Introduction to SQL Tuning SQL调优简介 SQL调优涉及以下基本步骤&#xff1a; ■通过查看系统中可用的过去SQL执行历史记录&#xff0c;识别负责大量应用程序工作负载和系统资源的高负载或顶级SQL语句 ■验证查询优化器为这些语句生成的执行计划是否合理执行 ■实施纠正…

力扣第三十一题——下一个排列

内容介绍 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地&…

redis详解--springboot整合redis

1. java连接redis 思考: 我们之前操作redis都是通过命令行的客户端来操作。 在开发时都是通过java项目操作redis.引入Redis依赖 <!--引入java连接redis的驱动--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactI…

ThreadLocal面试三道题

针对ThreadLocal的面试题&#xff0c;我将按照由简单到困难的顺序给出三道题目&#xff0c;并附上参考答案的概要。 1. 简单题&#xff1a;请简述ThreadLocal是什么&#xff0c;以及它的主要作用。 参考答案&#xff1a; ThreadLocal是Java中的一个类&#xff0c;用于提供线…

力扣笔试题系列(一)

1、给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 char * mergeAlternately(char * word1, char * word2){int len1 strlen(word1);i…

C++ primer plus 第16章string 类和标准模板库, 无序关联容器(C++11)

C primer plus 第16章string 类和标准模板库, 无序关联容器(C11) C primer plus 第16章string 类和标准模板库, 无序关联容器(C11) 文章目录 C primer plus 第16章string 类和标准模板库, 无序关联容器(C11)16.4.5 无序关联容器(C11) 16.4.5 无序关联容器(C11) 无序关联容器是…