【发布时间】: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