• Python学习笔记从Web抓取信息之用requests模块从web下载文件


    随笔记录方便自己和同路人查阅。

    #------------------------------------------------我是可耻的分割线-------------------------------------------

      requests 模块让你很容易从 Web 下载文件,不必担心一些复杂的问题,诸如网络错误、连接问题和数据压缩。requests 模块不是 Python 自带的,所以必须先安装。

    通过命令行,运行 pip install requests

    #------------------------------------------------我是可耻的分割线-------------------------------------------

      1、检查requests模块是否安装成功,在交互式环境输入import requests,如果没有报错,就证明安装成功。

      这样就证明是没有问题的。

      2、用requests.get()函数下载一个网页,示例代码;

    #! python 3
    # -*- coding:utf-8 -*-
    # Autor: Li Rong Yang
    #导入第三方库
    import requests
    
    #该 URL 指向一个文本页面,其中包含整部罗密欧与朱丽叶
    res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
    
    #打印它的类型
    print(type(res))
    
    #通过检查 Response 对象的 status_code 属性,你可以了解对这个网页的请求是否成功。如果该值等于requests.codes.ok,那么一切都好
    if res.status_code == requests.codes.ok:
        print('True')
    else:
        print('False')
    
    #打印大小
    print(len(res.text))
    
    #打印文本内容
    print(res.text[:250])
    

      运行结果:

      requests.get()函数接受一个要下载的 URL 字符串。通过在 requests.get()的返回值上调用 type(),你可以看到它返回一个 Response 对象,其中包含了 Web 服务器对

    你的请求做出的响应。

      该 URL 指向一个文本页面,其中包含整部罗密欧与朱丽叶。通过检查 Response 对象的 status_code 属性,你可以了解对这个网页的请求是否成功。如果该值等于requests.codes.ok,那么一切都好(顺便说一下,HTTP协议中“OK”的状态码是 200。你可能已经熟悉404 状态码,它表示“没找到”)。如果请求成功,下载的页面就作为一个字符串,保存在 Response 对象的 text变量中。这个变量保存了包含整部戏剧的一个大字符串,调用 len(res.text)表明,它的长度超过 178000 个字符。最后,调用 print(res.text[:250])显示前 250 个字符。

      3、检查错误

      正如你看到的,Response 对象有一个 status_code 属性,可以检查它是否等于requests.codes.ok,了解下载是否成功。检查成功有一种简单的方法,就是在 Response

    对象上调用 raise_for_status()方法。如果下载文件出错,这将抛出异常。如果下载成功,就什么也不做。

      raise_for_status()方法,下载错误,示例代码:

    #! python 3
    # -*- coding:utf-8 -*-
    # Autor: Li Rong Yang
    import requests
    res = requests.get('http://inventwithpython.com/page_ _that_ _does_ _not_ _exist')
    res.raise_for_status()
    

      运行结果:

      raise_for_status()方法,下载正常,示例代码: 

    #! python 3
    # -*- coding:utf-8 -*-
    # Autor: Li Rong Yang
    import requests
    res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
    res.raise_for_status()
    

      运行结果:

     

      raise_for_status()方法是一种很好的方式,确保程序在下载失败时停止。这是一件好事:你希望程序在发生未预期的错误时,马上停止。如果下载失败对程序来说

    不够严重,可以用 try 和 except 语句将 raise_for_status()代码行包裹起来,处理这一错误,不让程序崩溃。

      遇到下载错误是不停止工作,示例代码:

    #! python 3
    # -*- coding:utf-8 -*-
    # Autor: Li Rong Yang
    import requests
    '''
    遇到下载错误不停止工作
    '''
    res = requests.get('http://inventwithpython.com/page_ _that_ _does_ _not_ _exist')
    try:
        res.raise_for_status()
    except Exception as exc:
        print('there was a problem: %s'%(exc))
    

      运行结果:

      4、将下载文件保存在硬盘

      现在,可以用标准的 open()函数和 write()方法,将 Web 页面保存到硬盘中的一个文件。但是,这里稍稍有一点不同。首先,必须用“写二进制”模式打开该文件,即向函数传入字符串'wb',作为 open()的第二参数。即使该页面是纯文本的(例如前面下载的罗密欧与朱丽叶的文本),你也需要写入二进制数据,而不是文本数据,目的是为了保存该文本中的“Unicode 编码”。

      为了将 Web 页面写入到一个文件,可以使用 for 循环和 Response 对象的iter_content()方法。

       示例代码:

    #! python 3
    # -*- coding:utf-8 -*-
    # Autor: Li Rong Yang
    import requests
    res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
    try:
        res.raise_for_status()
    except Exception as exc:
        print('there was a problem: %s' % (exc))
        
    playFile = open('d:\RomeoAndJuliet.txt','wb')
    
    #iter_content方法,循环的每次迭代中
    for chunk in res.iter_content(100000):
        #把每次迭代内容写入文件
        playFile.write(chunk)
    playFile.close()
    

      运行结果:会把下载内容写入指定文件

  • 相关阅读:
    Promise对象
    前端跨域处理
    ajax
    增删改查
    2018牛客暑假多校三 E(KMP运用)
    2018牛客暑假多校三 C (平衡树)
    2018牛客暑假多校三 A(01背包)
    HDU 6315 (2018多校第二场)(线段树)
    2018暑假牛客多校二 C(凸包)
    HDU 6299(多校第一场B)(贪心)
  • 原文地址:https://www.cnblogs.com/lirongyang/p/9689665.html
Copyright © 2020-2023  润新知