1. 程式人生 > >Python爬蟲大殺器之Requests快速入門

Python爬蟲大殺器之Requests快速入門

轉載:http://blog.csdn.net/iloveyin/article/details/21444613

快速上手

迫不及待了嗎?本頁內容為如何入門Requests提供了很好的指引。其假設你已經安裝了Requests。如果還沒有, 去 安裝 一節看看吧。

首先,確認一下:

讓我們從一些簡單的示例開始吧。

傳送請求

使用Requests傳送網路請求非常簡單。

一開始要匯入Requests模組:

>>> import requests

然後,嘗試獲取某個網頁。本例子中,我們來獲取Github的公共時間線

>>> r = requests.get('https://github.com/timeline.json')

現在,我們有一個名為 r 的 Response 物件。可以從這個物件中獲取所有我們想要的資訊。

Requests簡便的API意味著所有HTTP請求型別都是顯而易見的。例如,你可以這樣傳送一個HTTP POST請求:

>>> r = requests.post("http://httpbin.org/post")

漂亮,對吧?那麼其他HTTP請求型別:PUT, DELETE, HEAD以及OPTIONS又是如何的呢?都是一樣的簡單:

>>> r = requests.put("http://httpbin.org/put")
>>> r = requests.delete("http://httpbin.org/delete")
>>> r = requests.head("http://httpbin.org/get")
>>> r = requests.options("http://httpbin.org/get")

都很不錯吧,但這也僅是Requests的冰山一角呢。

為URL傳遞引數

你也許經常想為URL的查詢字串(query string)傳遞某種資料。如果你是手工構建URL,那麼資料會以鍵/值 對的形式置於URL中,跟在一個問號的後面。例如,httpbin.org/get?key=val

 。 Requests允許你使用 params 關鍵字引數,以一個字典來提供這些引數。舉例來說,如果你想傳遞 key1=value1 和 key2=value2 到 httpbin.org/get ,那麼你可以使用如下程式碼:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload)

通過列印輸出該URL,你能看到URL已被正確編碼:

>>> print r.url
u'http://httpbin.org/get?key2=value2&key1=value1'

響應內容

我們能讀取伺服器響應的內容。再次以Github時間線為例:

>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.text
'[{"repository":{"open_issues":0,"url":"https://github.com/...

Requests會自動解碼來自伺服器的內容。大多數unicode字符集都能被無縫地解碼。

請求發出後,Requests會基於HTTP頭部對響應的編碼作出有根據的推測。當你訪問r.text 之時,Requests會使用其推測的文字編碼。你可以找出Requests使用了什麼編碼,並且能夠使用 r.encoding 屬性來改變它:

>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'

如果你改變了編碼,每當你訪問 r.text ,Request都將會使用 r.encoding 的新值。

在你需要的情況下,Requests也可以使用定製的編碼。如果你建立了自己的編碼,並使用codecs 模組進行註冊,你就可以輕鬆地使用這個解碼器名稱作為 r.encoding 的值, 然後由Requests來為你處理編碼。

二進位制響應內容

你也能以位元組的方式訪問請求響應體,對於非文字請求:

>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...

Requests會自動為你解碼 gzip 和 deflate 傳輸編碼的響應資料。

例如,以請求返回的二進位制資料建立一張圖片,你可以使用如下程式碼:

>>> from PIL import Image
>>> from StringIO import StringIO
>>> i = Image.open(StringIO(r.content))

JSON響應內容

Requests中也有一個內建的JSON解碼器,助你處理JSON資料:

>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...

如果JSON解碼失敗, r.json 就會丟擲一個異常。

原始響應內容

在罕見的情況下你可能想獲取來自伺服器的原始套接字響應,那麼你可以訪問 r.raw 。 如果你確實想這麼幹,那請你確保在初始請求中設定了 stream=True 。具體的你可以這麼做:

>>> r = requests.get('https://github.com/timeline.json', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

定製請求頭

如果你想為請求新增HTTP頭部,只要簡單地傳遞一個 dict 給 headers 引數就可以了。

例如,在前一個示例中我們沒有指定content-type:

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> headers = {'content-type': 'application/json'}

>>> r = requests.post(url, data=json.dumps(payload), headers=headers)

更加複雜的POST請求

通常,你想要傳送一些編碼為表單形式的資料—非常像一個HTML表單。 要實現這個,只需簡單地傳遞一個字典給 data 引數。你的資料字典 在發出請求時會自動編碼為表單形式:

>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print r.text
{
  ...
  "form": {
    "key2": "value2",
    "key1": "value1"
  },
  ...
}

很多時候你想要傳送的資料並非編碼為表單形式的。如果你傳遞一個 string 而不是一個dict ,那麼資料會被直接釋出出去。

例如,Github API v3接受編碼為JSON的POST/PATCH資料:

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

>>> r = requests.post(url, data=json.dumps(payload))

POST一個多部分編碼(Multipart-Encoded)的檔案

Requests使得上傳多部分編碼檔案變得很簡單:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}

你可以顯式地設定檔名:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'))}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "<censored...binary...data>"
  },
  ...
}

如果你想,你也可以傳送作為檔案來接收的字串:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}

>>> r = requests.post(url, files=files)
>>> r.text
{
  ...
  "files": {
    "file": "some,data,to,send\\nanother,row,to,send\\n"
  },
  ...
}

響應狀態碼

我們可以檢測響應狀態碼:

>>> r = requests.get('http://httpbin.org/get')
>>> r.status_code
200

為方便引用,Requests還附帶了一個內建的狀態碼查詢物件:

>>> r.status_code == requests.codes.ok
True

如果傳送了一個失敗請求(非200響應),我們可以通過 Response.raise_for_status() 來丟擲異常:

>>> bad_r = requests.get('http://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

但是,由於我們的例子中 r 的 status_code 是 200 ,當我們呼叫 raise_for_status() 時,得到的是:

>>> r.raise_for_status()
None

一切都挺和諧哈。

響應頭

我們可以檢視以一個Python字典形式展示的伺服器響應頭:

>>> r.headers
{
    'status': '200 OK',
    'content-encoding': 'gzip',
    'transfer-encoding': 'chunked',
    'connection': 'close',
    'server': 'nginx/1.0.4',
    'x-runtime': '148ms',
    'etag': '"e1ca502697e5c9317743dc078f67693f"',
    'content-type': 'application/json; charset=utf-8'
}

但是這個字典比較特殊:它是僅為HTTP頭部而生的。根據 RFC 2616 , HTTP頭部是大小寫不敏感的。

因此,我們可以使用任意大寫形式來訪問這些響應頭欄位:

>>> r.headers['Content-Type']
'application/json; charset=utf-8'

>>> r.headers.get('content-type')
'application/json; charset=utf-8'

如果某個響應頭欄位不存在,那麼它的預設值為 None

>>> r.headers['X-Random']
None

Cookies

如果某個響應中包含一些Cookie,你可以快速訪問它們:

>>> url = 'http://example.com/some/cookie/setting/url'
>>> r = requests.get(url)

>>> r.cookies['example_cookie_name']
'example_cookie_value'

要想傳送你的cookies到伺服器,可以使用 cookies 引數:

>>> url = 'http://httpbin.org/cookies'
>>> cookies = dict(cookies_are='working')

>>> r = requests.get(url, cookies=cookies)
>>> r.text
'{"cookies": {"cookies_are": "working"}}'

重定向與請求歷史

使用GET或OPTIONS時,Requests會自動處理位置重定向。

Github將所有的HTTP請求重定向到HTTPS。可以使用響應物件的 history 方法來追蹤重定向。 我們來看看Github做了什麼:

>>> r = requests.get('http://github.com')
>>> r.url
'https://github.com/'
>>> r.status_code
200
>>> r.history
[<Response [301]>]

Response.history 是一個:class:Request 物件的列表,為了完成請求而建立了這些物件。這個物件列表按照從最老到最近的請求進行排序。

如果你使用的是GET或OPTIONS,那麼你可以通過 allow_redirects 引數禁用重定向處理:

>>> r = requests.get('http://github.com', allow_redirects=False)
>>> r.status_code
301

            
           

相關推薦

Python爬蟲Requests快速入門

轉載:http://blog.csdn.net/iloveyin/article/details/21444613 快速上手 迫不及待了嗎?本頁內容為如何入門Requests提供了很好的指引。其假設你已經安裝了Requests。如果還沒有, 去 安裝 一節看看吧。

資料學習Hadoop快速入門

1、Hadoop生態概況 Hadoop是一個由Apache基金會所開發的分散式系統整合架構,使用者可以在不瞭解分散式底層細節情況下,開發分散式程式,充分利用叢集的威力來進行高速運算與儲存,具有可靠、高效、可伸縮的特點。 大資料學習資料分享群119599574 Hadoop

python爬蟲學習實踐(一):requests庫和正則表示式淘寶爬蟲實戰

使用requests庫是需要安裝的,requests庫相比urllib 庫來說更高階方便一點,同時與scrapy相比較還是不夠強大,本文主要介紹利用requests庫和正則表示式完成一項簡單的爬蟲小專案----淘寶商品爬蟲。有關於更多requests庫的使用方法請參考:官方文件第一步:我們先開啟淘寶網頁然後搜

單頁面(如react,vue)網站的伺服器渲染 SSR SEO Rendertron

單頁面網站,比如vue、recat框架的網站,一般都是直接從伺服器推送index.html,再根據自身路由通過js在客戶端瀏覽器渲染出完整的html頁面。 但是搜尋引擎的爬蟲可沒有這麼智慧(實際上google就有這麼智慧,拿到js檔案自動幫你渲染好,但身在CN,將就下百度這個阿斗吧),為了SEO,要想爬蟲爬到

Python爬蟲:HTTP協議、Requests

.org clas python爬蟲 print 通用 娛樂 信息 傳輸協議 介紹 HTTP協議: HTTP(Hypertext Transfer Protocol):即超文本傳輸協議。URL是通過HTTP協議存取資源的Internet路徑,一個URL對應一個數據資源。

python 爬蟲爬取 證券星網站

爬蟲 周末無聊,找點樂子。。。#coding:utf-8 import requests from bs4 import BeautifulSoup import random import time #抓取所需內容 user_agent = ["Mozilla/5.0 (Windows NT 10.0

python 10算法二 LogisticRegression 筆記

hive ase pan tab style ade panda span uci 會使用的包 import matplotlib.pyplot as plt import pandas as pd import numpy as np 獲取數據 方式一: df

Python爬蟲進階六多進程的用法

maxsize clas 生產 依然 queue consumer mac 裏的 filesize 前言 在上一節中介紹了thread多線程庫。python中的多線程其實並不是真正的多線程,並不能做到充分利用多核CPU資源。 如果想要充分利用,在python中大部分情況需要

python爬蟲練習 -- 簽名+GUI界面(Tkinter)

語言 gen 模塊 geometry rep mode 窗口 下載 參考 效果圖: 實現步驟如下: 實現原理:其實就是套了一層GUI的殼,主要還是爬蟲抓取某個網站返回的數據,然後利用python自帶的GUI工具包Tkinter來實現gui界面: 1.爬蟲分析: 目標站點:

一文讀懂機器學習XGBoost原理

結構 近似算法 機器 form con gin fff .cn tran http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一種。Boosting算法的思想是將許多弱分類器集成在

Python爬蟲【解析庫beautifulsoup】

close **kwargs contents pip and lac 代碼 ide num 解析庫的安裝 pip3 install beautifulsoup4 初始化 BeautifulSoup(str,"解析庫") from bs4 import B

異步化,高並發

ktr apach tco 序列 etc 當前 本質 就會 out 聊聊如何讓項目異步化的一些事。 1.同步和異步,阻塞和非阻塞 同步和異步,阻塞和非阻塞, 這個幾個詞已經是老生常談,當時常常還是有很多同學分不清楚,以為同步肯定就是阻塞,異步肯定就是非阻塞,其他他們不是一回

python爬蟲學習筆記二:Requests庫詳解及HTTP協議

Requests庫的安裝:https://mp.csdn.net/postedit/83715574 r=requests.get(url,params=None,**kwargs) 這個r是Response物件 url :擬獲取頁面的url連結 params:url中的額外引數

[資料Spark]——快速入門

      本篇文件是介紹如何快速使用spark,首先將會介紹下spark在shell中的互動api,然後展示下如何使用java,scala,python等語言編寫應用。   為了良好的閱讀下面的文件,最好是結合實際的練習。首先需要下載spark,然後安裝hd

並行化-你的高併發

1.前言 想必熱愛遊戲的同學小時候,都幻想過要是自己要是能像鳴人那樣會多重影分身之術,就能一邊打遊戲一邊上課了,可惜漫畫就是漫畫,現實中並沒有這個技術,你要麼只有老老實實的上課,要麼就只有逃課去打遊戲了。雖然在現實中我們無法實現多重影分身這樣的技術,但是我們可以在計算機世界

非同步化,高併發

聊聊如何讓專案非同步化的一些事。 1.同步和非同步,阻塞和非阻塞 同步和非同步,阻塞和非阻塞, 這個幾個詞已經是老生常談,當時常常還是有很多同學分不清楚,以為同步肯定就是阻塞,非同步肯定就是非阻塞,其他他們不是一回事。 同步和非同步關注的是結果訊息的通訊機制 同步

Python 爬蟲--網站下載

       分享一個自己寫的網站下載器,程式語言是 Python。這個網站下載器主要下載網站可訪問的靜態資源,即各種靜態檔案,包括html、js、css、jpg、png、gif、mp3、mp4、pdf、doc、xls等等等等,具體可參考程式內容。本下載器預設開啟8個執行緒,

python爬蟲五大解析

python有五大解析器 一、正則表示式  ,使用第三方庫 re(re) 1.匹配規則有 模式 描述 \w 匹配字母、數字及下劃線 \W 匹配不是字母、數字

Bodymovin:Bodymovin和Lottie:把AE動畫轉換成HTML5/Android/iOS原生動畫 Bodymovin和Lottie:把AE動畫轉換成HTML5/Android/iOS原生動畫

轉自:https://www.cnblogs.com/zamhown/p/6688369.html 大殺器Bodymovin和Lottie:把AE動畫轉換成HTML5/Android/iOS原生動畫   前段時間聽部門老大說,Airbnb出了個移動端的動畫庫Lottie,可

Python爬蟲 --- 2.5 Scrapy汽車爬蟲實踐

原文連結:https://www.fkomm.cn/article/2018/8/7/32.html 目的 Scrapy框架為檔案和圖片的下載專門提供了兩個Item Pipeline 它們分別是: FilePipeline ImagesPipeline 這裡主要介紹ImagesPipel