python之requests库


Requests是基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库。

比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。

安装

pip install requests

使用

测试网站http://httpbin.org/

GET请求
import requests

# 不带参数
r = requests.get('http://httpbin.org/get')
print(r.text)

# 携带参数
data = {
    'name':'zhangsan',
    'age':20,
}
r1 = requests.get('http://httpbin.org/get', params=data)
r3.encoding = 'utf-8'   # 设置编码
print(r1.text)


#如果是中文或者有其他特殊符号,则进行url编码
from urllib.parse import urlencode
job = "程序员"
parm = urlencode(job, encoding="utf-8")
# 再进行拼接后进行后续请求...
POST请求
import requests

# 不带参数
r = requests.post('http://httpbin.org/post')
print(r.text)


# 携带参数
data = {
    'user': 1,
    'pwd': 'hhh',
    'submit': 'submit',
}
r1 = requests.post('http://httpbin.org/post', data=data)
请求头

# 自定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36',
}
response1 = requests.get(url, headers=headers,params=data)


# 打印请求头
print(response1.request.headers)

# 两种遍历方式
for key, value in r3.headers.items():
    print(key+":"+value)
print("************************************")
for key in r3.headers:   # 不是请求头
    print(key + ":" + (r3.headers)[key])
响应信息
# 响应头
print(response1.headers)

# 其他信息
print(response1.headers['Server'])
print(response1.url)   # 打印url
print(response1.status_code)   # 状态码 200
print(response1.cookies.items())   # cookie
print(response1.apparent_encoding)  # 提供的编码
print(response1.elapsed)  # 请求到响应的时间
print(r.history)    # history属性得到请求历史

# cookie操作
print(response1.headers['Set-Cookie'])

print(response.text)    #   响应返回的数据: str
print(response.content)   #  响应返回的数据: 二进制形式

# 对文件内容查找(比如被安全狗拦截后页面中会有关键字:`safedog`)
...
if response.text.find('safedor'):
    print('被拦截')
else:
    print('绕过')
...



# 比如爬图片,音乐,视频就是用的二进制数据
import requests
response = requests.get('http://xpshuai.cn/favicon.ico')
# 保存图片  wb写入
with open('favicon.ico','wb')as f:
    f.write(response.content)
解析json

使用json()方法,就可以将返回结果是JSON格式的字符串转化为字典

import requests

r = requests.get('http://httpbin.org/get')
print(r.text)
print(type(r.text))   # <class 'str'>
print(r.json())
print(type(r.json()))  # <class 'dict'>
SSL证书检验
# 参数  verify=False时表示,对于 https 不验证证书

r = requests.get(url1, verify=False)

设置代理
import requests

proxies = {'http': ' http://127.0.0.1:8080', 'https': ' https://127.0.0.1:8080'}

r = requests.get(url, proxies=proxies, verify=False)

可以设置代理池, 随机更换

proxies = []

request = requests.get(url, proxies={'http': random.choice(proxies)}, headers=head) 

自定义cookie
#打印cookie
for key,value in r.cookies.items():
    print(key + '=' + value)

1.简单的做法:


import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/"
                 "537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}

cookies = {"cookie_name": "cookie_value", }
response = requests.get(url, headers=headers, cookies=cookies)


2.CookieJar

更专业的方式:先实例化一个RequestCookieJar的类,然后把值set进去,最后在get,post方法里面指定cookies参数



from http.cookiejar import CookieJar


requests.cookies.update()

c = requests.cookies.RequestsCookieJar()
c.set('cookie-name', 'cookie-value', path='/', domain='.abc.com')
s.cookies.update(c)

3.requests.Session()方法

session = requests.Session()
session.cookies['cookie'] = 'cookie-value'

# 功能:可以添加cookie,不会清除原cookie
# 缺点:不能设置path,domain等参数
session

会话维持

在requests中,如果直接利用get()或post()等方法的确可以做到模拟网页的请求,但是这实际上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面。

import requests


headers = {
    "content-type": "application/x-www-form-urlencoded;charset=UTF-8",
    "User-Agent" : "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6) ",
}

#设置一个会话session对象s
s = requests.session()
resp = s.get('https://www.baidu.com/s?wd=python', headers=headers)
# 打印请求头和cookies
print(resp.request.headers)
print(resp.cookies)

# 利用s再访问一次
resp = s.get('https://www.baidu.com/s?wd=python', headers=headers)

# 请求头已`保持`首次请求后产生的cookie
print(resp.request.headers)

异常处理

进行网络请求的时候,难免会出错,这时候为了程序能够继续运行下去,就要对异常进行处理

# 最简单的一种

try:
    # 请求过程
    r = requests.get(url1, headers=headers, verify=False, params=data, cookies=cookies)
    # ......

except Exception as e:
    time.sleep(1)
    print(e)

finally:
    print("程序执行结束!")

文件上传
import requests

files = {
    'file':open('favicon.ico','rb')
}

r = requests.post('http://www.httpbin.org/post',files=files)
print(r.text)



文章作者: 剑胆琴心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 剑胆琴心 !
评论
 上一篇
upload-labs通关记录 upload-labs通关记录
本文主要记录一下upload-labs最新21关卡的过程,作为自己的一个笔记。 靶场地址:https://github.com/c0ny1/upload-labs/ ps: - 为了快速验证效果,此处上传的webshell代码为<
2020-02-17
下一篇 
python正则表达式 python正则表达式
常用正则表达式来对爬取的网页进行解析,但是正则表达式的构造稍微复杂一点,一般在结构化的网页中没必要用正则(易出错) # findall a = re.findall('jianeng',s ) ## 搜索字符串,以列表类型返回全部能匹配的
2020-02-17
  目录