iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
Software Development

Python 爬蟲這樣學,一定是大拇指拉!系列 第 27

[Python 爬蟲這樣學,一定是大拇指拉!] DAY27 - 實戰演練:重複使用 TCP 連線

重複使用 TCP 連線

本篇章請搭配以下一起服用:

不知道各位還記不記得 HTTP 的特性,就是每次的連線都是獨立的連線。
所以像前一篇多執行緒 - 抓取多個個股收盤價,明明我們是連續對同一個 domain 送 request,卻每次都得重新建立新連線(重新三方交握)。這樣當連線量大時,效能也會變差。所以有沒有解決辦法呢?

有解決辦法!就是使用 Requests 套件裡的 Session 物件!

引用自官方文件

The Session object allows you to persist certain parameters across requests. It also persists cookies across all requests made from the Session instance, and will use urllib3’s connection pooling. So if you’re making several requests to the same host, the underlying TCP connection will be reused, which can result in a significant performance increase (see HTTP persistent connection).

意思是說 Session 這個類別,有提供 TCP 連線能被重複利用(同個 domain 才能讓連線被重複利用)的功能,避免一直重新建立新連線。

用法相當簡單:

# 原本是直接使用 requests,現在變成先建立一個 Session 物件,使用這個物件的方法
# 而 Session 物件所提供的方法跟 requests 一模一樣
req_session = requests.Session()

req_session.get("https://www.example.com/page1")
req_session.get('https://www.example.com/page2')

# 雖然是透過同個 Session 物件送 request,但由於是不同 domain 所以會重新建立新連線
req_session.get('https://www.anotherdomain.com/page2')

我們利用上一篇多執行緒 - 抓取多個個股收盤價的程式碼來實驗看看。

未套用 Session 物件的情況:
https://ithelp.ithome.com.tw/upload/images/20211012/201393582AqZmYOoXX.png

每次連線就是重新 new 一個 connection。

套用 Session 物件後:
https://ithelp.ithome.com.tw/upload/images/20211012/20139358BP84Qb7hnL.png

同個domain的情況只會 new 一次 connection。

這樣一來不斷重新建立新連線的問題解決了!

以上就是重複使用 TCP 連線的介紹!


上一篇
[Python 爬蟲這樣學,一定是大拇指拉!] DAY26 - 實戰演練:多執行緒 - 抓取多個個股日成交資訊
下一篇
[Python 爬蟲這樣學,一定是大拇指拉!] DAY28 - 實戰演練:集大成 - 自動更新每日個股日成交資訊
系列文
Python 爬蟲這樣學,一定是大拇指拉!30

1 則留言

0
juck30808
iT邦新手 3 級 ‧ 2021-10-12 18:37:33

恭喜大大即將完賽XD !!!

一起加油GOGO!/images/emoticon/emoticon12.gif

我要留言

立即登入留言