小能豆

使用 Python 3 从网络下载文件

javascript

我正在创建一个程序,它将通过读取同一游戏/应用程序的 .jad 文件中指定的 URL 从 Web 服务器下载 .jar (java) 文件。我使用的是 Python 3.2.1

我已设法从 JAD 文件中提取了 JAR 文件的 URL(每个 JAD 文件都包含 JAR 文件的 URL),但正如您可能想象的那样,提取的值是 type() 字符串。

相关函数如下:

def downloadFile(URL=None):
    import httplib2
    h = httplib2.Http(".cache")
    resp, content = h.request(URL, "GET")
    return content

downloadFile(URL_from_file)

但是我总是得到一个错误,说上面的函数中的类型必须是字节,而不是字符串。我试过使用 URL.encode(‘utf-8’) 和 bytes(URL,encoding=’utf-8’),但总是得到相同或类似的错误。

所以基本上我的问题是当 URL 以字符串类型存储时如何从服务器下载文件?


阅读 49

收藏
2024-09-02

共1个答案

小能豆

在 Python 3.2.1 中,该httplib2库可处理字符串(而非字节)形式的 URL。您遇到的错误可能是由于对 URL 中的 Unicode 字符处理不正确,或者代码的其他部分可能导致问题。

要从字符串格式的 URL 下载文件,请按照以下正确使用方法操作httplib2

分步解决方案

  1. 确保 URL 是格式正确的字符串。
  2. 用于httplib2.Http发出请求并处理响应。

这是更正后的函数:

import httplib2

def downloadFile(URL=None):
    if URL is None:
        raise ValueError("A valid URL must be provided")

    # Ensure that the URL is a string and properly encoded
    h = httplib2.Http(".cache")
    resp, content = h.request(URL, "GET")

    if resp.status == 200:  # Check if the request was successful
        # Return the content if the download is successful
        return content
    else:
        raise Exception(f"Failed to download file, HTTP status: {resp.status}")

# Example usage:
URL_from_file = "http://example.com/file.jar"  # Replace with your actual URL
jar_content = downloadFile(URL_from_file)

# Optionally, save the content to a file
with open("downloaded_file.jar", "wb") as file:
    file.write(jar_content)

解释

  1. 字符串处理httplib2在 Python 3.x 中,URL 应为字符串。该request()方法应该可以正常工作。
  2. 检查响应状态:检查 HTTP 响应状态代码 ( resp.status) 始终是一个好习惯。状态200表示请求成功。
  3. 保存文件:如果要将下载的内容保存到文件,请使用open()二进制模式("wb"),因为内容以字节为单位。

常见问题

  • 无效的 URL:请确保 URL 格式正确(没有多余的空格或未转义的字符)。
  • 字符编码:如果 URL 包含非 ASCII 字符,则可以使用它进行编码urllib.parse.quote以确保其对于 HTTP 请求是安全的。

其他注意事项

如果httplib2仍然出现问题,请考虑使用更现代requests、更用户友好的库:

import requests

def downloadFile(URL=None):
    if URL is None:
        raise ValueError("A valid URL must be provided")

    response = requests.get(URL)

    if response.status_code == 200:
        return response.content
    else:
        raise Exception(f"Failed to download file, HTTP status: {response.status_code}")

# Example usage:
URL_from_file = "http://example.com/file.jar"  # Replace with your actual URL
jar_content = downloadFile(URL_from_file)

# Optionally, save the content to a file
with open("downloaded_file.jar", "wb") as file:
    file.write(jar_content)

requests对于 Python 中的 HTTP 请求来说功能更强大,并且通常更易于使用。

2024-09-02