杰瑞科技汇

Python下载1001次?为何要重复下载?

  1. 您想找1001个与Python下载相关的资源或教程。
  2. 您想学习如何用Python代码实现下载功能(例如下载文件、网页等),并且希望有非常全面的示例(1001个可能是个夸张的说法,表示“非常全面”)。

根据问题的常见性,我猜测您更可能是想了解第二种情况:如何用Python编写下载脚本,这是一个非常实用且常见的编程任务。

Python下载1001次?为何要重复下载?-图1
(图片来源网络,侵删)

下面我将为您提供一份从入门到精通的Python下载指南,涵盖了从最简单的下载到处理复杂场景(如登录、动态加载)的各种方法。


Python 下载终极指南

我们将使用几种不同的库和方法,以应对不同的下载需求。

下载一个简单的静态文件(如图片、PDF、CSV)

这是最基础的需求,我们可以使用 Python 内置的 urllib 库或者第三方流行的 requests 库。

方法 1:使用 requests 库 (推荐)

requests 库语法简洁,功能强大,是处理HTTP请求的首选。

Python下载1001次?为何要重复下载?-图2
(图片来源网络,侵删)

第一步:安装 requests

pip install requests

第二步:编写下载脚本

import requests
import os
def download_file(url, file_path):
    """
    从指定URL下载文件并保存到本地路径
    """
    try:
        # 发送 GET 请求,stream=True 表示流式下载,节省内存
        response = requests.get(url, stream=True)
        response.raise_for_status()  # 如果请求失败 (状态码不是 2xx),则抛出异常
        # 获取文件名(从URL中提取)
        # 如果URL没有文件名,可以使用一个默认名
        file_name = os.path.basename(url)
        if not file_name:
            file_name = "downloaded_file"
        # 确保文件名是有效的
        if not file_name.endswith(('.jpg', '.png', '.pdf', '.csv', '.txt')):
             # 如果没有扩展名,可以尝试从Content-Type获取,或者直接添加
            content_type = response.headers.get('content-type', '')
            if 'image' in content_type:
                file_name += '.jpg' # 假设是图片
            else:
                file_name += '.dat' # 未知类型
        # 完整的保存路径
        save_path = os.path.join(file_path, file_name)
        print(f"开始下载: {url}")
        print(f"保存到: {save_path}")
        # 使用 with open 写入文件,chunk_by_chunk 防止内存溢出
        with open(save_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192): # 8KB的块
                f.write(chunk)
        print(f"下载完成!文件已保存至: {save_path}")
        return save_path
    except requests.exceptions.RequestException as e:
        print(f"下载失败: {e}")
        return None
# --- 使用示例 ---
if __name__ == "__main__":
    # 要下载的文件URL
    file_url = "https://www.python.org/static/community_logos/python-logo-master-v3-TM.png"
    # 你想保存文件的本地文件夹
    save_directory = "downloaded_files"
    # 如果文件夹不存在,则创建
    if not os.path.exists(save_directory):
        os.makedirs(save_directory)
    # 调用函数下载文件
    download_file(file_url, save_directory)

方法 2:使用 urllib (无需安装)

urllib 是 Python 的标准库,无需额外安装,但语法相对繁琐一些。

import urllib.request
import os
def download_file_urllib(url, file_path):
    try:
        file_name = os.path.basename(url)
        save_path = os.path.join(file_path, file_name)
        print(f"开始下载 (urllib): {url}")
        urllib.request.urlretrieve(url, save_path) # 直接下载到指定路径
        print(f"下载完成!文件已保存至: {save_path}")
        return save_path
    except Exception as e:
        print(f"下载失败: {e}")
        return None
# --- 使用示例 ---
if __name__ == "__main__":
    file_url = "https://www.python.org/static/community_logos/python-logo-master-v3-TM.png"
    save_directory = "downloaded_files_urllib"
    if not os.path.exists(save_directory):
        os.makedirs(save_directory)
    download_file_urllib(file_url, save_directory)

下载一个网页(HTML内容)

这通常是为了抓取网页数据。requests 同样是最佳选择。

import requests
def download_webpage(url):
    """
    下载指定URL的网页内容
    """
    try:
        # 设置一个User-Agent,模拟浏览器访问,避免被某些网站拦截
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        response.raise_for_status()  # 检查请求是否成功
        # response.text 获取解码后的文本内容
        html_content = response.text
        print(f"成功下载网页: {url}")
        # print(html_content[:500]) # 打印前500个字符
        return html_content
    except requests.exceptions.RequestException as e:
        print(f"下载网页失败: {e}")
        return None
# --- 使用示例 ---
if __name__ == "__main__":
    webpage_url = "http://quotes.toscrape.com/" # 一个为爬虫练习设计的网站
    content = download_webpage(webpage_url)
    if content:
        # 可以将内容保存到文件
        with open("quotes.html", "w", encoding="utf-8") as f:
            f.write(content)
        print("网页内容已保存到 quotes.html")

处理需要登录才能访问的页面

很多网站需要登录后才能下载资源,这通常涉及到 Cookies 或 Session 的管理。

import requests
def download_with_session(login_url, download_url, username, password):
    """
    使用 Session 处理需要登录的下载
    """
    # 创建一个 Session 对象
    with requests.Session() as session:
        # 1. 访问登录页,获取必要的token(如果需要)
        # login_page = session.get(login_url)
        # ... 解析 login_page.text 获取CSRF token等 ...
        # 2. 准备登录数据
        # 注意:这里的 'username', 'password', 'csrf_token' 是占位符
        # 你需要用实际的表单字段名替换
        login_data = {
            'username': username,
            'password': password,
            # 'csrfmiddlewaretoken': '...' # 如果网站有CSRF保护
        }
        # 3. 发送登录请求
        print("正在登录...")
        login_response = session.post(login_url, data=login_data)
        # 检查登录是否成功 (检查是否重定向到首页或登录失败的关键字)
        if "登录失败" in login_response.text or login_response.url == login_url:
            print("登录失败,请检查用户名和密码,或表单字段名是否正确。")
            return None
        print("登录成功!")
        # 4. 使用已登录的 Session 下载文件
        print("正在下载受保护的文件...")
        download_response = session.get(download_url, stream=True)
        download_response.raise_for_status()
        file_name = "protected_file.zip"
        with open(file_name, 'wb') as f:
            for chunk in download_response.iter_content(chunk_size=8192):
                f.write(chunk)
        print(f"文件 {file_name} 下载完成!")
# --- 使用示例 ---
if __name__ == "__main__":
    # !!! 注意:以下仅为示例,你需要替换成真实的网站信息 !!!
    # LOGIN_URL = "https://example.com/login/"
    # DOWNLOAD_URL = "https://example.com/protected/resource.zip"
    # USERNAME = "your_username"
    # PASSWORD = "your_password"
    # 由于没有真实网站,这里注释掉调用
    # download_with_session(LOGIN_URL, DOWNLOAD_URL, USERNAME, PASSWORD)
    print("请取消注释并填写真实的登录和下载URL来测试此功能。")

处理由 JavaScript 动态加载的内容

现代网站(如单页应用 SPA)很多内容是通过 JavaScript 在浏览器中动态加载的。requests 只能获取初始的 HTML,看不到 JS 渲染后的内容,这时我们需要一个“无头浏览器”。

使用 selenium + webdriver

Selenium 可以模拟一个真实的浏览器,执行 JavaScript,然后获取最终渲染后的页面。

第一步:安装 selenium

pip install selenium

第二步:下载浏览器驱动 Selenium 需要一个浏览器驱动来控制你的浏览器(如 Chrome, Firefox)。

  • ChromeDriver: [https://googlechromelabs.github.io
分享:
扫描分享到社交APP
上一篇
下一篇