首页 > 解决方案 > 为什么在 python 中下载图像时必须同时保存 png 和 txt 文件?

问题描述

我想做的是使用请求从链接下载图像,唯一的问题是我需要登录才能做到这一点,所以这就是我有 make_session 功能的原因,它的目的是登录。我也应该说我的代码有效,但我不知道它为什么有效,我让它工作的方式对我来说毫无意义,所以首先解释一下我是如何到达那里的。

起初我的代码只保存了一个文件,一个 .txt 或 .png 取决于我运行它的时间(该 txt 对于查看它是否已登录很有用),当我只保存一个 .txt 但没有保存时​​,该代码将登录当我只保存一个 .png 时,我在两次运行之间唯一改变的是变量文件名。当您实际运行代码时,很容易查看它是否在登录失败时作为文件大小工作,txt 和 png 都是 32kb,但是 png 没有打开(显然)。这已经让我感到困惑,因为保存的文件的扩展名不应该是确定它是否有效的唯一因素。

最终,我尝试保存 png 和 txt 并且它可以正常工作,png 正确显示并且与 txt 文件大小相同,保存的顺序也无关紧要,因为两个命令都有效。所以我的主要问题是为什么?现在我只是保存了一个额外的 txt 文件,这没什么大不了的,但我对为什么需要它感到非常困惑,我还应该说我已经对此进行了足够彻底的测试,以至于我 100% 确信这是唯一的在它工作和不工作之间做出改变。

这也是较大代码的一部分,但代码中没有其他地方使用会话或使用任一函数中的任何变量(这是唯一可能影响它的部分。)

def make_session():
    s = requests.Session()
    user, password = '****', '****'

    r = s.get("https://moodle-ts.adlc.ca/login/index.php")
    cookie = r.cookies.get_dict()
    pattern = '<input type="hidden" name="logintoken" value="\w{32}">'
    token = re.findall(pattern, r.text)
    token = re.findall("\w{32}", token[0])
    payload = {'username': user, 'password': password, 'anchor': '', 'logintoken': token[0], 'rememberusername': 1}
    r = s.post("https://moodle-ts.adlc.ca/login/index.php", cookies=cookie, data=payload)   
    return(s)


def download_image(page_content, driver, s):
    images = page_content.find_elements_by_tag_name("img")      
    for img in images:
        src = img.get_attribute('src')
        ext = src[-3:]
        file_name = "image." + "png"    
        img_info = s.get(src)
    
        with open(file_name, 'wb') as f:
            f.write(img_info.content)
            f.close()
        with open("image.txt", 'wb') as f:
            f.write(img_info.content)
            f.close()

我从How to login moodle with requests 中获得了很多 make_session 功能?

任何关于为什么会发生这种情况的见解将不胜感激,因为我很想更好地理解这一点!

标签: pythonphpauthenticationsessionrequest

解决方案


推荐阅读