如果文件未向公众开放,则 Python 3 Mechanizesoup 从网站下载文件会损坏

问题描述

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

一开始我以为这只是和pdf有关,直到我使用“代码”应用打开输出pdf,发现它实际上是主页的htm。

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

我在 Internet 上看到了很多关于损坏的下载文件的讨论。但是,如果我使用真正的浏览器,则下载有效。我无法进行手动下载,因为我有数百个文件要备份。 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()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...