欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

requests 返回的cookies为空_爬虫学习(2)(requests库)

发布时间:2024/7/23 编程问答 55 豆豆
生活随笔 收集整理的这篇文章主要介绍了 requests 返回的cookies为空_爬虫学习(2)(requests库) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

POST请求

import requestsdata = {'name': 'cxc', 'age': 18} r = requests.post("http://httpbin.org/post", data=data) print(r.text)

POST请求

这样就成功地获得了返回结果,form部分就是提交的数据,证明POST请求成功发送了。

响应

之前我们使用了text和content来获得响应的内容。除此之外我们还可以用其他方法来获得类似状态码,响应头,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)

响应

status_code得到响应码,headers得到响应头,cookies得到Cookies,url得到URL,history得到请求历史。


高级用法

1.文件上传

import requestsfiles = {'file': open('favicon.ico', 'rb')} r = requests.post("http://httpbin.org/post", files=files) print(r.text)

这样就可以上传图标到网站,会返回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

这里调用cookies属性即可获得Cookies,它是一个RequestCookieJar类型。可以用items()方法来将其转化为元组组成的列表,来输出每个Cookie的名称和值。

以知乎为例,打开开发者工具,复制headers中的cookie。在headers里设置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

返回的结果里面包含了登录后的结果,就证明登陆成功了。

3.会话维持

在requests中,当我们使用post()和get()时我们时打开了两个浏览器,当我们用post()打开页面时,再用get()去请求个人信息时会失败。

新的方法——Session对象

用旧方法两次get()的结果会得到如下

两次get()

当我们引入Session对象时

import requestss = requests.Session() s.get("http://httpbin.org/cookies/set/number/123456789") r = s.get('http://httpbin.org/cookies') print(r.text)

Session对象

现在我们就可以获得当前的cookies了。

4.SSL证书验证

requests提供了证书验证功能,当发送HTTP请求时,会检查SSL证书,可以使用verify参数控制是否检查证书。

import requestsresponse = requests.get('https://www.12306.cn', verify=False) print(response.status_code)

SSL证书

这时会打印出请求成功的状态码,但会报一个警告,建议我们给他指定的证书,可以通过设置忽略警告来屏蔽它。

import requests from requests.packages import urllib3urllib3.disable_warnings() response = requests.get('https://www.12306.cn', verify=False) print(response.status_code)

5.代理设置

对于某些网站当我们开始大规模爬取时,可能会弹出验证码或者返回登陆页,甚至会封禁IP。为了防止这种情况发生,我们可以用代理来解决问题,需要使用到proxies参数来实现。

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 这样的语法来设置代理。

requests同时支持SOCKS协议的代理,需要安装socks库。

6.超时设置

使用timeout参数设置。

import requestsr = requests.get("https://www.taobao.com", timeout=1) print(r.status_code)

请求分为两个阶段,connect和read,我们可以分别指定时间——timeout=(5,10,30)。如果不设置的话可以timeout=None或者不加参数。

7.身份认证

import requests from requests.auth import HTTPBasicAuthr = requests.get("http://localhost:5000", auth=HTTPBasicAuth('username', 'password')) print(r.status_code)

如果使用OAuth认证需安装oanth库。

8.Prepared Request

我们可以将请求表示为数据结构,其中各个参数都可以通过一个Request对象来表示。

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参数构造了一个Request对象,再调用Session的prepare_request()将其转化为一个Prepared Request对象,再调用send()方法发送即可。

我们把请求当作独立的对象来看待,这样再进行队列调度时会非常方便。

参考书籍:《Python 3 网络爬虫开发实战》

总结

以上是生活随笔为你收集整理的requests 返回的cookies为空_爬虫学习(2)(requests库)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。