爲什麼要學習requests,而不是urllib?
1.requests的底層實現就是urllib。
2.requests在python2和python3中通用,方法完全一樣。
3.requests簡單易用。
4.requests能夠自動幫我們解壓(gzip壓縮等)網頁內容。
在寫爬蟲的過程中,一定要養成一個好習慣,學會模擬瀏覽器的User-Agent。
如果不去模擬的話,以Python作爲User-Agent去訪問,會受到條件的限制。
200
b:
{'Bdpagetype': '1', 'Bdqid': '0xd1d3ed49000252f7', 'Cache-Control': 'private', 'Connection': 'Keep-Alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Cxy_all': 'baidu+cd213ce012eb7ff371aed51597a8d28c', 'Date': 'Mon, 07 Jan 2019 13:17:46 GMT', 'Expires': 'Mon, 07 Jan 2019 13:17:17 GMT', 'Server': 'BWS/1.1', 'Set-Cookie': 'delPer=0; path=/; domain=.baidu.com, BDSVRTM=0; path=/, BD_HOME=0; path=/, H_PS_PSSID=1425_21121_28206_28131_26350_28266_28140; path=/; domain=.baidu.com', 'Strict-Transport-Security': 'max-age=172800', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked'}
c:
https://www.baidu.com/
d:
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'BAIDUID=5F37B2B9D539422C5A3B8738B2D77CAE:FG=1; BIDUPSID=5F37B2B9D539422C5A3B8738B2D77CAE; PSTM=1546867066; BD_LAST_QID=16822138656381887118'}
e:
(百度源碼,省略)
接下來就講一下Get請求方式:
從服務器獲取數據,最常見的一種請求方式,Get方式用於在url地址中添加一些參數完成訪問。
公式:requests.get(url,headers=?,params=?,**kwargs),其中params是傳遞的參數,以字典的形式。
https://www.baidu.com/s?wd=%E8%8E%AB%E6%AC%BA%E5%B0%91%E5%B9%B4%E7%A9%B7
https://www.baidu.com/s?wd=%E8%8E%AB%E6%AC%BA%E5%B0%91%E5%B9%B4%E7%A9%B7
Post請求方式:
向服務器傳送數據,POST請求參數在請求體中,消息長度沒有限制且以隱式的方式進行發送。
在這兒,我們將百度翻譯小案例來結合起來進行理解。
公式:requests.post(url,data=?,headers=?,json=?,**kwargs),data是需要傳遞進去的參數,同樣是以參數的形式傳遞。
所以看到公式,我們尋找的目標自然是data參數了,get的請求方式是在url上顯示,但post的請求方式卻隱藏在請求中。
我們在主體網頁中,並沒有發現有效的data字典參數,所以我們要往下尋找其他基礎板塊。
我們找到了要找的一個目標,在v2transapi中發現了一個有效的DATA字典參數,這個時候我們需要檢查參數的可用性,
確保後續翻譯功能的完美實現,爲了驗證唯一性,我將換一句話翻譯:
我們可以發現,sign發生了改變,並非唯一性參數,說明這個data字典參數並不適合。
爲了解決這個問題,我們將操作系統從windows電腦切換到ipone X手機,然後繼續尋找data參數:
我們驚喜地發現,這個時候data參數具備了唯一性,是在basetrans文件裏尋找到的。
所以我們就從這個iponeX操作系統中獲取到需要的參數,完成翻譯功能。
於是有了url地址,data字典,以及必要的json轉換(將json文本轉換爲Python文本),代碼就生成了:
輸出結果(加粗的部分爲鍵入的內容):
請輸入你要翻譯的漢字:大家吃晚飯了嗎
Have you had dinner yet?
這樣,我們就完成了對百度翻譯的爬蟲,並爬來翻譯功能進行使用。
建議大家多去看看相關的資料,徹底理解一下Get與Post的兩種請求方式。