需要的模塊
urllib.request
獲取get一個請求
這裏以百度爲例
r = urllib.request.urlopen("http://www.baidu.com")
獲取之後我們輸出r可以發現r是一個對象
<http.client.HTTPResponse object at 0x000002AE92E36040>
可以使用read()方法將該對象內容讀出來,這裏只截取一部分
b'<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X
可以使用read().decode("utf-8")對上述內容進行解碼,解碼完畢後就是html代碼了
把這些內容粘貼到txt文件裏,把文件類型改爲html,之後打開,會發現跟百度一模一樣
獲取一個post請求
可以使用這個網站來測試post請求,httpbin.org
我們使用這個HTTP Methods
點擊post後,點try it out
再點擊這個execute,就相當於我們訪問了這個網站,他返回的信息 ,就出現了
返回的信息爲
上面使html代碼,包含我們的訪問方式,使用的瀏覽器的版本等等,這個Use-Agent就是使用的瀏覽器版本
就是說post請求,是當我們就收到一部分信息後,在我們做出反應後,服務器纔會將剩下的東西發給我們
如何用python獲取一個post請求呢?
具體做法如下,
import urllib.request
import urllib.parse
#由於urllib.request.urlopen 中data參數必須是一個字節對象、可迭代對象,所以要轉格式,這裏將信息轉 #爲可迭代對象
#封裝信息,並將封裝好的信息轉換爲字節對象,
data = bytes(urllib.parse.urlencode({"heallo":"world"}),encoding = "utf-8")
#/post就代表獲取post請求,data是附加信息
r = urllib.request.urlopen("http://httpbin.org/post",data = data)
'''
也可以用
r = urllib.request.urlopen("http://httpbin.org",data = data,method ="POST")
輸出結果
print(r.read().decode("utf-8"))
urllib.request.urlopen函數原型如下:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
<1>url是目標資源在網路中的位置。可以是一個表示URL的字符串(如:http://www.xxxx.com/);也可以是一個urllib.request對象
<2>data用來指明發往服務器請求中的額外的信息(如:在線翻譯,在線答題等提交的內容)。HTTP是python中實現的衆多網絡通信http、https、ftp等協議中,唯一一個 使用data 參數的,也就是說只有打開的是http網址的時候,自定義data參數纔會有作用。另外,官方API手冊介紹指出:
- data必須是一個字節數據對象(Python的bytes object)
- data必須符合標準the standard application/x-www-form-urlencoded format,怎麼得到這種標準結構的data呢?使用urllib.parse.urlencode()將自定義的data轉換成標準格式,而這個函數所能接收的參數類型是pyhon中的mapping object(鍵/值對,如dict) or a sequence of two-element tuples(元素是tuple的列表)。
- data也可以是一個可迭代的對象,這種情況下就需要配置response對象中的Conten-length,指明data的大小。
- data默認是None,此時以GET方式發送請求;當用戶給出data參數的時候,改爲POST方式發送請求。
<3>cafile、capath、cadefault 參數:用於實現可信任的CA證書的HTTP請求。(基本上很少用)
<4>context參數:實現SSL加密傳輸。(基本上很少用)
輸出結果爲
{
"args": {},
"data": "",
"files": {},
"form": {
"heallo": "world"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "12",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.8",
"X-Amzn-Trace-Id": "Root=1-5ead4267-7ae21e305363f551481d4195"
},
"json": null,
"origin": "xxx.xxx.xxx.xx",#ip
"url": "http://httpbin.org/post"
}
這個form就是我們給服務器發送的內容
這一點可以說明,如果有需要用戶登錄的網站,可以使用post的方式,將用戶名和密碼發過去
還有一點就是,在返回的信息裏,User-Agent裏顯示的是python,說明我們是以python瀏覽的這個網頁,某些網站會根據這個User-Agent來判斷是否是爬蟲,比如說豆瓣
如果我們直接獲取一個get請求
import urllib.request
url ='https://www.douban.com'
r = urllib.request.urlopen(url)
print(r.read())
輸出爲
File "E:\學習\lib\urllib\request.py", line 502, in _call_chain
result = func(*args)
File "E:\學習\lib\urllib\request.py", line 649, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 418:
這個418就是說明,豆瓣根據User-Agent發現了你是一個爬蟲
所以我們要進行僞裝
我們手動瀏覽豆瓣,找到我們的user-Agent
#創建一個字典來存我們手動瀏覽時候的瀏覽器信息
headers ={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
#目標網站
url ="https://www.douban.com"
我們需要一個方法把,headers信息封裝進去
req = urllib.request.Request(url =url,headers =headers)
封裝完之後,直接使用這個req對象
r = urllib.request.urlopen(req)
print(r.read().decode("utf-8"))
爲什麼urllib.request.urlopen可以使用req呢?
因爲它的url參數可以是一個string類型也可以是一個Request的對象
這時候就有輸出了
輸出結果僅展示部分
11655 個成員
</div>
<li>
<div class="pic">
<a href="https://www.douban.com/group/402725/"><img src="https://img3.doubanio.com/f/shire/a1fdee122b95748d81cee426d717c05b5174fe96/pics/blank.gif" data-origin="https://img1.doubanio.com/view/group/sqxs/public/17fdb616ff143d8.jpg" alt="" width="48" /></a>
</div>
<div class="info">
<div class="title">
<a href="https://www.douban.com/group/402725/">記事本圓夢小組</a>