如果文件未公开,则从网站下载的Python3 MechanizeUp文件已损坏

如果文件未公开,则从网站下载的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授权。同样的症状 我在网上看到了很多关于损坏下载

如果文件对公众开放,我的python代码就可以工作。它可以下载任何文件并在目标系统上工作。 如果文件受主机保护(非公共),则下载的文件已损坏。深入调查后,我发现是主页的html内容,而不是文件内容

起初,我认为这只与pdf相关,直到我使用“代码”应用程序打开输出pdf并发现它实际上是主页的htm

我使用urllib和Mechanizesoup登录到该站点。我可以看出,响应htm实际上是登录页面之后的主页。我尝试使用cookie和url base64授权。同样的症状

我在网上看到了很多关于损坏下载文件的讨论。然而,如果我使用真正的浏览器,下载是有效的。我不能手动下载,因为我有数百个文件要备份。Python是我知道如何自动化这种过程的唯一方法

我需要帮助

这是代码。网站和一些内容被修改以保护无辜者

__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()