【问题标题】:python requests: how to authenticate with post and access file over proxypython请求:如何通过代理验证post和访问文件
【发布时间】:2020-02-11 13:53:24
【问题描述】:

我正在尝试通过需要登录的大学代理下载研究文章 pdf。我尝试按照 [this answer][1] 进行操作,但生成的下载仅包含登录网站。

  • 文章网址可能如下所示:https://iopscience.iop.org/article/10.3847/2041-8213/aaf743/pdf。 (这个恰好是开放访问,但其他需要以这种方式访问​​)。

  • 在浏览器中,我通过代理访问它:https://login.emedien.ub.my-university.edu/login?qurl=https%3a%2f%2fiopscience.iop.org%2farticle%2f10.3847%2f2041-8213%2faaf743%2fpdf。此 url 存储在下面代码示例中的变量 long_proxy 中。

  • 在浏览器中,这会弹出一个登录表单:

    <form action="/login" method="post">
    <input name="ezproxycsrftoken" type="hidden" value="aBcDeFgH12345"/>
    <input name="url" type="hidden" value="https://iopscience.iop.org/article/10.3847/2041-8213/aaf743/pdf">
    <table>
    <tr><td>University Username:</td><td><input name="user" style="width:250px" tabindex="1" type="text"/></td></tr>
    <tr><td>Password:</td><td><input name="pass" style="width:250px" tabindex="2" type="password"/></td></tr>
    </table>
    </input>
    </form>
    
  • 输入用户名/密码后,我会被转发到

    https://iopscience-iop-org.emedien.ub.uni-muenchen.de/article/10.3847/2041-8213/aaf743/pdf

    在浏览器中打开 PDF。我在下面的代码示例中将此网址称为short_proxy

我尝试通过以下方式处理 python 请求:

user_name = 'myname'
passwd = 'mypassword'

with requests.Session() as session:

    session.headers.update({'User-Agent': 'Mozilla/5.0'})

    # Parse the input form for the hidden input
    r2      = requests.get(long_proxy)
    soup    = bs4.BeautifulSoup(r2.text, "html.parser")
    form    = soup.find('form')
    hidden  = form.find('input', attrs={'type':'hidden', 'name':'ezproxycsrftoken'}).attrs['value']
    url_res = form.find('input', attrs={'type':'hidden', 'name':'url'}).attrs['value']

    # set up the login

    payload = {
        'user': user_name,
        'pass': passwd,
        'ezproxycsrftoken': hidden,
        'url': url_res
    }

    # post login

    post = session.post(login, data=payload)

    # get data

    r3 = session.get(short_proxy)
    with open('file.pdf', 'wb') as fid:
        fid.write(r3.content)
  • 但是下载的文件实际上不是PDF,而是登录页面的html代码。

知道如何获取 PDF 吗?

  [1]: https://stackoverflow.com/questions/37816565/python-authentication-with-requests-library-via-post

【问题讨论】:

  • 您的登录变量设置为什么?此外,基于您被重定向到登录页面,登录帖子可能无法正常工作。您应该尝试打印该响应以验证

标签: python post proxy python-requests


【解决方案1】:

您使用requests.Session() 是为了保存网站为您提供的cookies/会话,但您在获取longproxy 的初始请求中使用requests.get() 而不是session.get()。 改变你的

r2      = requests.get(long_proxy)

r2      = session.get(long_proxy)

应该可以解决您的问题。但是,我无法验证这一点。

另请注意,您的 long_proxy

https://login.emedien.ub.uni-muenchen.de/login?qurl=https://iopscience.iop.org/article/10.3847/2041-8213/aaf743/

只是登录 url,后跟 pdf url。所以你真的不需要去获取它。
这可以为你节省一些额外的请求/执行时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2012-06-14
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2012-11-10
    • 2020-04-19
    相关资源
    最近更新 更多