如果文件未公开,则从网站下载的Python3 MechanizeUp文件已损坏
如果文件对公众开放,我的python代码就可以工作。它可以下载任何文件并在目标系统上工作。 如果文件受主机保护(非公共),则下载的文件已损坏。深入调查后,我发现是主页的html内容,而不是文件内容 起初,我认为这只与pdf相关,直到我使用“代码”应用程序打开输出pdf并发现它实际上是主页的htm 我使用urllib和Mechanizesoup登录到该站点。我可以看出,响应htm实际上是登录页面之后的主页。我尝试使用cookie和url base64授权。同样的症状 我在网上看到了很多关于损坏下载文件的讨论。然而,如果我使用真正的浏览器,下载是有效的。我不能手动下载,因为我有数百个文件要备份。Python是我知道如何自动化这种过程的唯一方法 我需要帮助 这是代码。网站和一些内容被修改以保护无辜者如果文件未公开,则从网站下载的Python3 MechanizeUp文件已损坏,python,python-3.x,urllib,mechanize-python,Python,Python 3.x,Urllib,Mechanize Python,如果文件对公众开放,我的python代码就可以工作。它可以下载任何文件并在目标系统上工作。 如果文件受主机保护(非公共),则下载的文件已损坏。深入调查后,我发现是主页的html内容,而不是文件内容 起初,我认为这只与pdf相关,直到我使用“代码”应用程序打开输出pdf并发现它实际上是主页的htm 我使用urllib和Mechanizesoup登录到该站点。我可以看出,响应htm实际上是登录页面之后的主页。我尝试使用cookie和url base64授权。同样的症状 我在网上看到了很多关于损坏下载
__author__ = 'it@lsyc.com'
# Alex 2021-04-23, initial coding
import urllib
import urllib.request
import base64
# from base64 import b64encode
import json
import re
import os
import datetime
from io import BytesIO
import mechanicalsoup # Don’t forget to import the new module
from bs4 import BeautifulSoup
## These are fake url, user and passwords. Real site exists
WA_URL = "https://hosted.services.org"
LOGIN_URL = "https://hosted.services.org/Sys/Login"
LOGIN = "alex@gmail.com"
PASSWORD = "Crazy1991#$"
# LOGIN:PASSWORD = alex@gmail.com:Crazy1991#$
# following encoded with base64
auth_header = "YWxleGNvMzhAZ21haWwuY29tOkthaXplbjE5OTEjJA=="
## Try to use cookies, no difference
def save_cookies(browser):
return browser.session.cookies.get_dict()
def load_cookies(browser, cookies):
from requests.utils import cookiejar_from_dict
browser.session.cookies = cookiejar_from_dict(cookies)
## url-A works because it is public access
url='https://hosted.services.org/resources/Documents/Reciprocal%20List%202018.pdf'
# url-B corrupts because it's restricted but not admin
# url='https://hosted.services.org/resources/Documents/IT%20Security%20and%20Web%20Terms%20and%20Conditions.pdf'
## This proc uses mechanizesoup
browser = mechanicalsoup.StatefulBrowser()
browser.open(WA_URL) # WA site
cookies = save_cookies(browser) # save and reload the cookie
load_cookies(browser, cookies)
browser.select_form('form[action="https://hosted.services.org/Sys/Login"]') # WA login page
# browser.get_current_form().print_summary() # print form inputs
browser.get_current_form().set_input({"email": LOGIN, "password": PASSWORD})
response = browser.submit_selected() # hit the submit button
# browser.add_header("Authorization", 'Basic ' + auth_header)
response = browser.open(url, headers={'Authorization': 'Basic %s' % auth_header})
with open('WA_Copy.pdf', 'wb') as f:
f.write(response.content)
browser.close()