1. Cookie
為什么要使用Cookie呢巧颈?
Cookie畦木,指某些網(wǎng)站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)砸泛。比如說有些網(wǎng)站需要登錄后才能訪問某個頁面十籍,在登錄之前,你想抓取某個頁面內(nèi)容是不允許的唇礁。那么我們可以利用Urllib庫保存我們登錄的Cookie勾栗,然后再抓取其他頁面就達到目的了。
1) Opener
當你獲取一個URL你使用一個opener(一個urllib.OpenerDirector的實例)盏筐。在前面围俘,我們都是使用的默認的opener,也就是urlopen琢融。它是一個特殊的opener界牡,可以理解成opener的一個特殊實例,傳入的參數(shù)僅僅是url漾抬,data宿亡,timeout。如果我們需要用到Cookie纳令,只用這個opener是不能達到目的的她混,所以我們需要創(chuàng)建更一般的opener來實現(xiàn)對Cookie的設(shè)置烈钞。
2)Cookielib
cookielib模塊的主要作用是提供可存儲cookie的對象,以便于與urllib模塊配合使用來訪問Internet資源坤按。Cookielib模塊非常強大毯欣,我們可以利用本模塊的CookieJar類的對象來捕獲cookie并在后續(xù)連接請求時重新發(fā)送,比如可以實現(xiàn)模擬登錄功能臭脓。該模塊主要的對象有CookieJar酗钞、FileCookieJar、MozillaCookieJar来累、LWPCookieJar
2. URLError
首先解釋下URLError可能產(chǎn)生的原因:
- 網(wǎng)絡(luò)無連接砚作,即本機無法上網(wǎng)
- 連接不到特定的服務(wù)器
- 服務(wù)器不存在
在代碼中,我們需要用try-except語句來包圍并捕獲相應(yīng)的異常,代碼如下:
```
from urllib.request import Request, urlopen
from urllib.error import URLError
url = "嘹锁。葫录。。"
try:
? ? headers = {
? ? ? ? "User-Agent": "领猾。米同。。摔竿。"
? ? }
? ? req = Request(url, headers=headers)
? ? resp = urlopen(url, timeout=1)
? ? print(resp.read().decode())
except URLError as e:
? ? if len(e.args) == 0:
? ? ? ? print(e.code)
? ? else:
? ? ? ? print(e.args[0])
print("獲取數(shù)據(jù)完畢")
```
關(guān)于requests庫
1. 安裝
利用 pip 安裝
pip install requests
2. 基本請求
```
req = requests.get("http://www.baidu.com")
req = requests.post("http://www.baidu.com")
req = requests.put("http://www.baidu.com")
req = requests.delete("http://www.baidu.com")
req = requests.head("http://www.baidu.com")
req = requests.options("http://www.baidu.com")
```
1) get請求
參數(shù)是字典面粮,我們也可以傳遞json類型的參數(shù):
```
import requests
url = "http://www.baidu.com/s"
params = {'wd': '尚學堂'}
response = requests.get(url, params=params)
print(response.url)
response.encoding = 'utf-8'
html = response.text
# print(html)
```
2) post請求
參數(shù)是字典,我們也可以傳遞json類型的參數(shù):
```
url = "继低。熬苍。。袁翁。"
formdata = {
? ? "user": "柴底。。粱胜。柄驻。",
? ? "password": "。年柠。凿歼。。"
}
response = requests.post(url, data=formdata)
response.encoding = 'utf-8'
html = response.text
# print(html)
```
3)自定義請求頭部
> 偽裝請求頭部是采集時經(jīng)常用的冗恨,我們可以用這個方法來隱藏:
headers = {'User-Agent': 'python'}
r = requests.get('答憔。。掀抹。虐拓。', headers = headers)
print(r.request.headers['User-Agent'])
4)設(shè)置超時時間
> 可以通過timeout屬性設(shè)置超時時間,一旦超過這個時間還沒獲得響應(yīng)內(nèi)容傲武,就會提示錯誤
requests.get('蓉驹。城榛。。', timeout=0.001)
5) 代理訪問
> 采集時為避免被封IP态兴,經(jīng)常會使用代理狠持。requests也有相應(yīng)的proxies屬性
import requests
proxies = {
? "http": "http://10.10.1.10:3128",
? "https": "https://10.10.1.10:1080",
}
requests.get("。瞻润。喘垂。", proxies=proxies)
> 如果代理需要賬戶和密碼,則需這樣
```
proxies = {
? ? "http": "http://user:pass@10.10.1.10:3128/",
}
```
6) session自動保存cookies
> seesion的意思是保持一個會話绍撞,比如 登陸后繼續(xù)操作(記錄身份信息) 而requests是單次請求的請求正勒,身份信息不會被記錄
```
# 創(chuàng)建一個session對象
s = requests.Session()
# 用session對象發(fā)出get請求,設(shè)置cookies
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
```
7) ssl驗證
# 禁用安全請求警告
requests.packages.urllib3.disable_warnings()
resp = requests.get(url, verify=False, headers=headers)
3.獲取響應(yīng)信息
代碼 | 含義
-- | --
resp.json()|獲取響應(yīng)內(nèi)容(以json字符串)
resp.text| 獲取響應(yīng)內(nèi)容 (以字符串)
resp.content|獲取響應(yīng)內(nèi)容(以字節(jié)的方式)
resp.headers|獲取響應(yīng)頭內(nèi)容
resp.url|獲取訪問地址
resp.encoding| 獲取網(wǎng)頁編碼
resp.request.headers| 請求頭內(nèi)容
resp.cookie| 獲取cookie