问题在需要身份验证的网站上使用urllib下载PDF

问题描述 投票:1回答:1

我正在尝试在需要用户名和密码的域后面获取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?

python python-3.x pdf-generation urllib mechanicalsoup
1个回答
0
投票

您当然可以使用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以了解此功能的开发。

© www.soinside.com 2019 - 2024. All rights reserved.