Python爬虫模拟登录失败,重定向到登录页面解决方法。

时间:2022-08-31 11:38:45

今天尝试模拟登录一个网站,由于要爬的页面必须登录才能访问,所以我用requests.Session()来保持Cookie,再访问要爬的页面。

但是这个爬虫有时模拟登录成功,有时失败,很奇怪。

测试是否登录成功的代码片段如下:

    account_page = 'https://example.com/mypage'
    response = session.get(account_page)
    if response.url == account_page:
        print(u'已成功模拟登录!')
    else:
        print(u'模拟登录失败!')

原理是 https://example.com/mypage 页面是只有登录用户才能成功访问的页面,非登录用户访问这个页面会被重定向到登录页面 https://example.com/login?referer=/mypage/ 所以只要比较响应对象的 url 和要访问的目标 url 是否一致即可。

由于有时候是能登录成功的,所以与Form Data, headers都无关。

试着加入 time.sleep(3) 在post账号信息和get账号页面之间来增加3秒的延时,重试了几次结果也一样,排除之。

然后我分别在登录失败与登录成功的情况下打印响应对象的请求历史:

    account_page = 'https://example.com/mypage'
    response = session.get(account_page)
    if response.url == account_page:
        print(u'已成功模拟登录!')
        print(response.history)  # 返回空列表
    else:
        print(u'模拟登录失败!')
        print(response.history)  # 返回[<Response [302]>]

响应对象的 history 方法可以用来跟踪重定向,返回一个 Response 对象的列表。我发现在模拟登录成功的情况下 response.history 会返回一个空列表(因为已登录用户可以直接访问这个页面,不会被重定向),而在登录失败的情况下会返回[<Response [302]>],也就是说登录失败的情况下会产生一个302状态码的重定向。

并不知道为什么会发生这种情况,但是在 get 目标页面时加入 allow_redirects = False 参数来禁用重定向处理后,模拟登录就总是成功了:

    account_page = 'https://example.com/mypage'
    response = session.get(account_page, allow_redirects=False)
    if response.url == account_page:
        print(u'已成功模拟登录!')
    else:
        print(u'模拟登录失败!')