[Python 爬虫这样学,一定是大拇指拉!] DAY20 - Python:Requests 基本应用 (3)

这篇是基础应用的最後一篇,主要补充讲解几个基本功能。

检查 Response Status

  • 当我们在爬虫拿到 Response 时,通常为了要确保内容正确,都会检查 HTTP Status,如果不是 200 的话,就得要做一些例外处理,传统的做法会像是:

    import requests
    
    r = requests.get("https://www.example.com")
    
    # 方法1
    if r.status_code != 200:
        # do something here
    
    # 方法2
    if r.status_code != requests.codes.ok:
       # do something here
    
  • Requests 有提供更方便的做法:

    import requests
    
    r = requests.get("https://www.example.com")
    
    # 如果 status != 200 就会 throw exception 
    r.raise_for_status()  
    

    使用 raise_for_status() 的话,程序就会 raise 一个 requests.exceptions.HTTPError,让使用者可以更好的集中处理这些 errors。
    以下是官方范例:

    >>> bad_r = requests.get("https://httpbin.org/status/404")
    >>> bad_r.status_code
    404
    
    >>> bad_r.raise_for_status()
    Traceback (most recent call last):
    File "requests/models.py", line 832, in raise_for_status
      raise http_error
    requests.exceptions.HTTPError: 404 Client Error
    

    HTTP Status 复习传送门

Timeouts

  • 当然,爬虫时万一遇到网路状况,我们总不可能让程序继续在那边一直 retry 直到系统 timeout 而浪费频宽,因此 Requests 套件有提供自定义 timeout 的方式,让爬虫程序写起来更有弹性。

    import requests
    
    r = requests.get("https://www.example.com", timeout=1)
    # 如果 timeout 就会 throw exception 
    

    timeout 的话,程序就会 raise 一个 requests.exceptions.Timeout。
    以下是官方范例:

    >>> requests.get("https://github.com/", timeout=0.001)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
    

Errors and Exceptions

  • 稍微整理一下 Requests 套件的 Exceptions:
    • 当遇到一些网路问题,像是:DNS failure、refused connection 等, 会 raise requests.exceptions.ConnectionError。
    • 所有 Requests 套件自身的 Exception 都是继承自 requests.exceptions.RequestException。

以上就是 Requests 套件的基本应用解说!
到目前为止,基本上可以应付大部分情况了,接下来的篇章将要进入实作篇罗!

另外这是 Requests 的 Interface 文件,如果读者有时间的话可以稍微看一下。可以更清楚知道怎麽使用套件内的功能。

本篇章"Python:Requests 基本应用"系列参考资料

[1] Requests - Quickstart


<<:  Android Studio初学笔记-Day20-AlertDialog(1)

>>:  Day26条件运算式if... else(JavaScript)

android studio 30天学习笔记-day 17-TabLayout+TabItem

TabLayout提供了一个水平的布局方式显示,TabItem是TabLayout显示的物件。 de...

[Day26] Micro Services

在前几天的 App Engine 与 K8S 中,或许我已经大致的提过 Micro Services...

Day 10 - SELECT INTO !

今天来认识一下SELECT INTO吧!SELECT INTO用来从某资料表查询所得之资料集结果新增...

Day 25 : 插件篇 04 — 如何让 Obsidian 自动推荐关联笔记 (下)?介绍我的笔记架构与 Breadcrumbs 实战应用

介绍 这是 Obsidian 使用教学 — 应用篇的第 4 篇文章。 在 上一篇文章 中我介绍了 B...

【Day 23】深度学习实作 --- "Hello world"

今天使用的toolkit是Keras,使用的资料集是MNIST的data,而Keras提供了自动下载...