【问题标题】:Issue Downloading PDF with urllib on Website Requiring Authentication在需要身份验证的网站上使用 urllib 下载 PDF 问题
【发布时间】:2017-12-18 20:30:22
【问题描述】:

我正在尝试获取需要用户名和密码的域后面的 pdf 文件。我可以让 MechanicalSoup 输入我的登录凭据,但是当我导航到 pdf 文件时,我可以使用 MechanicalSoups launch_browser() 很好地查看 pdf,但我无法下载 pdf。过去(当在 python 2 中为不需要身份验证的站点使用 BeautifulSoup 时)我只会将 url 传递给 urllib2,如下所示:

page = urllib2.urlopen(download_url)
file = open(fileName, 'w')
file.write(page.read())
file.close()

当我对 urllib.requests 执行类似操作时,我发现我现在必须再次输入我的登录凭据。所以我尝试了(按照指示here):

loginUrl = "http://..."
urlToPDF = "http://..."
passman = urllib.request.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, loginUrl, "username", "password")

authhandler = urllib.request.HTTPBasicAuthHandler(passman)
opener = urllib.request.build_opener(authhandler)

urllib.request.install_opener(opener)

page = urllib.request.urlopen(urlToPDF)
file = open("test.pdf", "wb")
file.write(page.read())
file.close()

但是,这似乎不起作用。当我将文件名更改为“test”(删除“.pdf”)并在 chrome 中打开时,它似乎将网页写入文件,该网页说我需要单击将我重定向到登录页面的按钮。因此,为什么我尝试在上面的代码中同时使用 loginUrl 和 urlToPDF。

到目前为止,我读过的论坛似乎都说上述内容应该有效。或者,考虑到我可以使用 MechanicalSoup 查看 pdf,有没有办法直接使用 MechanicalSoup 下载 pdf?

【问题讨论】:

  • 我不知道您的具体情况,但是许多网站会检查引荐来源网址字段以检查您是否确实来自下载页面,否则会显示该 HTML 页面。如果是这样,那么 MechanicalSoup 应该可以工作。

标签: python python-3.x pdf-generation urllib mechanicalsoup


【解决方案1】:

您当然可以使用 MechanicalSoup 下载 PDF。

许多StatefulBrowser 方法(包括StatefulBrowser.openStatefulBrowser.follow_link)的返回值是requests.Response 对象。如果请求成功,那么你想要的数据存储在Response.content 属性中。所以,下载文件相当于将这个属性写入文件!

这是一个例子:

import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser()
response = browser.open("http://example.com/example.pdf")

with open('your_filename_here.pdf', 'wb') as f:
    f.write(response.content)

在未来,我希望 MechanicalSoup 将更直接地实现为 StatefulBrowser.download 方法(或类似的方法)。请参阅 MechanicalSoup GitHub 页面上的 this issue 以跟踪此功能的开发。

【讨论】:

  • 它有效,谢谢:) 我现在遇到的一个问题是显然读取文件写入文件 response.content 存储为 所以我需要将 html 转换为pdf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多