Python3基本请求库-requests

requests

基本请求

import requests

r=request.get('https://www.baidu.com/')
print(type(r))
print(r.status_code)
print(r.cookies)

#get post put delete patch 请求

GET请求

当使用get请求需要填写参数时r=request.get('https://www.baidu.com/',params=xxx),如果返回结果得到的是一个json数据可以直接利用r.json() 返回dict字典,也可以利用json.loads(r) ,当返回结果不是JSON格式时,就会出现解析错误json.decoder.JSONDecodeError

import requests

r = requests.get('https://scrape.center/favicon.ico')
    #写二进制模式
    with open('favicon.ico', 'wb') as f:
      #返回一个二进制类型的数据
        f.write(r.content)

POST请求

requests.codes中有一系列返回值

高级用法

# 文件上传二进制,文件要在当前目录下
import requests

files = {
        'file': open('favicon.ico', 'rb')
    }
    r=requests.post('https://www.httpbin.org/post',files=files)
    print(r.text)
Cookie设置
#获取Cookie
import requests

r=requests.post('https://www.baidu.com')
#获取Cookie
print(r.cookies)
for key,val in r.cookies.items():
  #将Cookie转为元组组成的列表
	print(key+'='+value)
  
  #type类型为RequestsCookieJar

在请求中使用Cookie保持登录状态可以在 headers={'Cookie':'xxx'} request.get('xxx',headers=headers)。也可以通过cookies参数设置Cookie的信息,通过构造一个RequestsCookieJar

import requests

cookies = 'BIDUPSID=E16F55A9FF7CF6BF07906FA4BEDCF543; PSTM=1680413378; BD_UPN=123253; BAIDUID=E16F55A9FF7CF6BF731AB63A82BC5E32:SL=0:NR=10:FG=1; sug=3; ORIGIN=0; bdime=0; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BDUSS=H5oTTVFZ1lFWHZoSlVLeTRBSX5rem1aNGZqNU1YSW9hWWVlRlZzWFJUODRibDlrSVFBQUFBJCQAAAAAAAAAAAEAAAC7Iq14yKK49sP719ZqYsTRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjhN2Q44TdkN; BDUSS_BFESS=H5oTTVFZ1lFWHZoSlVLeTRBSX5rem1aNGZqNU1YSW9hWWVlRlZzWFJUODRibDlrSVFBQUFBJCQAAAAAAAAAAAEAAAC7Iq14yKK49sP719ZqYsTRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADjhN2Q44TdkN; BA_HECTOR=alak04ag8g0h20a48h8g0ld61i3ndoi1m; BAIDUID_BFESS=E16F55A9FF7CF6BF731AB63A82BC5E32:SL=0:NR=10:FG=1; ZFY=3aeAMdk:BG1PVSEjejdIhwUS5bzhZswS3Qh1RcMHJnJ8:C; delPer=1; BD_CK_SAM=1; BD_HOME=1; sugstore=0; channel=baidusearch; PSINO=6; baikeVisitId=7a9d5db3-1be9-44e6-97a2-5e4a0db6ae12; COOKIE_SESSION=4537_0_8_6_21_10_1_0_8_6_1_0_13751_0_0_0_1681633025_0_1681637560%7C9%230_0_1681637560%7C1; H_PS_645EC=23b5%2FDlrjdjm5ydHb7GX6HzG4g7dotMV1q%2F8vhfTWf4zNlGxitUBfmBkvrI; BDRCVFR[ibifSmLtzfY]=mk3SLVN4HKm; H_PS_PSSID='

# 获取RequestsCookieJar对象
jar = requests.cookies.RequestsCookieJar()
headers = {
       'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}
# 通过截取cookies中的键值对进行赋值
for cookie in cookies.split(';'):
   key, val = cookie.split('=', 1)
   jar.set(key, val)
#   将Cookie使用RequestsCookieJar传播
r=requests.get('https://www.baidu.com',headers=headers,cookies=jar)
print(r.text)
SSL

当遇到需要SSL证书的网站,导致出现您的连接不是私密连接这样的错误时,如果直接请求网站会抛出SSLError错误,因为请求的URL证书是无效的

如果想解决可以在请求中添加verify=False,如果不设置默认为True会自动验证证书。但是设置False后还会显示警告,建议给它指定的证书。可以通过urllib3.disable.warnings()来忽略警告(from requests.packages import urllib3)。或者捕获警告到日志logging.captureWarnings(True)(from logging)

也可以通过本地证书来用作客户端证书,这可以是单个文件(包含密钥和证书或者一个包含两个文件路径的元组)cert=('xxx.crt','xxx。key‘),本地的key必须是解密状态

超时时间 timeout

当服务器响应过慢后者本地网络状况不佳,最后因为收不到响应而报错,可以使用timeout=默认为秒,也可以传入一个元组指连接和读取的时间总和不能超过规定时间。如果永久等待可以设为None,默认为None

身份验证
# 当遇到网站开启了基本身份认证
import requests
from requests.auth import HTTPBasicAuth

r=requests.get('https://ssr3.scrape.center/',auth=HTTPBasicAuth('admin','admin'))
print(r.status_code)

requests中提供元组传入默认使用HTTPBasicAuth r=requests.get('https://ssr3.scrape.center/',auth=('admin','admin'))

代理设置

当请求网站几次能够正常获取内容,但是大规模且频繁爬取,可能会弹出验证码或者跳转到登录认证页面也可能会直接禁封IP。

import requests

proxies={
	'http':'http://10.10.10.10:8080',
	'https':'http://10.10.10.10:8080'
}
request.get('https://www.httpbin.org/get',proxies=proxies)

身份认证类似https://user:password@10.10.10.10:8080/ ,SOCKS协议代理需要导入 pip3 install 'requests[socks]'

https://socks5://user:password@host:port

Prepared Request

在使用requests请求时会在内部构造一个Request对象,并给这个对象赋各种参数,包括url、headers、data等。并把这个Request对象发送出去,请求成功后解析Response对象。

from requests import Request,Session

url='https://www.httpbin.org/post'
data={'name':'kang'}
headers={
  'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}
s=Session()
req=Request('POST',url,data=data,headers=headers)
prepped=s.prepare_request(req)
r=s.send(perpped)
print(r.text)
#Request对象可以更灵活的实现请求和各种操作
posted @ 2023-04-17 17:01  Kang_kin  阅读(42)  评论(0编辑  收藏  举报