网站建设yankt,青岛谷歌推广,怎么去创建一个公司,手机官方一、requests简介
#简介#xff1a;使用requests可以模拟浏览器的请求#xff0c;比起之前用的urllib#xff0c;requests模块的api更加便捷#xff08;本质就是封装了urllib3#xff09;#注意#xff1a;requests库发送请求将网页内容下载下来以后#xff0c;并不会执…
一、requests简介
#简介使用requests可以模拟浏览器的请求比起之前用的urllibrequests模块的api更加便捷本质就是封装了urllib3#注意requests库发送请求将网页内容下载下来以后并不会执行js代码这需要我们自己分析目标站点然后发起新的request请求#安装pip3 install requests#各种请求方式常用的就是requests.get()和requests.post() import requestsr requests.get(https://api.github.com/events)r requests.post(http://httpbin.org/post, data {key:value})r requests.put(http://httpbin.org/put, data {key:value})r requests.delete(http://httpbin.org/delete)r requests.head(http://httpbin.org/get)r requests.options(http://httpbin.org/get)
二 、基于requests之GET请求
1、基本请求
import requests
responserequests.get(http://dig.chouti.com/)
print(response.text) # 字符串格式 content 二进制格式
2、带参数的GET请求-params
# 在请求头内将自己伪装成浏览器否则百度不会正常返回页面内容
# 软件测试技术群603401995
url https://www.baidu.com/s?wd软件测试pn1
headers{User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36}import requests
responserequests.get(urlurl, headersheaders)
print(response.text)# 如果查询关键词是中文或者有其他特殊符号则不得不进行url编码
# 软件测试技术群603401995
from urllib.parse import urlencode
wd软件测试
encode_resurlencode({k:wd},encodingutf-8)
keywordencode_res.split()[1]
print(keyword)
# 然后拼接成url
urlhttps://www.baidu.com/s?wd%spn1%keyword
responserequests.get(url,headers{User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36})
res1response.text
# 上述操作可以用requests模块的一个params参数搞定本质还是调用urlencode
# 软件测试技术群603401995
from urllib.parse import urlencode
wd软件测试
pn1responserequests.get(https://www.baidu.com/s,params{wd:wd,pn:pn},headers{User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36,})
res2response.text# 验证结果打开a.html与b.html页面内容一样
# 软件测试技术群603401995
with open(a.html,w,encodingutf-8) as f:
f.write(res1)
with open(b.html, w, encodingutf-8) as f:
f.write(res2)
3、带参数的GET请求-headers
#通常我们在发送请求时都需要带上请求头请求头是将自身伪装成浏览器的关键常见的有用的请求头如下
Host
Referer #大型网站通常都会根据该参数判断请求的来源
User-Agent #客户端
Cookie #Cookie信息虽然包含在请求头里但requests模块有单独的参数来处理他headers{}内就不要放它了
#添加headers(浏览器会识别请求头,不加可能会被拒绝访问,比如访问https://www.zhihu.com/explore)
import requests
responserequests.get(https://www.zhihu.com/explore)
response.status_code #500#自己定制headers
headers{
User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36,
}
responerequests.get(https://www.zhihu.com/explore,headersheaders)
print(respone.status_code) #200
4、带参数的GET请求-cookies
#登录github然后从浏览器中获取cookies以后就可以直接拿着cookie登录了无需输入用户名密码
#用户名:admin 邮箱123456qq.com 密码123456
import requests
Cookies{user_session:wGMHFJKgDcmRIVvcA14_Wrt_3xaUyJNsBnPbYzEL6L0bHcfc,
}
responserequests.get(https://github.com/settings/emails,cookiesCookies)
print(123456qq.com in response.text) #True
现在我也找了很多测试的朋友做了一个分享技术的交流群共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源没人解答问题坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化性能安全测试开发等等方面有一定建树的技术大牛
分享他们的经验还会分享很多直播讲座和技术沙龙
可以免费学习划重点开源的
qq群号110685036 三 、基于POST请求
1、介绍 # GET请求 HTTP默认的请求方法就是GET 1.没有请求体 2.数据必须在1K之内 3.GET请求数据会暴露在浏览器的地址栏中 GET请求常用的操作 1. 在浏览器的地址栏中直接给出URL那么就一定是GET请求 2. 点击页面上的超链接也一定是GET请求 3. 提交表单时表单默认使用GET请求但可以设置为POST # POST请求 1.数据不会出现在地址栏中 2.数据的大小没有上限 3.有请求体 4.请求体中如果存在中文会使用URL编码 #requests.post()用法与requests.get()完全一致特殊的是requests.post()有一个data参数用来存放请求体数据 2、发送POST请求模拟浏览器的登录行为 #对于登录来说应该输错用户名或密码然后分析抓包流程用脑子想一想输对了浏览器就跳转了还分析个毛线累死你也找不到包 2 一 目标站点分析3 浏览器输入https://github.com/login4 然后输入错误的账号密码抓包5 发现登录行为是post提交到https://github.com/session6 而且请求头包含cookie7 而且请求体包含8 commit:Sign in9 utf8:✓
10 authenticity_token:lbI8IJCwGslZS8qJPnof5e7ZkCoSoMn6jmDTsL1r/m06NLyIbw7vCrpwrFAPzHMep3Tmf/TSJVoXWrvDZaVwxQ
11 login:admin
12 password:123456
13
14
15 二 流程分析
16 先GEThttps://github.com/login拿到初始cookie与authenticity_token
17 返回POSThttps://github.com/session 带上初始cookie带上请求体authenticity_token用户名密码等
18 最后拿到登录cookie
19
20 ps如果密码时密文形式则可以先输错账号输对密码然后到浏览器中拿到加密后的密码github的密码是明文
21
22
23 import requests
24 import re
25
26 #第一次请求
27 r1requests.get(https://github.com/login)
28 r1_cookier1.cookies.get_dict() #拿到初始cookie(未被授权)
29 authenticity_tokenre.findall(rnameauthenticity_token.*?value(.*?),r1.text)[0] #从页面中拿到CSRF TOKEN
30
31 #第二次请求带着初始cookie和TOKEN发送POST请求给登录页面带上账号密码
32 data{
33 commit:Sign in,
34 utf8:✓,
35 authenticity_token:authenticity_token,
36 login:123456qq.com,
37 password:alex3714
38 }
39 r2requests.post(https://github.com/session,
40 datadata,
41 cookiesr1_cookie
42 )
43
44
45 login_cookier2.cookies.get_dict()
46
47
48 #第三次请求以后的登录拿着login_cookie就可以,比如访问一些个人配置
49 r3requests.get(https://github.com/settings/emails,
50 cookieslogin_cookie)
51
52 print(123456qq.com in r3.text) #True
import requests
import resessionrequests.session()
#第一次请求
r1session.get(https://github.com/login)
authenticity_tokenre.findall(rnameauthenticity_token.*?value(.*?),r1.text)[0] #从页面中拿到CSRF TOKEN
#第二次请求
data{commit:Sign in,utf8:✓,authenticity_token:authenticity_token,login:123456qq.com,password:alex3714
}
r2session.post(https://github.com/session,datadata,)
#第三次请求
r3session.get(https://github.com/settings/emails)
print(123456qq.com in r3.text) #True
requests.session()自动帮我们保存cookie信息
3、补充
requests.post(urlxxxxxxxx,data{xxx:yyy}) #没有指定请求头,#默认的请求头:application/x-www-form-urlencoed
#如果我们自定义请求头是application/json,并且用data传值, 则服务端取不到值
requests.post(url,data{:1,},headers{content-type:application/json})
requests.post(url,json{:1,},) #默认的请求头:application/json
四、 响应Response
1、response属性
import requests
responerequests.get(http://www.jianshu.com)
# respone属性
print(respone.text)
print(respone.content)
print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.cookies.items())
print(respone.url)
print(respone.history)
print(respone.encoding)
#关闭response.close()
from contextlib import closing
with closing(requests.get(xxx,streamTrue)) as response:for line in response.iter_content():pass
2、编码的问题
#编码问题
import requests
responserequests.get(http://www.autohome.com/news)
# response.encodinggbk #汽车之家网站返回的页面内容为gb2312编码的而requests的默认编码为ISO-8859-1如果不设置成gbk则中文乱码
print(response.text)
3、获取二进制数据
import requestsresponserequests.get(https://timgsa.baidu.com/timg?imagequality80sizeb9999_10000sec123456di712e4ef3ab258b36e9f4b48e85a81c9dimgtype0srchttp%3A%2F%2Fc.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F11385343fbf2b211e1fb58a1c08065380dd78e0c.jpg)
with open(a.jpg,wb) as f:f.write(response.content)
#stream参数:一点一点的取,比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的
import requestsresponserequests.get(https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-smallvideo-transcode/1767502_56ec685f9c7ec542eeaf6eac93a65dc7_6fe25cd1347c_3.mp4,streamTrue)with open(b.mp4,wb) as f:for line in response.iter_content():f.write(line)
4、解析json
#解析json
import requests
responserequests.get(http://httpbin.org/get)import json
res1json.loads(response.text) #太麻烦
res2response.json() #直接获取json数据
print(res1 res2) #True
5、Redirection and History
import requests
import re#第一次请求
r1requests.get(https://github.com/login)
r1_cookier1.cookies.get_dict() #拿到初始cookie(未被授权)
authenticity_tokenre.findall(rnameauthenticity_token.*?value(.*?),r1.text)[0] #从页面中拿到CSRF TOKEN#第二次请求带着初始cookie和TOKEN发送POST请求给登录页面带上账号密码
data{commit:Sign in,utf8:✓,authenticity_token:authenticity_token,login:123456qq.com,password:alex3714
}#测试一没有指定allow_redirectsFalse,则响应头中出现Location就跳转到新页面r2代表新页面的response
r2requests.post(https://github.com/session,datadata,cookiesr1_cookie)
print(r2.status_code) #200
print(r2.url) #看到的是跳转后的页面
print(r2.history) #看到的是跳转前的response
print(r2.history[0].text) #看到的是跳转前的response.text#测试二指定allow_redirectsFalse,则响应头中即便出现Location也不会跳转到新页面r2代表的仍然是老页面的response
r2requests.post(https://github.com/session,datadata,cookiesr1_cookie,allow_redirectsFalse)print(r2.status_code) #302
print(r2.url) #看到的是跳转前的页面https://github.com/session
print(r2.history) #[]
五、高级用法
1、SSL Cert Verification
#证书验证(大部分网站都是https)
import requests
responerequests.get(https://www.12306.cn) #如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端#改进1:去掉报错,但是会报警告
import requests
responerequests.get(https://www.12306.cn,verifyFalse) #不验证证书,报警告,返回200
print(respone.status_code)#改进2:去掉报错,并且去掉警报信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
responerequests.get(https://www.12306.cn,verifyFalse)
print(respone.status_code)#改进3:加上证书
#很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
#知乎\百度等都是可带可不带
#有硬性要求的,则必须带比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
responerequests.get(https://www.12306.cn,cert(/path/server.crt,/path/key))
print(respone.status_code)
2、使用代理
#官网链接: http://docs.python-requests.org/en/master/user/advanced/#proxies#代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
import requests
proxies{http:http://egon:123localhost:9743,#带用户名密码的代理,符号前是用户名与密码http:http://localhost:9743,https:https://localhost:9743,
}
responerequests.get(https://www.12306.cn,proxiesproxies)print(respone.status_code)#支持socks代理,安装:pip install requests[socks]
import requests
proxies {http: socks5://user:passhost:port,https: socks5://user:passhost:port
}
responerequests.get(https://www.12306.cn,proxiesproxies)
print(respone.status_code)
3、超时设置
#超时设置
#两种超时:float or tuple
#timeout0.1 #代表接收数据的超时时间
#timeout(0.1,0.2)#0.1代表链接超时 0.2代表接收数据的超时时间import requests
responerequests.get(https://www.baidu.com,timeout0.0001)
4、认证设置
#官网链接http://docs.python-requests.org/en/master/user/authentication/# 认证设置:登陆网站是,弹出一个框,要求你输入用户名密码与alter很类似此时是无法获取html的
# 但本质原理是拼接成请求头发送r.headers[Authorization] _basic_auth_str(self.username, self.password)
# 一般的网站都不用默认的加密方式都是自己写
# 那么我们就需要按照网站的加密方式自己写一个类似于_basic_auth_str的方法
# 得到加密字符串后添加到请求头
# r.headers[Authorization] func(.....)#看一看默认的加密方式吧通常网站都不会用默认的加密设置
import requests
from requests.auth import HTTPBasicAuth
rrequests.get(xxx,authHTTPBasicAuth(user,password))
print(r.status_code)#HTTPBasicAuth可以简写为如下格式
import requests
rrequests.get(xxx,auth(user,password))
print(r.status_code)
5、异常处理
#异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型
try:rrequests.get(http://www.baidu.com,timeout0.00001)
except ReadTimeout:print(:)
# except ConnectionError: #网络不通
# print(-----)
# except Timeout:
# print(aaaaa)
except RequestException:print(Error)
6、上传文件
import requests
files{file:open(a.jpg,rb)}
responerequests.post(http://httpbin.org/post,filesfiles)
print(respone.status_code)今天的分享就到此结束了大家还有什么不懂的可以评论区下提问哈如果我的文章对你有所帮助的话可以点赞三联支持一下哈