有的网站需要上传文件,requests也是可以实现的
import requests
files = {'file': open('favicon.ico', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text)
返回信息:
里面包含files字段,而form字段为空,上传文件会单独有一个files字段来标识
Cookies
requests获取和设置Cookies只需要一步完成
import requests
r = requests.get('https://www.baidu.com')
print(r.cookies)
for key, value in r.cookies.items():
print('key', key)
print('value', value)
返回信息:
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
key BDORZ
value 27315
当前,也可以直接用Cookie来维持登陆状态,以知乎为例,首先手动登陆知乎,将headers中的Cookie内容复制下来,如下
替换成自己的Cookie,将其设置到Headers里面,然后发送请求,代码如下:
import requests
from lxml import etree
headers = {
'Cookie': '_zap=f4035a0b-8bfb-48a5-aa70-b7d8f4869ba1; d_c0="ANCiqSDGFQ-PTtCXuKtT4JGPAeK9D1cRg6o=|1551939261"; _xsrf=2pscD3eR3N0O9jzliq2mz10TV2GgjiS1; l_n_c=1; q_c1=595a8a7635b94542b6b1c2c38ebbbf47|1556768730000|1551953498000; n_c=1; __utmc=51854390; l_cap_id="NmM5ZTFkNmQ0ZThkNGI0NDhiYmVmNjk2N2NlYTI0MjY=|1556779328|650703f96dd8d8a37edaad8d5e0881387e4b741b"; r_cap_id="YzdmODU3NDgyZmExNGRiYjlmY2Q4ZTRkZTU1OGM0ZTk=|1556779328|d53af2805f0470f6094cd6f89d77e5e951613f52"; cap_id="YmE4ZWUxNWQzYTUzNGRiOGIxMWRmZTdkZjgzOTIxY2Q=|1556779328|ee07cf5f16741ec8adf2260f5ee5b4721eee368d"; tgw_l7_route=060f637cd101836814f6c53316f73463; capsion_ticket="2|1:0|10:1556784084|14:capsion_ticket|44:OWQ1NWFhZWFkYjE3NDEyYmI1OTk5MjhmMDllZTQ5Y2M=|1e096bca37010e87064d5f808f1e751d91360682533003571a4831f394762b52"; z_c0="2|1:0|10:1556784104|4:z_c0|92:Mi4xZUtBQUJnQUFBQUFBMEtLcElNWVZEeVlBQUFCZ0FsVk42UEczWFFEZ3lsNlhuMWVSaE5ya3VyUkJwcFltWEVRNmJn|3cd3acf0dc8fd2d29d2d49bb0e1be9336228f3acefe04ffc0285def38ff993b3"; __utma=51854390.1875686252.1556768732.1556779331.1556784108.3; __utmb=51854390.0.10.1556784108; __utmz=51854390.1556784108.3.2.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin; __utmv=51854390.100--|2=registration_date=20170921=1^3=entry_date=20170921=1',
'Host': 'www.zhihu.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
r = requests.get('https://www.zhihu.com', headers=headers).content.decode('utf-8')
# 使用xptah解析html页面,获取登陆后的文章
content = etree.HTML(r)
tag_list = content.xpath("//a[@data-za-detail-view-element_name='Title']/text()")
print(tag_list)
返回信息:
['有哪些好用不火的软件?', '你见过最渣的渣女有多渣?', '三十岁左右的你,现在收入多少?', '如果好莱坞来拍《流浪地球》应该如何?', '你们看到过最丧的句子是什么?', '亲姐弟之间要不要避嫌?']
当前也可以通过cookies参数来设置,需要构造RequestsCookieJar对象,需要分割一下cookies,相对麻烦,不过效果是相同的,代码如下:
import requests
from lxml import etree
cookies = '_zap=f4035a0b-8bfb-48a5-aa70-b7d8f4869ba1; d_c0="ANCiqSDGFQ-PTtCXuKtT4JGPAeK9D1cRg6o=|1551939261"; _xsrf=2pscD3eR3N0O9jzliq2mz10TV2GgjiS1; l_n_c=1; q_c1=595a8a7635b94542b6b1c2c38ebbbf47|1556768730000|1551953498000; n_c=1; __utmc=51854390; l_cap_id="NmM5ZTFkNmQ0ZThkNGI0NDhiYmVmNjk2N2NlYTI0MjY=|1556779328|650703f96dd8d8a37edaad8d5e0881387e4b741b"; r_cap_id="YzdmODU3NDgyZmExNGRiYjlmY2Q4ZTRkZTU1OGM0ZTk=|1556779328|d53af2805f0470f6094cd6f89d77e5e951613f52"; cap_id="YmE4ZWUxNWQzYTUzNGRiOGIxMWRmZTdkZjgzOTIxY2Q=|1556779328|ee07cf5f16741ec8adf2260f5ee5b4721eee368d"; tgw_l7_route=060f637cd101836814f6c53316f73463; capsion_ticket="2|1:0|10:1556784084|14:capsion_ticket|44:OWQ1NWFhZWFkYjE3NDEyYmI1OTk5MjhmMDllZTQ5Y2M=|1e096bca37010e87064d5f808f1e751d91360682533003571a4831f394762b52"; z_c0="2|1:0|10:1556784104|4:z_c0|92:Mi4xZUtBQUJnQUFBQUFBMEtLcElNWVZEeVlBQUFCZ0FsVk42UEczWFFEZ3lsNlhuMWVSaE5ya3VyUkJwcFltWEVRNmJn|3cd3acf0dc8fd2d29d2d49bb0e1be9336228f3acefe04ffc0285def38ff993b3"; __utma=51854390.1875686252.1556768732.1556779331.1556784108.3; __utmb=51854390.0.10.1556784108; __utmz=51854390.1556784108.3.2.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin; __utmv=51854390.100--|2=registration_date=20170921=1^3=entry_date=20170921=1'
jar = requests.cookies.RequestsCookieJar()
headers = {'Host': 'www.zhihu.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}
for cookie in cookies.split(';'):
key, value = cookie.split('=', 1)
jar.set(key, value)
r = requests.get('https://www.zhihu.com', cookies=jar, headers=headers).content.decode('utf-8')
# 使用xptah解析html页面,获取登陆后的文章
content = etree.HTML(r)
tag_list = content.xpath("//a[@data-za-detail-view-element_name='Title']/text()")
print(tag_list)
返回信息:
['你认为真正的好电影是什么样的?', '一个程序员的水平能差到什么程度?', '有什么是你面试很多次都失败后才知道的?', '一个人健身前和健身后有什么区别?', '香港警察真的像TVB演的那样吗?', '炫富真的很爽吗?']
测试后,同样是可以登录知乎的。
会话维持
在requests中,如果直接利用get()或post()等方法的确可以做到模拟网页请求,但这实际上是相当于不同的会话,其实相当于你用了两个浏览器打开了不同的页面。
设想一个场景,第一个请求利用post()方法登录了网站,第二次想获取成功登陆后的个人信息,又用了一次get()方法请求个人信息页面,这就相当于打开了两个浏览器,是完全两个不同的会话,肯定不能获取个人信息的。
解决这个问题的方法就是维持同一个会话,也就是相当于打开一个新的浏览器选项卡,而不是打开一个新的浏览器,需要用到新的利器Session对象。
利用它,可以方便的维护同一个会话,而不用担心cookies的问题
错误示例如下:
import requests
r1 = requests.get('http://httpbin.org/cookies/set/username/root')
print(r1.text)
r2 = requests.get('http://httpbin.org/cookies')
print(r2.text)
返回信息:
从显示的结果来看,很明显是两次请求
Session的使用,正确的示例:
import requests
s = requests.Session()
r1 = s.get('http://httpbin.org/cookies/set/username/root')
print(r1.text)
r2 = s.get('http://httpbin.org/cookies')
print(r2.text)
返回信息:
利用Session可以做到模拟同一个会话而不用担心cookies的问题,通常用于模拟登陆成功之后再进行下一步的操作。