requests 返回的cookies为空_爬虫学习(2)(requests库)
POST請(qǐng)求
import requestsdata = {'name': 'cxc', 'age': 18} r = requests.post("http://httpbin.org/post", data=data) print(r.text)POST請(qǐng)求這樣就成功地獲得了返回結(jié)果,form部分就是提交的數(shù)據(jù),證明POST請(qǐng)求成功發(fā)送了。
響應(yīng)
之前我們使用了text和content來獲得響應(yīng)的內(nèi)容。除此之外我們還可以用其他方法來獲得類似狀態(tài)碼,響應(yīng)頭,Cookies等。
import requestsr = requests.get("http://www.jianshu.com") print(type(r.status_code), r.status_code) print(type(r.headers), r.headers) print(type(r.cookies), r.cookies) print(type(r.url), r.url) print((type(r.history)), r.history)響應(yīng)status_code得到響應(yīng)碼,headers得到響應(yīng)頭,cookies得到Cookies,url得到URL,history得到請(qǐng)求歷史。
高級(jí)用法
1.文件上傳
import requestsfiles = {'file': open('favicon.ico', 'rb')} r = requests.post("http://httpbin.org/post", files=files) print(r.text)這樣就可以上傳圖標(biāo)到網(wǎng)站,會(huì)返回file字段。
2.Cookies
import requestsr = requests.get('https://www.baidu.com') print(r.cookies) for key, value in r.cookies.items():print(key + '=' + value)Cookies這里調(diào)用cookies屬性即可獲得Cookies,它是一個(gè)RequestCookieJar類型。可以用items()方法來將其轉(zhuǎn)化為元組組成的列表,來輸出每個(gè)Cookie的名稱和值。
以知乎為例,打開開發(fā)者工具,復(fù)制headers中的cookie。在headers里設(shè)置cookie。
import requestsheaders = {'Cookie': '''_zap=c9f7b39e-9cdf-4711-b609-5b144de76c06;d_c0="ANDsYo2hHBCPTtUZ9OAejUIO3cPeBA2-58c=|1569579305"; __utma=155987696.795654319.1573700494.1573700494.1573700494.1;__utmz=155987696.1573700494.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _ga=GA1.2.795654319.1573700494; _xsrf=nYGEgZG2TzVwoXUaFG8g1QeZ6540lwjv; _gid=GA1.2.2132724163.1587571856; capsion_ticket="2|1:0|10:1587571858|14:capsion_ticket|44:MGY1ZTE0ZTRkZDZlNDQ0MDlhYzFkMmJhMGZlZjM0ODY=|88d210cfef5b28bae92224d8de1db6ec228d8dc10a9b05a289d6d55643003727"; l_n_c=1; r_cap_id="YjgyMWMzMzgxMmRhNGJkMzg5MzJmYTZhOWVlZjgwODE=|1587571863|67548daa6da1bae647ac06049e3d1cd9b94d516a"; cap_id="ODE1NTEzNWZkMmQxNDdlMzhlZWMwMGNhYTUyYjhiNTg=|1587571863|193a26bd8d0e7594706d33da0da505b781f369cb"; l_cap_id="NjBiNzJjMTMwY2I3NGQwY2I0NTY4MjFjNDQ4MDcwM2E=|1587571863|b7b7c5463efeb9f5618593e73a710a7d64a2ff13"; n_c=1; z_c0=Mi4xeEItekJ3QUFBQUFBME94aWphRWNFQmNBQUFCaEFsVk4xYnFOWHdDZ3lWWHYwc3RUb3dKQ24yaUNlZE8zWjJ5akhB|1587571925|394733fa0f1887f584327e807eabc779c2c7b18b; tst=r; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1587008375,1587482507,1587571858,1587605776; q_c1=cd8e859bd3664b63acb02dd3e5bfb29c|1587605777000|1570587075000; _gat_gtag_UA_149949619_1=1; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1587612593; SESSIONID=aFLEvMRLqeRKvTfgwkfxy61SHi9vWB7J2UUu5ei9q63; KLBRSID=d1f07ca9b929274b65d830a00cbd719a|1587612596|1587605301; JOID=UF8RAklay1wn2rUUYVleQRfF7zh2Po4VYaz9RSgrqw1pr-F3BejG-3rfsxJn3GTATrMuKSiE-BOqn0XDIf-qOzk=; osd=V10TBU5dyV4g3bIWY15ZRhXH6D9xPIwSZqv_Ry8srA9rqOZwB-rB_H3dsRVg22bCSbQpKyqD_xSonULEJv2oPD4=''','Host': 'www.zhihu.com','User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", } r = requests.get('https://www.zhihu.com', headers=headers) print(r.text)cookies返回的結(jié)果里面包含了登錄后的結(jié)果,就證明登陸成功了。
3.會(huì)話維持
在requests中,當(dāng)我們使用post()和get()時(shí)我們時(shí)打開了兩個(gè)瀏覽器,當(dāng)我們用post()打開頁面時(shí),再用get()去請(qǐng)求個(gè)人信息時(shí)會(huì)失敗。
新的方法——Session對(duì)象
用舊方法兩次get()的結(jié)果會(huì)得到如下
兩次get()當(dāng)我們引入Session對(duì)象時(shí)
import requestss = requests.Session() s.get("http://httpbin.org/cookies/set/number/123456789") r = s.get('http://httpbin.org/cookies') print(r.text)Session對(duì)象現(xiàn)在我們就可以獲得當(dāng)前的cookies了。
4.SSL證書驗(yàn)證
requests提供了證書驗(yàn)證功能,當(dāng)發(fā)送HTTP請(qǐng)求時(shí),會(huì)檢查SSL證書,可以使用verify參數(shù)控制是否檢查證書。
import requestsresponse = requests.get('https://www.12306.cn', verify=False) print(response.status_code)SSL證書這時(shí)會(huì)打印出請(qǐng)求成功的狀態(tài)碼,但會(huì)報(bào)一個(gè)警告,建議我們給他指定的證書,可以通過設(shè)置忽略警告來屏蔽它。
import requests from requests.packages import urllib3urllib3.disable_warnings() response = requests.get('https://www.12306.cn', verify=False) print(response.status_code)5.代理設(shè)置
對(duì)于某些網(wǎng)站當(dāng)我們開始大規(guī)模爬取時(shí),可能會(huì)彈出驗(yàn)證碼或者返回登陸頁,甚至?xí)饨鸌P。為了防止這種情況發(fā)生,我們可以用代理來解決問題,需要使用到proxies參數(shù)來實(shí)現(xiàn)。
import requestsproxies = {"http": "http://10.10.1.10:3128","https": "http://10.10.1.10:1080", } r = requests.get("http://www.taobao.com", proxies=proxies) print(r.text)代理換成自己的有效代理即可。
若代理需要使用HTTP Basic Auth,可以使用類似http://user:password@host:port 這樣的語法來設(shè)置代理。
requests同時(shí)支持SOCKS協(xié)議的代理,需要安裝socks庫。
6.超時(shí)設(shè)置
使用timeout參數(shù)設(shè)置。
import requestsr = requests.get("https://www.taobao.com", timeout=1) print(r.status_code)請(qǐng)求分為兩個(gè)階段,connect和read,我們可以分別指定時(shí)間——timeout=(5,10,30)。如果不設(shè)置的話可以timeout=None或者不加參數(shù)。
7.身份認(rèn)證
import requests from requests.auth import HTTPBasicAuthr = requests.get("http://localhost:5000", auth=HTTPBasicAuth('username', 'password')) print(r.status_code)如果使用OAuth認(rèn)證需安裝oanth庫。
8.Prepared Request
我們可以將請(qǐng)求表示為數(shù)據(jù)結(jié)構(gòu),其中各個(gè)參數(shù)都可以通過一個(gè)Request對(duì)象來表示。
from requests import Request,Sessionurl = 'http://httpbin.org/post' data = {'name': 'cxc' } headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3" } s = Session() req = Request('POST', url, data=data, headers=headers) prepped = s.prepare_request(req) r = s.send(prepped) print(r.text)我們引入Request,用url,headers,data參數(shù)構(gòu)造了一個(gè)Request對(duì)象,再調(diào)用Session的prepare_request()將其轉(zhuǎn)化為一個(gè)Prepared Request對(duì)象,再調(diào)用send()方法發(fā)送即可。
我們把請(qǐng)求當(dāng)作獨(dú)立的對(duì)象來看待,這樣再進(jìn)行隊(duì)列調(diào)度時(shí)會(huì)非常方便。
參考書籍:《Python 3 網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)》
總結(jié)
以上是生活随笔為你收集整理的requests 返回的cookies为空_爬虫学习(2)(requests库)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle插入未调用并行,oracle
- 下一篇: 机器人被抢走ntr_(科普)当被NTR剧