Python请求模块未在会话中传递参数

时间:2019-01-25 19:16:40

标签: python python-requests

我正在尝试从需要登录身份验证的站点上批量下载一系列PDF。但是,当我尝试对'/ transcripts / transcript.pdf?user_id = 3007'的GET请求时,我能够成功登录,但是,该请求返回了'/ transcripts的内容/transcript.pdf'

有人知道为什么URL参数没有发送吗?还是为什么要重新路由?

我尝试将参数'user_id'作为数据,参数传递并硬编码在URL中。

出于隐私考虑,我已从下面的字符串中删除了实际域

with requests.Session() as s:
    login = s.get('<domain>/login/canvas')
    # print the html returned or something more intelligent to see if it's a successful login page.
    print(login.text)
    login_html = lxml.html.fromstring(login.text)
    hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]')
    form = {x.attrib["name"]: x.attrib["value"] for x in hidden_inputs}
    print("form: ",form)
    form['pseudonym_session[unique_id]']= username 
    form['pseudonym_session[password]']= password
    response = s.post('<domain>/login/canvas',data=form)
    print(response.url, response.status_code) # gets <domain>?login_success=1 200


    # An authorised request.
    data = { 'user_id':'3007'}
    r = s.get('<domain>/transcripts/transcript.pdf?user_id=3007', data=data)
    print(r.url) # gets <domain>/transcripts/transcript.pdf
    print(r.status_code) # gets 200
    with open('test.pdf', 'wb') as f:
        f.write(r.content)

GET响应返回 /transcripts/transcript.pdf 而不是 /transcripts/transcript.pdf?user_id=3007

2 个答案:

答案 0 :(得分:0)

从外观上看,您正在尝试使用画布。我很确定在画布上,您可以批量下载所有测试附件。

如果不是这种情况,可以尝试以下方法:

  1. 登录后,尝试在浏览器中输入带有user_id的URL。是否直接将您带到PDF文件或链接到一个PDF文件?
  2. 如果是这样,请查看网址,它可能根本不显示参数;一些网站会这样做,不用担心

如果不是,则GET可能还不够;也许该网站使用了javascript等。

答案 1 :(得分:0)

在查看请求的“ .history”后,我发现了一系列302重定向。
首先是'/ login?force_login = 0&target_uri =%2Ftranscripts%2Ftranscript.pdf'
经过一次绝望的尝试,我尝试了:
s.get('/ login?force_login = 0&target_uri =%2Ftranscripts%2Ftranscript.pdf%3Fuser_id%3D3007'),但这仍然使我重新路由了一些次,但最终得到了我想要的文件!

如果有人对此解决方案或我可以阅读的任何资源有更优雅的解决方案,我将不胜感激!