【问题标题】:Avoiding simultaneous sessions with requests.Session()?避免同时使用 requests.Session() 进行会话?
【发布时间】:2020-03-18 22:46:28
【问题描述】:

我正在尝试从医学期刊的网站(https://www.edimark.fr/,我是付费订阅者)获取指向 PDF 文章的链接。访问文章需要身份验证,我已经能够使用requests.post成功登录。我的问题是,在请求获得 5 个链接后,该站点似乎将我注销(我可以说,因为当我测试为每个链接打印 HTML 时,在 5 个链接之后,我的帐户名被通用用户名替换)。当我手动访问该网站再次登录时,该网站告诉我我不能同时拥有超过 5 个活动会话,并且我必须关闭其中一个会话才能再次登录。即使我终止命令后,我仍然有一段时间无法登录。

我的问题是:有没有办法通过在循环(如下所示)重复之前重新启动/注销/终止每个会话来避免被启动?或者有没有其他解决方案?我正在使用的代码(隐藏用户名和密码)如下。您可以看到我正在通过 14 个链接迭代请求。我认为在with requests.Session() as s: 下运行它会让我在整个持续时间内保持登录状态,但情况似乎并非如此。我还在循环末尾添加了s.get('https://www.edimark.fr/deconnexion')(注销网址),但这似乎也无济于事。

import requests
from bs4 import BeautifulSoup
import os
import sys

login_url = "https://www.edimark.fr/front/frontlogin/index"
base_url = 'https://www.edimark.fr/resultat-recherche/magazine/14/page:'


payload = "data%5BUser%5D%5Bemail%5D=XXXXX&data%5BUser%5D%5Bpassword%5D=XXXXX&_method=POST"
headers = {
    'content-type': "application/x-www-form-urlencoded",
    'user-agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"
    }

with requests.Session() as s:
s.post(login_url, data=payload, headers=headers)
for i in range(1, 14):
    target_url = base_url +str(i)
    response = s.get(target_url, data=payload, headers=headers)
    soup = BeautifulSoup(response.content, 'html.parser')
    s.get('https://www.edimark.fr/deconnexion')
    print soup.text

请注意,我对任何类型的编码/编程都非常陌生,所以如果我没有使用正确的措辞,请原谅我。我确信上面的代码也不是最优雅的。任何建议或建议将不胜感激,如果可能的话,最好用更简单的术语。

【问题讨论】:

  • 你想说网站自动注销你?
  • 是的,它会在 5 次请求后将我注销。
  • 只是为了确认一下,您的email/user 通常在HTML 源中?
  • 是的,当我收到base_url 时。当我打印 soup.text 时,我的用户名在前 5 次迭代中显示,但在第五次之后我退出了。

标签: python authentication beautifulsoup python-requests


【解决方案1】:

好吧,因为我没有有效的email/pass 来验证我的请求。

我们需要一起走过才能赶上主要的issue

请运行以下代码,如果您收到AssertionError,请告诉我。

import requests
from bs4 import BeautifulSoup

data = {
    '_method': 'POST',
    'data[User][email]': 'email@email.com',
    'data[User][password]': 'yourpassword'
}


def Login(url):
    with requests.Session() as req:
        r = req.post(url, data=data, allow_redirects=True)
        assert "email@email.com" in r.text


Login("https://www.edimark.fr/front/frontlogin/index")

请将email@email.comyourpassword 替换为您的凭据。

【讨论】:

  • 我在这里确实收到了一个断言错误,但登录 URL 不会重定向到任何地方,因此它不会显示我的用户名,因为它存在于 r.text 中。当我得到 base_url 时,我确实在文本中看到了用户名。同样,我的问题不是登录,而是在本网站上循环浏览超过 5 个页面时保持登录状态
  • @FrankChlumsky 该网站正在运行CAKEPHP Cookie。正如我试图弄清楚在您的请求期间刷新 cookie key 一样。请耐心等待并用我的编辑重试代码 allow_redirects=True
  • 添加 allow_redirects=True 似乎已经解决了问题并且让我保持登录状态。非常感谢!
  • @FrankChlumsky :) 欢迎您。如果对您有帮助,请随时通过勾选答案旁边的复选标记来接受我的答案。如果您喜欢,也可以点赞。也请注意。通常对你得到的帮助要有耐心。因为通常在后台有一些东西:)
猜你喜欢
  • 1970-01-01
  • 2012-01-26
  • 2020-09-25
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多