Python之爬蟲-- Requests

目錄

Requests-獻給人類

一、簡介

二、安裝方式

三、 GET請求

四、POST請求

 五、顯示json文件

六、代理(proxies參數)

 七、用戶驗證

八、Cookies 和 Session

1、Cookies

2、Session

九、SSL證書驗證

https請求驗證ssl證書(有一些網站的ssl證書是自己寫的,比如12306和360)


Requests-獻給人類

一、簡介

  • 雖然Python的標準庫中 urllib 模塊已經包含了平常我們使用的大多數功能,但是它的 API 使用起來讓人感覺不太好,而 Requests 自稱 “HTTP for Humans”,更簡潔更友好
  • Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用:)
  • Requests 繼承了urllib的所有特性。Requests支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳,支持自動確定響應內容的編碼,支持國際化的 URL 和 POST 數據自動編碼。
  • requests 的底層實現其實就是 urllib3 。Requests能完全滿足當前網絡的需求,支持Python 2.6—3.5,而且能在PyPy下完美運行。
  • 開源地址:https://github.com/kennethreitz/requestshttps://github.com/requests/requests
  • 中文文檔 API:http://docs.python-requests.org/zh_CN/latest/index.html
  • 安裝: conda install requests

二、安裝方式

利用 pip 安裝 或者利用 easy_install 都可以完成安裝:

$ easy_install requests


$ conda install requests


$ pip install requests

三、 GET請求

1.requests.get(url),案例1

2.requests.request("get", url),案例1

3.可以帶有headers和parmas參數,案例2。如果想添加 headers,可以傳入headers參數來增加請求頭中的headers信息。如果要將參數放在url中傳遞,可以利用params參數。

4.get返回內容,案例2

  • 使用response.text 時,Requests 會基於 HTTP 響應的文本編碼自動解碼響應內容,大多數 Unicode 字符集都能被無縫地解碼。
  • 使用response.content 時,返回的是服務器響應數據的原始二進制字節流,可以用來保存圖片等二進制文件。

案例1 :

import requests

url = "http://www.baidu.com"
# 兩種請求方式
# 使用get請求
rsp = requests.get(url)
print(rsp.text)

# 使用request請求
rsp = requests.request("get", url)
print(rsp.text)

案例2: 

'''
使用參數headers和params
研究返回結果
'''
import requests

# 完整訪問url是下面url加上參數構成
url = "http://www.baidu.com/s?"

kw = {
    "wd": "王八蛋"
}

headers = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36"
}

# params 接收一個字典或者字符串的查詢參數,字典類型自動轉換爲url編碼,
#不需要urlencode()
url = "http://www.baidu.com/s?"
response = requests.get(url, params = kw, headers = headers)

# 查看響應內容,response.text 返回的是Unicode格式的數據
print(response.text)

# 查看響應內容,response.content返回的字節流數據
print(response.content)

# 查看完整url地址
print(response.url)

# 查看響應頭部字符編碼
print(response.encoding)

# 查看響應碼
print(response.status_code)

四、POST請求

  1. 最基本的GET請求可以直接用post方法 
    rsp = requests.post(url, data=data)
  2. 傳入data數據 
    對於 POST 請求來說,我們一般需要爲它增加一些參數。那麼最基本的傳參方法可以利用data這個參數。
  3. date, headers要求dict類型,不需要轉碼了
  4. 模擬有道翻譯,案例3

案例3: 

import json
import time
import requests

def youdaoAPI(kw):
    '''
    :param kw: 翻譯的內容
    :return:
    '''
    # 請求頭
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
        AppleWebKit/537.36 (KHTML, 
        like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

    # translate_o 去掉_o
    url = "http://fanyi.youdao.com/translate?
    smartresult=dict&smartresult=rule"
    response = requests.post(url, data=kw, headers=header)
    res = response.content
    tgt = json.loads(res)
    print(tgt["translateResult"])


if __name__ == '__main__':

    kw = input("請輸入你想翻譯的內容:")
    timet = int(time.time() * 1000)
    data = {
        "i": kw,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": timet,
        "sign": "f66461b42fe9edb6d88230788fb33cfb",
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action ": "FY_BY_REALTIME",
        "typoResult ": "false",
    }

    youdaoAPI(data)

 五、顯示json文件

# 自帶json模塊
print(response.json())

運行結果

{'type': 'ZH_CN2EN', 'errorCode': 0,
 'elapsedTime': 1, 'translateResult': 
 [[{'src': '長城', 'tgt': 'The Great Wall'}]]}

六、代理(proxies參數)

如果需要使用代理,可以通過爲任意請求方法提供proxies參數來配置單個請求(代理有可能報錯,如果使用人數多,考慮安全問題,可能會被強行關閉):

import requests

# 根據協議類型,選擇不同的代理
proxies = {
  "http": "http://12.34.56.79:9527",
  "https": "http://12.34.56.79:9527",
}

response = requests.get("http://www.baidu.com", proxies = proxies)
print ('response.text')


# 帶密碼代理
httpProxy = {"https": "http://User1:[email protected]:808"}

 七、用戶驗證

  • 代理驗證
#可能需要使用HTTP basic Auth, 可以這樣
# 格式爲  用戶名:密碼@代理地址:端口地址
proxy = { "http": "china:[email protected]:4444"}
rsp = requests.get("http://baidu.com", proxies=proxy)
  • web客戶端驗證,如果遇到web客戶端驗證,需要添加auth=(用戶名,密碼)
import requests

autu=("test1", "123456")#授權信息

response = requests.get('http://192.168.199.107', auth = auth)

print ('response.text')

八、Cookies 和 Session

1、Cookies

  • requests可以自動處理cookie信息
  • 如果一個響應中包含了cookie,那麼我們可以利用 cookies參數拿到:
import requests

response = requests.get("http://www.baidu.com/")

# 如果對方服務器給傳送過來cookie信息,則可以通過反饋的cookie屬性得到
# 返回CookieJar對象:
cookiejar = response.cookies

# 將CookieJar轉爲字典:
cookiedict = requests.utils.dict_from_cookiejar(cookiejar)

print(cookiejar)
print(cookiedict)

運行結果:

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>

{'BDORZ': '27315'}

2、Session

            # 創建session對象,可以保持cookie值
            ss = requests.session()
            
            headers = {"User-Agetn":"xxxxxxxxxxxxxxxxxx"}
            
            data = {"name":"xxxxxxxxxxx"}
            
            # 此時,由創建的session管理請求,負責發出請求,
            ss.post("http://www.baidu.com", data=data, headers=headers)
            
            rsp = ss.get("xxxxxxxxxxxx")

  • 跟服務器端session不是一個東東
  • 模擬一次會話,從客戶端瀏覽器鏈接服務器開始,到客戶端瀏覽器斷開
  • 能讓我們跨請求時保持某些參數,比如在同一個session實例發出的 所有請求之間保持cookie,以後所有請求都是這一個cookie,不需要在創建

在 requests 裏,session對象是一個常用的對象,這個對象代表一次用戶會話:從客戶端瀏覽器連接服務器開始,到客戶端瀏覽器與服務器斷開。

會話能讓我們在跨請求時候保存某些參數,比如在同一個 Session 實例發出的所有請求之間保存cookie 。

實現人人網登錄:

import requests

# 1. 創建session對象,可以保存Cookie值
ssion = requests.session()

# 2. 處理 headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0;
 Win64; x64) 
AppleWebKit/537.36 (KHTML, 
like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

# 3. 需要登錄的用戶名和密碼
data = {"email":"[email protected]", "password":"alarmchime"}

# 4. 發送附帶用戶名和密碼的請求,並獲取登錄後的Cookie值,保存在ssion裏
ssion.post("http://www.renren.com/PLogin.do", data = data)

# 5. ssion包含用戶登錄後的Cookie值,
#可以直接訪問那些登錄後纔可以訪問的頁面
response = ssion.get("http://www.renren.com/410043129/profile")

# 6. 打印響應內容
print(response.text)
# 將cookie對象轉爲字典
cookieDict = requests.utils.dict_from_cookiejar(ssion.cookies)
# 保存cookie
with open("session.txt", 'w', encoding='utf-8') as f:
    f.write(str(cookieDict))
    f.flush()

九、SSL證書驗證

https請求驗證ssl證書(有一些網站的ssl證書是自己寫的,比如12306和360)

  • 參數verify負責表示是否需要驗證ssL證書,默認是True
  • 如果不需要驗證ssl證書,則設置成False表示關閉

            rsp = requests.get("https://www.baidu.com", verify=False)
            # 如果用verify=True訪問12306,會報錯,因爲他證書有問題 

 處理HTTPS請求 SSL證書驗證 ,Requests也可以爲HTTPS請求驗證SSL證書:

要想檢查某個主機的SSL證書,你可以使用 verify 參數(也可以不寫)

import requests
response = requests.get("https://www.baidu.com/", verify=True)

# 也可以省略不寫
# response = requests.get("https://www.baidu.com/")
print(response.text)

如果SSL證書驗證不通過,或者不信任服務器的安全證書,則會報出SSLError,據說 12306 證書是自己做的: 
來測試一下:

import requests
response = requests.get("https://www.12306.cn/mormhweb/")
print(response.text)

報錯:

SSLError: ("bad handshake: Error([('SSL routines', 
'ssl3_get_server_certificate', 'certificate verify failed')],)",)

如果我們想跳過 12306 的證書驗證,把 verify 設置爲 False 就可以正常請求了。

import requests

url = "https://www.12306.cn/mormhweb/"
response = requests.get(url,verify=False)
print(response.text)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章