在需要身份验证的网站上使用 urllib 发布下载 PDF
Issue Downloading PDF with urllib on Website Requiring Authentication
我正在尝试获取需要用户名和密码的域后面的 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?
当然可以使用 MechanicalSoup 下载 PDF。
许多StatefulBrowser methods (including StatefulBrowser.open
and StatefulBrowser.follow_link
) is a requests.Response对象的return值。如果请求成功,那么你想要的数据就存储在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 以了解此功能的开发情况。
我正在尝试获取需要用户名和密码的域后面的 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?
当然可以使用 MechanicalSoup 下载 PDF。
许多StatefulBrowser methods (including StatefulBrowser.open
and StatefulBrowser.follow_link
) is a requests.Response对象的return值。如果请求成功,那么你想要的数据就存储在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 以了解此功能的开发情况。