在编写代码过程中,我们通常需要大量数据进行测试。手动创建数据既费时又费力,因此使用 Python 的第三方库 Faker 来生成各种测试数据可以事半功倍。Faker 提供了自动生成测试数据的功能,让数据生成变得更加高效。
一、requests安装
pip install requests
二、requests库的七个主要方法
方法 | 描述 |
---|---|
requests.delete() | 发送 DELETE 请求到指定 url |
requests.get() | 发送 GET 请求到指定 url |
requests.head() | 发送 HEAD 请求到指定 url |
requests.options() | 发送OPTIONS 请求到指定 url |
requests.post() | 发送 POST 请求到指定 url |
requests.put() | 发送 PUT 请求到指定 url |
requests.request() | 向指定的 url 发送指定的请求方法 |
三、requests发送请求
<code>import requests</code><code>r = requests.get('https:<em>//api.github.com/events')#发送get请求</em></code><code>r = requests.post('http:<em>//httpbin.org/post', data = {'key':'value'}#发送post请求,并传递数据</em></code><code>r = requests.put('http:<em>//httpbin.org/put', data = {'key':'value'})#发送put请求,并传递数据</em></code><code>r = requests.delete('http:<em>//httpbin.org/delete')#发送delete请求</em></code><code>r = requests.head('http:<em>//httpbin.org/get')#发送head请求</em></code><code>r = requests.options('http:<em>//httpbin.org/get')#发送options请求</em></code><code>r = requests.get('http:<em>//httpbin.org/get', params=payload)#发送传参请求</em></code><code>r = requests.post('http:<em>//httpbin.org/post', files={'file': open('report.xls', 'rb')})#发送post请求,上传文件</em></code><code></code>
四、requests发送请求响应结果
<code>import requests</code><code>url='https://www.baidu.com/'</code><code>response = requests.get(url=url)</code><code>print(response.status_code)<em># 获取响应的状态码</em></code><code>print(response.encoding)<em># 获取编码方式</em></code><code>print(response.text)<em>#查看响应的内容</em></code><code>print(response.content)<em># content获取的是response对象中的二进制(byte)类型的页面数据</em></code><code>print(response.json())<em>#json响应内容</em></code><code>print(response.status_code)<em># 返回一个响应状态码</em></code><code>print(response.headers)<em># 返回响应头信息</em></code><code>print(response.url)<em># 获取请求的url</em></code><code>print(response.history)<em>#追踪重定向</em></code>
五、设置请求头
<code>import requests</code><code>headers = {</code><code> 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0',</code><code> 'my-test':'Hello'</code><code>}</code><code>r = requests.get('http://httpbin.org/get',headers=headers)</code><code>print(r.text)</code>
六、文件上传
requests可以实现文件上传,具体代码如下。
<code>import requests</code><code>files = {'file':open('favicon.ico','rb')}</code><code><em>#进行上传</em></code><code>r = requests.post('http://httpbin.org/post',files=files)</code><code>print(r.text)</code>
也可以流式上传
Requests支持流式上传,这允许你发送大的数据流或文件而无需先把它们读入内存。要使用流式上传,仅需为你的请求体提供一个类文件对象即可:
<code>with open('massive-body') as f:</code><code> requests.post('http://some.url/streamed', data=f)</code>
七、SSL证书验证
requests提供了证书验证功能,当发送HTTP请求时使用verify参数检查SSL证书。请求HTTPS网站时,如果该网站的证书没有被CA机构信任,会提示SSL证书验证错误。只需要将verify参数设置为False即可解决。
<code>import requests</code><code>resposne = requests.get('https:<em>//www.12306.cn',verify=False)</em></code><code>print(response.status_code)</code>
也可以指定一个本地证书用作客户端证书,可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组。
<code>import requests</code><code>requests.get('https://www.12306.cn', verify='/path/to/certfile')<em>#单个证书</em></code><code><em>#本地需要有crt和key文件(key必须是解密状态,加密状态的key是不支持的),并指定它们的路径,</em></code><code>response = requests.get('https://www.12306.cn',cert('/path/server.crt','/path/key'))</code><code>print(response.status_code)</code>
八、代理设置
对于某些网站,请求几次时能正常获取内容,一旦开始大规模、频繁地爬取可能会弹出验证码或跳转到登录验证页面,更有甚者直接封禁客户端的IP,导致一段时间内无法访问。为了防止这种情况,需要使用代理来解决这个问题。
1。设置代理
<code>import requests</code><code><br></code><code>proxies = {</code><code> <em>#该代理服务器在免费代理网站上得到的,这样的网站有很多</em></code><code> 'http': 'http://161.35.4.201:80',</code><code> 'https': 'https://161.35.4.201:80'</code><code>}</code><code>try:</code><code> response = requests.get('http://httpbin.org/get', proxies=proxies)</code><code> print(response.text)</code><code>except requests.exceptions.ConnectionError as e:</code><code> print('Error', e.args)</code>
2.如果代理需要使用HTTP Basic Auth,可以使用类似http://user:password@host:port这样的语法来设置代理。
<code>import requests</code><code>proxies = {</code><code> "http":"http://user:password@161.35.4.201:80"</code><code>}</code><code>r = requests.get("https://www.taobao.com",proxies=proxies)</code><code>print(r.text)</code>
3。除了基本的HTTP代理外,requests还支持SOCKS协议的代理。首先需要安装socks这个库:pip3 install ‘requests[socks]’
<code>import requests</code><code>proxies = {</code><code> 'http':'socks5://user:password@host:port',</code><code> 'https':'socks5://user:password@host:port'</code><code>}</code><code>request.get('https://www.taobao.com',proxies=proxies)</code>
九、上传Cookie
发送你的cookies到服务器,可以使用 cookies
参数
r = requests.get(url='http://httpbin.org/post', cookies=dict(cookies_are='working'))
Cookie 的返回对象为 RequestsCookieJar
,它的行为和字典类似,但接口更为完整,适合跨域名跨路径使用。
十、回话对象,即保持登录状态方法
会话对象让你能够跨请求保持某些参数。如果向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来性能提升。
<code>s = requests.Session()</code><code>s.get('https://www.baidu.com')</code>
十一、超时设置
在网络状况不好或者服务器网络响应太慢甚至无响应时,可能会等待很久才收到响应,甚至到最后收不到响应而报错。为了应对这种情况可以设置一个超时时间,这个时间是计算机发出请求到服务器返回响应的时间,如果请求超时就抛出错误。这就需要使用timeout参数实现,单位为秒。
1.指定请求总的超时时间
<code>import requests</code><code>#向百度发出请求,如果1秒内没有得到响应,则抛出错误</code><code>r = requests.get('https:<em>//www.baidu.com/',timeout=1)</em></code><code>print(r.status_code)</code>
2.分别指定超时时间。实际上,请求分为两个阶段:连接(connect)和读取(read)。如果给timeout参数指定一个整数值,则超时时 间是这两个阶段的总和;如果要分别指定,就可以传入一个元组,连接超时时间和读取超时时间:
<code>import requests</code><code>#向百度发出请求,如果连接阶段5秒内没有得到响应或读取阶段30秒内没有得到响应,则抛出错误</code><code>r = requests.get('https:<em>//www.baidu.com',timeout=(5,30))</em></code><code>print(r.status_code)</code>
3.如果想永久等待,可以直接timeout设置为None,或者不设置timeout参数,因为它的默认值就是None。
<code>import requests</code><code><em>#向百度发出请求,如果连接阶段5秒内没有得到响应或读取阶段30秒内没有得到响应,则抛出错误</em></code><code>r = requests.get('https://www.baidu.com',timeout=None))</code><code>print(r.status_code)</code>
十二、身份验证
访问某网站时,可能会遇到需要先登录才能访问
1.使用requests自带的身份验证功能HTTPBasicAuth类实现。
<code>import requests</code><code>from requests.auth import HTTPBasicAuth</code><code>r = requests.get('http://localhost/',auth=HTTPBasicAuth('admin','123456'))</code><code>print(r.status_code)</code>
如果用户名和密码正确,返回200状态码;如果不正确,则返回401状态码。也可以不使用HTTPBasicAuth类,而是直接传入一个元组,它会默认使用HTTPBasicAuth类来验证。
<code>import requests</code><code>from requests.auth import HTTPBasicAuth</code><code>r = requests.get('http://localhost/',auth=('admin','123456'))</code><code>print(r.status_code)</code>
2.requests还提供了其他验证方式,如OAuth验证,不过需要安装oauth包,安装命令:
pip3 install requests_oauthlib
使用OAuth验证的方法如下:
<code>import requests</code><code>from requests_oauthlib import OAuth1</code><code>url = 'https:<em>//api.twitter.com/1.1/account/verify_credentials.json'</em></code><code>auth = OAuth1("YOUR_APP_KEY","YOUR_APP_SECRET","USER_OAUTH_TOKEN","USER_OAUTH_TOKEN_SECRET")</code><code>requests.get(url,auth=auth)</code>
十三、错误与异常
遇到网络问题(如:DNS 查询失败、拒绝连接等)时,Requests 会抛出一个 ConnectionError 异常。
如果 HTTP 请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常。
若请求超时,则抛出一个 Timeout 异常。
若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。
暂无评论内容