首先給大家道歉聋亡,很長一段時間沒有寫文章了。
今天我們繼續(xù)學(xué)習(xí)爬蟲的課程喜鼓,之前我們接觸了urllib副砍,urllib2的方法應(yīng)用。其實(shí)在現(xiàn)在的市場上颠通,urllib的方法已經(jīng)很少使用,但是作為新手入門是個很好的切入點(diǎn)膀懈,為學(xué)習(xí)之后的知識點(diǎn)做鋪墊顿锰。客氣話少說,直接開擼硼控。
Requests: 讓HTTP為人類服務(wù)
Requests 唯一的一個非轉(zhuǎn)基因的 Python HTTP 庫刘陶,人類可以安全享用。
警告:非專業(yè)人員使用其他 HTTP 庫會導(dǎo)致危險(xiǎn)的副作用牢撼,其中包括:安全缺陷癥匙隔、冗余代碼癥、重新發(fā)明輪子癥熏版、啃文檔癥纷责、抑郁、頭疼撼短、甚至死亡(如有生命危險(xiǎn)再膳,概不負(fù)責(zé))。諾曲横,這就是 Requests 的威力喂柒,當(dāng)然這也是python庫的威力(python庫是最多的,其他語言無法比擬的)禾嫉。
ok灾杰,讓我們先看一下Requests的簡單案例:
import requests
print(requests.get("http://www.baidu.com").text)
上面簡寫的代碼就可以完成爬取百度源碼的任務(wù),是不是超乎你的想象熙参。下面就讓我們開水學(xué)習(xí)requests艳吠。
一、安裝requests
我們是在windows下面運(yùn)行尊惰,按Ctrl+R打開命令行讲竿,輸入cmd回車
之后在命令行輸入pip install requests。稍等片刻弄屡,就可以肆無忌憚的使用這個庫题禀。
二、requests的使用
1膀捷、requests的各種請求方法
import requests
requests.get("http://www.baidu.com")
requests.post("http://www.baidu.com")
requests.delete("http://www.baidu.com")
requests.put("http://www.baidu.com")
requests.head("http://www.baidu.com")
requests.options("http://www.baidu.com")
1.1迈嘹、GET請求
1.1.1無參數(shù)GET請求
import requests
response = requests.get("http://www.baidu.com")
print(response.text)
向url發(fā)送請求,得到響應(yīng)數(shù)據(jù)全庸,在上述例子中g(shù)et方法里面只有url參數(shù)秀仲。
1.1.2、帶參數(shù)GET請求
- 1壶笼、請求參數(shù)在url中
比如神僵,我們在百度搜索框輸入黃鸝,想要得到搜索后的數(shù)據(jù)
import requests
response = requests.get("http://www.baidu.com/s?ie=utf-8&wd=黃鸝")
print(response.text)
OK覆劈,這就是把參數(shù)直接放入url中保礼。
- 2沛励、請求體包含參數(shù)
首先先將參數(shù)包含在dict中,發(fā)起請求參數(shù)時param參數(shù)指定為dict炮障。
import requests
param = {
"wd": "黃鸝"
}
response = requests.get("http://www.baidu.com/s?", params = param)
print(response.text)
結(jié)果同上目派,上述就可以得到我們想要的數(shù)據(jù)
1.2 POST請求
1.2.1 發(fā)送表單格式的數(shù)據(jù)
import requests
param = {
"wd": "黃鸝"
}
response = requests.post("http://www.baidu.com/s?", data = param)
print(response.text)
1.2.2 發(fā)送JSON數(shù)據(jù)
import requests, json
param = {
"wd": "黃鸝"
}
response = requests.post("http://www.baidu.com/s?", data = json.dumps(param))
print(response.text)
1.2.3 發(fā)送文件數(shù)據(jù)
import requests, json
file = {
"file": open("huangliniao.jpg", "rb")
}
response = requests.post("http://image.baidu.com/?fr=shitu",files = file)
print(response.text)
1.3 獲取數(shù)據(jù)的格式
import requests
response = requests.get("http://httpbin.org/get")
#輸出文本數(shù)據(jù)
print(response.text)
#輸出二進(jìn)制數(shù)據(jù)
print(response.content)
#輸出json數(shù)據(jù)
print(response.json())
舉個栗子(爬取劉亦菲圖片并保存到本地)
import requests
response = requests.get("http://i.shangc.net/2017/1231/20171231023951903.jpg")
print(response.content)
with open("liuyifei.jpg", "wb") as f:
f.write(response.content)
1.4 設(shè)置headers
import requests
# 設(shè)置User-Agent瀏覽器信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
# 設(shè)置請求頭信息
response = requests.get('http://www.reibang.com/u/d5030633f94a', headers=headers)
#print(response.text)
with open("jianshu.html", "wb") as f:
f.write(response.content)
1.5 獲取和發(fā)送cookies
1.5.1 獲取有道翻譯cookies值
import requests
response = requests.get("http://fanyi.youdao.com")
for i in response.cookies:
print(i.name + "--" + i.value)
1.5.2 發(fā)送cookies到 有道翻譯
import requests
url = "http://fanyi.youdao.com"
cookies = {"i.name":"i.value"}
response1 = requests.get(url = url, cookies = cookies)
print(response1.text)
當(dāng)然上述兩段代碼可以在同一個文件下運(yùn)行
1.6 session會話保存
import requests
session = requests.Session()
session.get('http://httpbin.org/cookies/set/number/12345')
response = session.get('http://httpbin.org/cookies')
print(response.text)
1.7 設(shè)置代理
1.7.1 普通代理
import requests
proxies = {
"http": "http://127.0.0.1:9743",
"https": "https://127.0.0.1:9743",
}
response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.read())
1.7.2 賬號密碼代理
import requests
proxies = {
"http": "http://user:password@127.0.0.1:9743/",
}
response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.read())
1.7.3 設(shè)置socks代理
import requests
proxies = {
'http': 'socks5://127.0.0.1:9742',
'https': 'socks5://127.0.0.1:9742'
}
response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.status_code)
status_code 的意思是狀態(tài)碼,表示相應(yīng)的狀態(tài)
1.8 異常處理
import requests
from requests.exceptions import ReadTimeout, ConnectionError, RequestException
try:
response = requests.get("http://www.baidu.com", timeout=0.5)
print(response.status_code)
except ReadTimeout:
# 超時異常
print('Timeout')
except ConnectionError:
# 連接異常
print('Connection error')
except RequestException:
# 請求異常
print('Error')