python - 如何处理似乎过期的请求授权标头
问题描述
我正在利用请求从网站下载文档。为此,我使用 r.get 和 r.post 的集合来浏览网站。我遇到的问题是标题之一“授权”随着每个请求而变化。由于该工具每隔几秒钟就会抓取一次网站,因此这是行不通的。我获取必要 cookie、参数和标头的方法是通过相关 GET 或 POST 的 cURL 数据。下面是相关的代码。导致我的问题的请求是通过 cookies2、params2、headers2 的最终 r.get 请求。
self.cookies2 = {
'_ga_CD30TTEK1F': 'GS1.1.1615956693.4.1.1615957453.0',
'_ga': 'GA1.1.290601150.1614925497',
'_4c_': 'bVHBrpswEPyVyuc4scEYwy1VqypSVUV6ba%2FI2CZY4RlkHGgS5d%2B7Vgnta8uF3ZnZ2V3vHc2tcaiknGZFlrMsEQXfoLO5jqi8I291%2FE2oREyQXBhNMdFSYdbUFAuWcMxr0qQ5K%2FI6r9EG%2FYheSZITClCasccGaff00KaRly6ssjSjGRVccAIyO4RFF4fJ04KKPKHkrTYiUft0lOi%2FvJ9Xq4UQRUHfSiMC0mn1okJKzeoUM8YZht0krhPYsK4bmdI6yTQpnu3ia4mM5hkvNiiEDjBB4geOalgc70j12kTnYkvplkJxuEGKE0YgNi52HcMJ4k%2F76tvhA6RJQTihNCNbaMKKJINnBP7ioQVqQxjGcreb53l7GYfQb0%2F9tOuM9M66E5ZOY2%2FG%2FuKVGXd901hlZYdP8mZCMP8AeJDBuDCC%2FeB7fVGhCtchzjub%2Bt2oz0BoM1llqtnq0MZFEkF%2Bo62xpxaOhmD1iA4%2BLgDRbJ3u57%2BrFnSt4ixqj8sQJfoC2VcvtXmV%2FvwEDsfqs5yrY99Zda0OrukX4rsBN%2F8nsp%2Bk7aqPnVHB986q6r29VS%2FX1cmFrtqrYCcbrFkbmjHY195dq5fBGNUuxON5Z05YSuHOgix3Fpz9OvTj8RM%3D',
'ADRUM': 's=1616013800421&r=https%3A%2F%2Fptab.uspto.gov%2F%3F-1483723136',
'_gid': 'GA1.3.1332106114.1615871533',
'_gat': '1',
}
self.headers2 = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:84.0) Gecko/20100101 Firefox/84.0',
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'en-US,en;q=0.5',
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJhcHBsaWNhdGlvblVzZXJJZCI6MTUwMzc1LCJlbXBsb3llZUlkIjpudWxsLCJ1c2VySWQiOm51bGwsInVzZXJOYW1lIjoiYXJob2RlczNAdmlsbGFub3ZhLmVkdSIsImZpcnN0TmFtZSI6IkFuZHJldyIsIm1pZGRsZU5hbWUiOm51bGwsImxhc3ROYW1lIjoiUmhvZGVzIiwiZW1haWxJZCI6ImFyaG9kZXMzQHZpbGxhbm92YS5lZHUiLCJwaG9uZSI6bnVsbCwiaWF0IjoxNjE2MDI3NTUzMTg5LCJleHAiOjE2MTYwMjkzNjU4MzMsImlzcyI6IlBUQUJFMkUiLCJlbmRFZmZlY3RpdmVEYXRlIjpudWxsLCJyb2xlcyI6WyJQVEFCRTJFX0V4dGVybmFsX1VzZXIiXX0.CeE0HM_W2bef2Sc7PfvLJJTcDDYKW6CEgzqpDhyBgMU',
'ADRUM': 'isAjax:true',
'Connection': 'keep-alive',
'Referer': 'https://ptab.uspto.gov/',
}
self.params2 = (
('cacheFix', '1616027845608'),
('extUserSearchView', 'Y'),
)
...
def main(self):
with requests.Session() as r:
# Get initial document count
r.post ( self.url_origin, headers=self.headers, params=self.params, cookies=self.cookies, data=self.data )
r.get ( self.url_search )
r.post ( self.url_enter, headers=self.headers1, params=self.params1,
cookies=self.cookies1, data=self.data1 )
# Below request is the one giving me issues
response = r.get (self.url_doc_view,
headers=self.headers2,
params=self.params2, cookies=self.cookies2)
在将标头数据复制到脚本后,代码可以正常工作约 30 分钟,但在打印 request.json() 后约 30 分钟后出现以下错误:
b'[{"code":"0","message":"There was a problem with your request.","type":null}]'
就好像标头数据在一段时间后过期。一旦出现错误,我必须返回网站并将 cURL 数据复制到 self.headers2 变量中。
我在这里做错了什么,或者我该如何编码,这样我就不需要每 30 分钟更新一次标题值?
解决方案
似乎标题“授权”将在 30 分钟后过期;您需要了解如何生成一个新的。
通常,它从服务器返回或由 Javascript 生成。对于第一种情况,您可以从 devtool 网络面板中搜索“授权”值。对于第二种情况,您需要调试 JavaScript:
- 在带有 Authorization 标头的请求之前创建一个断点。
- 检查调用堆栈以找到具有该值的变量。
- 了解如何在它之前生成变量。通常,它将是一个函数;然后你可以在控制台调用它,看看它是否可以生成一个新的。
- 然后,尝试通过将代码提取到 JavaScript 文件来使函数工作。之后,您可以通过nodejs或excjs调用它。
推荐阅读
- ios - 如何防止按钮在文本更改时移动?
- android - 使用 joda time 时在 ci 上测试失败
- javascript - ReactJS:“this.props.addDog(this.state.newDog);”是什么意思?在这段代码中是什么意思?
- postgresql - 如何将 pq.Int64Array 转换为字符串?
- parallel-processing - 查找可用于处理的最大内核数
- android - Flutter - 使用正则表达式验证电话号码
- r - 内联平方转换给出与转换后的列值不同的结果
- c# - GraphQL .net 实体框架中的 KeyNotFoundException
- javascript - 添加复选框值在显示时不适用于隐藏的“div”
- php - 生成动态 if 条件的 PHP Eval 替代方案