iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 6
0
AI & Data

Scrapy爬蟲與資料處理30天筆記系列 第 6

[Day 06] requests 發送HTTP請求

Day 06

嗨,今天是1/6又多了一點點的第六天,就來說明requests吧!
除了前面所介紹的JSON, CSV 資料格式,並不是需要的資料都已經整理成這些格式了,所以才需要透過爬蟲去取得資料,而要得到網頁資料的第一步就是發送請求啦!

Requests allows you to send organic, grass-fed HTTP/1.1 requests, without the need for manual labor. There’s no need to manually add query strings to your URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling are 100% automatic, thanks to urllib3.

翻譯過來就是說Requests允許我們發送與接收有機及草飼的 HTTP/1.1 請求 (?) 不需要手動的勞工、將查詢字串添加到Url、對POST數據進行編碼。多虧urllib3 它能夠跟HTTP連接池保持連線且100%自動。

在開始之前要確定環境啦,安裝requests這個套件:

  • (option) 啟用virtualenv
source path/to/your/virtualenv/bin/activate

若沒有csv套件,可用pip安裝:

  • 若是pip3則將pip改成pip3
pip install requests

完成之後就可以開始使用了:

import requests

現在來get一個網頁吧,我們以google主頁為例:

r = requests.get('https://www.google.com')

現在我們得到一個Response物件叫做r,可以得到這個物件裡面的資訊像是status_code, url, text(網頁內容)等。

>>> r.status_code
200
>>> r.url
'https://www.google.com'
>>> r.encoding
'utf-8'
  • 這裡說明一下,在google搜尋後可以看到多了search?q=,而q後面所代的值就是google搜尋欄位輸入的值。這裡q=python3,這與直接在url上輸入跟我們在搜尋欄位打入python3是一樣的,以下是搜尋欄位搜尋的畫面:
    Imgur

現在我們來驗證它是否正確?我們將text寫入到一個HTML檔案吧!

import requests
r = requests.get('https://www.google.com/search?q=python3')
with open('./searchContent.html', 'w+') as f:
  f.write(r.text)
  print('saved')

執行完確認沒有錯誤之後,我們可以看到當前目錄多了一個searchContent.html的檔案。
直接打開它會看到:

Imgur

  • 取得到的內容便是沒有經過js, css渲染美化的內容。透過這個方式我們就可以取得它的搜尋結果等需要的內容,之後也會提到該如何去解析它成為拿到我們要的資料。

  • 也能用參數的方式,以dictionary的格式代入params參數內:

import requests
payload = {
    'q':'python2'
}
r = requests.get('https://www.google.com/search?', params=payload)
with open('./searchContent.html', 'w+') as f:
  f.write(r.text)
  print('saved')

效果是一樣的!

當然,也有其他HTTP方法可以使用:

>>> r = requests.post('https://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('https://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('https://httpbin.org/delete')
>>> r = requests.head('https://httpbin.org/get')
>>> r = requests.options('https://httpbin.org/get')

有興趣的可以直接到 Quickstart — Requests 2.19.1 documentation

再來說明header,可以透過headers這個方法會得到伺服器回傳為一個dictionary的格式:

>>> r.headers

header是什麼呢?

是指在HTTP中的請求和回應訊息中的訊息頭,它定義了一個超文字傳輸協定事務中的操作參數。HTTP頭部欄位可以自己根據需要定義,因此可能在Web伺服器和瀏覽器上發現非標準的頭欄位。

請求欄位內容基本上常看到的像是:
Accept : 能夠接受的回應內容類型(Content-Types)
Content-Type : 請求體的多媒體類型(用於POST和PUT請求)
Content-Encoding : 在資料上使用的編碼類型
Cache-Control : 用來指定在這次的請求/回應鏈中的所有快取機制都必須 遵守的指令

既然回傳格式是dic,便可以依照dic的方法取得參數:

r.headers['Content-Type']
# 'application/json'

也可以依照dictionary方式傳遞參數:

headers = {'user-agent': 'my-app/0.0.1'}
r = requests.get(url, headers=headers)
  • 注意:所有的header必須是String, bytestring或unicode。

今天說明了Requests的用法,介紹了如何取得response不同內容,還有header,明天會說明HTML標籤的概念,以及如何查看網頁HTML架構,之後也會說明如何解析每一項HTML元素!

參考來源:
http://docs.python-requests.org/en/master/


上一篇
[Day 05] JSON編碼解碼操作
下一篇
[Day 07] 爬蟲前要先理解的HTML架構
系列文
Scrapy爬蟲與資料處理30天筆記30

尚未有邦友留言

立即登入留言