首页 > 解决方案 > 如何处理似乎过期的请求授权标头

问题描述

我正在利用请求从网站下载文档。为此,我使用 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 分钟更新一次标题值?

标签: pythonweb-scrapingpython-requests

解决方案


似乎标题“授权”将在 30 分钟后过期;您需要了解如何生成一个新的。

通常,它从服务器返回或由 Javascript 生成。对于第一种情况,您可以从 devtool 网络面板中搜索“授权”值。对于第二种情况,您需要调试 JavaScript:

  1. 在带有 Authorization 标头的请求之前创建一个断点。
  2. 检查调用堆栈以找到具有该值的变量。
  3. 了解如何在它之前生成变量。通常,它将是一个函数;然后你可以在控制台调用它,看看它是否可以生成一个新的。
  4. 然后,尝试通过将代码提取到 JavaScript 文件来使函数工作。之后,您可以通过nodejs或excjs调用它。

推荐阅读