Python3-Requests庫入門及爬取實戰

實驗環境準備html

Python環境安裝

騰訊雲所提供的的鏡像中已經包含了 Python 3.5python

大部分狀況咱們只須要單獨安裝 pip 便可json

sudo apt-get update
sudo apt-get install python3 python3-pip -y

requests庫的安裝

咱們使用 pip 軟件管理工具安裝 requests ,若是你須要其餘方法請訪問官方網站指導頁面。瀏覽器

請執行服務器

pip3 install requests

在瞭解爬蟲以前,咱們有必要了解 robots 協議。cookie

·--------------------------------------------------------網絡

*如下部份內容來自維基百科 robots.txt 詞條併發

robots.txt(統一小寫)是一種存放於網站根目錄下的 ASCII 編碼的文本文件,它一般告訴網絡搜索引擎的漫遊器(又稱網絡蜘蛛),此網站中的哪些內容是不該被搜索引擎的漫遊器獲取的,哪些是能夠被漫遊器獲取的。由於一些系統中的 URL 是大小寫敏感的,因此 robots.txt 的文件名應統一爲小寫。robots.txt 應放置於網站的根目錄下。若是想單獨定義搜索引擎的漫遊器訪問子目錄時的行爲,那麼能夠將自定的設置合併到根目錄下的 robots.txt,或者使用 robots 元數據(Metadata,又稱元數據)。app

這個協議也不是一個規範,而只是約定俗成的,有些搜索引擎會遵照這一規範,而其餘則否則。一般搜索引擎會識別這個元數據,不索引這個頁面,以及這個頁面的鏈出頁面。ide

·---------------------------------------------------

在使用爬蟲過程當中,咱們應儘量的遵循 robots 協議,在非學習交流與爲目的的場合嚴格遵循其規定。

同時,咱們在爬取數據的過程當中應該注重服務器負載,避免給服務器帶來較大壓力,不少小衆網站服務器工做能力並無咱們想象的那麼好,數個併發爬蟲就能使服務器宕機。

對於設計企業數據,網站全部者隱私的信息咱們應儘量避免爬取,換位思考,若是你是網站搭建者,你也不但願你的數據被輕鬆盜用吧。

Robots 協議暫且介紹這麼多,如今,點擊下一步,讓咱們進入 Python 爬蟲的世界吧

cd ~
python3
  •  

當看到>>>的輸入提示符時表示進入成功,請注意確認版本爲 3.X 版本

導入requests庫

以後的一些內容都在Python命令行中完成

import requests
  •  

定義網址爲字符串變量

targetUrl = "http://www.baidu.com"
  •  

如今請跟隨示例完成,以後您能夠自行爬取其餘頁面

進行網頁爬取

res = requests.get(targetUrl)
  •  

查看返回碼

res.status_code
  •  

若是是200那麼咱們繼續,若是不是、、、額、、、再試一次?

查看網頁返回的字符集類型

res.encoding
  •  

你會發現獲得的結果是 ISO-8859-1 然而百度真的是這樣的嗎?

嘗試輸出爬取結果

res.text
  •  

發現了什麼?中文亂碼,沒錯,很顯然百度用的不是 ISO-8859-1 的字符集

查看爬取內容的二進制數據

res.content
  •  

你以爲是什麼? utf-8 !沒錯,那麼讓咱們繼續

自動判斷字符集類型

res.apparent_encoding
  •  

那麼咱們嘗試直接更改 res.encoding 一項

更改字符集聲明

res.encoding = res.apparent_encoding
  •  

再次嘗試輸出

res.text

Requests 庫入門

  • 從簡單的例子開始

  • requests 庫提供的方法

    requests.request() 構造一個請求

    requests.request(method, url, **kwargs)

    **kwargs 的含義咱們暫且放一放

    requests.get() 獲取 HTML 網頁,相似於 HTTP 的 GET

    requests.get(url, params=None, **kwargs)

    Response = requests.get(url)

    Response 這裏是 requests 返回的一個對象,咱們以後會具體講解

    requests.head() 獲取 HTML 網頁頭信息,相似於 HTTP 的 HEAD

    requests.head(url, **kwargs)

    requests.post() 向 HTML 網頁提交 POST 請求,相似於 HTTP 的 POST

    requests.post(url, data=None, json=None, **kwargs)

    requests.put() 向 HTML 網頁提交 PUT 請求,相似於 HTTP 的 PUT

    requests.put(url, data=None, **kwargs)

    requests.patch() 向 HTML 網頁提交局部修改請求,相似於 HTTP 的 PATCH

    requests.patch(url, data=None, **kwargs)

    requests.delete() 向 HTML 頁面提交刪除請求,相似於 HTTP 的 DELETE

    requests.delete(url, **kwargs)

Response 返回類型的基本屬性

稍安勿躁,在進行下一步實操以前,讓咱們再瞭解一下以前咱們涉及到的 Response 的部分基本屬性

.status_code

HTML 返回的狀態碼,你能夠參考百度百科上的內容瞭解具體的含義

.text

內容的字符串形式,簡而言之,就是網頁上的內容

.encoding

從 HTTP header中得到響應內容編碼方式,若是在 header 裏沒有聲明,那麼將會是 ISO-8859-1

.apparent_encoding

從內容中分析出的響應內容編碼方式,在執行過程當中會對各類編碼的機率進行計算,給出最可能的編碼類型,注意在程序中使用它會致使程序速度變慢。

.content

html 內容的二進制顯示,對於圖片這樣的非文本文件,二進制的輸出是必要的

raise_for_status()

這是咱們上一個程序示例中沒有出現的內容,但它很重要

若是不是 200,產生異常

網絡傳輸存在着不肯定性,發現並及時處理異常很是重要

從新打開 Python 命令行

cd ~
python3
  •  

導入 requests 庫,此次咱們爬取一個不存在的頁面

targetUrl = "https://cloud.tencent.com/dsadfas"
res = requests.get(targetUrl)
res.raise_for_status()
  •  

不出意外的話你就能看到 Python 的報錯信息

值得咱們注意的是這裏是產生中斷的報錯,而不是一個警告,經過 try...except... 咱們能夠實現對 http 請求錯誤的處理。

問題分析與處理

若是你對html請求熟悉,那麼必定知道 user-agent 這玩意兒,它標識了訪問者瀏覽器的類型,Python 很誠實的告訴網站服務器它是一個 Python 程序,然而若是咱們但願得到其中的內容就須要更改這個 user-agent

在以前基礎上這麼嘗試:

h = {
    "user-agent":"Mozilla/5.0 (MSIE 10.0; Windows NT 6.1; Trident/5.0)"
}
#這裏用的是IE的user-agent
res = requests.get(url,headers = h)
print(res.status_code)

小結

http 請求 headers 中包含的信息並不僅有 user-agent,不少網站都有反爬的基本策略,有的檢查 user-agent,相似於咱們以前看到的亞馬遜,有的網站會檢查 host,refer 等字段,這些內容是否須要肯定,如何更改相信有了以前的例子你已經懂了,關於更多這部分的內容不屬於本教程的範疇,請自行查閱相關資料。

headers 做爲參數傳遞給 requests 庫時,應該使用字典格式,把須要的內容放到字典中,剩下的 requests 會幫你解決。

更多參數

和以前出現過的 headers 相似,還有一些參數是咱們所須要的這裏給出簡要,具體使用請自行嘗試。

params : 字典或字節序列,做爲參數增長到 url 中

data : 字典、字節序列或文件對象,做爲 Request 的內容

json : JSON 格式的數據,做爲 Request 的內容

headers : 字典,HTTP 定製頭

cookies : 字典或 CookieJar, Request 中的 cookie

auth : 元組,支持 HTTP 認證功能

files : 字典類型,傳輸文件

timeout : 設定超時時間,秒爲單位

proxies : 字典類型,設定訪問代理服務器,能夠增長登陸認證

allow_redirects : True/False,默認爲 True,重定向開關

stream : True/False, 默認爲 True, 獲取內容當即下載開關

verify : True/False, 默認爲 True, 認證 SSL 證書開關

cert : 本地 SSL 證書路徑

*以上內容來源網絡

相關文章
相關標籤/搜索