requests的使用

准备工作

安装request库

pip install request

实例引入

get方法实现GET请求,返回一个Response对象,存放在变量r中,分别输出响应的类型、状态码、响应体的类型、内容以及cookie

import requests

r = requests.get('http://www.baidu.com')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text[:100])
print(r.cookies)

 也可以实现POST、PUT、DELETE等请求

import requests

r1 = requests.get('https://www.httpbin.org/get')
r2 = requests.post('https://www.httpbin.org/post')
r3 = requests.put('https://www.httpbin.org/get/put')
r4 = requests.delete('https://www.httpbin.org/get/delete')
r5 = requests.patch('https://www.httpbin.org/get/patch')

GET请求

  • 基本实例使用requests库构建一个GET请求
import requests

r = requests.get('https://www.httpbin.org/get')
print(r.text)

 使用params参数给URL添加参数

import requests

data = {
    'name': 'admin',
    'age': 25
}

r = requests.get('https://www.httpbin.org/get', params=data)
print(r.text)

 把URL参数以字典的形式传给get方法的params参数,请求的链接被自动构造成含参链接,网页的返回类型为str类型,但是是JSON格式的,若想直接解析返回结果,得到一个JSON格式的数据,可调用json方法将返回结果转换为字典。d

import requests

r = requests.get('https://www.httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))

  •  抓取网页

使用正则表达式提取网页标题

import requests
import re

r = requests.get('https://ssr1.scrape.center/')
pattern = re.compile('<h2.*?>(.*?)</h2>', re.S)
titles = re.findall(pattern, r.text)
print(titles)

  •  抓取二级制数据

上面例子为使用某些规则抓取网页的部分内容,若想抓取图片、音频、视频等文件时,这些文件本质上是由二进制编码组成,要抓取这些文件需要拿到他们的二进制数据。

import requests

r = requests.get('https://scrape.center/favicon.ico')
print(type(r.text))
print(r.text)
print(type(r.content))
print(r.content)

 r.content前面的b代表这是bytes类型的数据,r.tex在打印时会转换为str类型,也就是图片直接转换为字符串,所以会乱码。

将提取的二进制数据保存

import requests

r = requests.get('https://scrape.center/favicon.ico')
# 以二进制写的方式打开文件
with open('favicon.ico', 'wb') as f:
    f.write(r.content)

 POST请求

import requests

data = {
    'name': 'admin',
    'age': 25
}

r = requests.post('https://httpbin.org/post', data=data)
print(r.text)

 响应

除了使用text和content获取响应内容外。还有许多属性和方法来获取信息,例如状态码、响应头、Cookie等

import requests

r = requests.get('https://ssr1.scrape.center/')
print(type(r.status_code), r.status_code)
print(type(r.headers), r.headers)
print(type(r.cookies), r.cookies)
print(type(r.url), r.url)
print(type(r.history), r.history)

 requests库提功了内置的状态码查询对象requests.codes

import requests

r = requests.get('https://ssr1.scrape.center/')
exit() if not r.status_code == requests.codes.ok else print('请求成功')

 常用返回码和相应的查询条件P53

当使用 requests 发送一个请求时,你可以通过 response.status_code 来获取状态码,并使用 response.text 或 response.json()(如果返回的是 JSON)来获取响应的内容。

 高级用法

  • 文件上传
import requests

files = {'file': open('favicon.ico', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text)

  •  Cookie设置

ookies写法复杂,可使用requests获取和设置Cookie

import requests

r = requests.get('http://www.baidu.com')
# 调用cookies属性,成功得到Cookie,属于RequestCookieJar类型
print(r.cookies)
# 调用items方法将Cookie转换为由元组组成的列表,遍历输出Cookie中的每一个条目的名称和值,实现遍历解析
for key, values in r.cookies.items():
    print(key + '=' + values)

 可以用cookie来维持登录状态。以github为例,登录自己的账号:

import requests

headers = {
    'Cookie': '_octo=GH1.1.229921746.1716358908; preferred_color_mode=light; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=2811006977'
}

r = requests.get('https://github.com/', headers=headers)
print(r.text)

 也可以通过cookies参数来设置Cookie信息。构造一个RequestsCookieJar对象,将刚才的Cookie进行处理及赋值。

import requests

cookies = '_octo=GH1.1.229921746.1716358908; preferred_color_mode=light; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=2811006977'

jar = requests.cookies.RequestsCookieJar()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}
for cookie in cookies.split(';'):
    key, value = cookie.split('=', 1)
    jar.set(key, value)
r = requests.get('https://github.com/', cookies=jar, headers=headers)
print(r.text)

  •  Session维持

利用Session可以做到模拟同一个会话而不用担心Cookie的问题,通常在模拟登陆成功之后进行下一步操作时用到。

案例:如果沿用之前写法并不会输出cookie

import requests

requests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.org/cookies')
print(r.text)

 改用session继续尝试

import requests

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

  •  SSL证书验证

很多网站要求使HTTPS协议,但是有的网站可能没有设置好HTTPS证书,或者证书没有被CA机构认可,所以网站可能出现SSL证书错误的提示。

 可以在浏览器汇总通过一些设置来说忽略证书的验证

import requests

response = requests.get('https://ssr2.scrape.center/', verify=False)
print(response.status_code)

 此处的警告可以通过设置忽略警告的方式以来屏蔽:

import urllib3
urllib3.disable_warnings()

或者通过捕获警告到日志的方式忽略警告

import logging
logging.captureWarnings(True)
  • ·超时设置
import requests

r = requests.get('http://www.httpbin.org/get', timeout=1)
print(r.status_code)

请求分为两个部分:连接(connect)和读取(read)

timeout是连接和读取的总和,若想分别制定作用,可以传入一个元组

r = requests.get('http://www.httpbin.org/get', timeout=(2, 30))
  • 身份认证

urllib库进行身份验证较为繁琐,可以直接使用requests库

import requests
from requests.auth import HTTPBasicAuth

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

 如果参数都传一个HTTPBasicAuth类很繁琐,可以直接传一个元组,会默认使用HTTPBasicAuth这个类来验证

import requests

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

requests库还提供了其他认证方式,如OAuth认证

pip install requests_oauthlib
import requests
from requests_oauthlib import OAuth1

url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
auth = OAuth1('YOUR_API_KEY', 'YOUR_API_SECRET', 'YOUR_ACCESS_TOKEN', 'YOUR_ACCESS_TOKEN_SECRET')
requests.get(url, auth=auth)
  •  代理设置

 大规模爬取,频繁请求可能会导致封禁ip,可以使用proxies设置代理来解决(代理替换为有效代理)

import requests

proxies = {
    'http': 'http://117.42.94.192:20720',
    'https': 'http://117.42.94.192:20720',
}
requests.get('https://www.httpbin.org/get', proxies=proxies)

若代理需要身份认证,可使用类似http://user://password@host:post这样的语句来设置代理

import requests

proxies = {'https://user://password@127.0.0.1:8080/', }
requests.get('https://www.httpbin.org/get', proxies=proxies)

除基本的HTTP代理,requests库还支持SOCKS协议的代理

pip install “request[socks]”
import requests

proxies = {
    'http': 'socks5://127.0.0.1:1080',
    'https': 'socks5://127.0.0.1:1080'
}
response = requests.get('http://www.baidu.com', proxies=proxies)
  • Prepared Request

使用requests库的get和post请求的时,在内部构造一个Request对象发送出去,请求成功后会再得到一个Response对象,解析这个对象即可。Request对象实际上就是Prepared Request

不用get方法,直接构造Prepared Request:引入Request类,用url、data和headers参数构造一个Request对象,再调用Session类的prepare_request方法将其转换为一个Prepared Request对象,在调用一个send发送

from requests import Session,Request

url = 'http://www.httpbin.org/post'
data = {'name': 'data'}
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15'
}
session = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = session.prepare_request(req)
r = session.send(prepped)
print(r.text)

 

 

 

 

posted @ 2024-05-24 01:42  JJJhr  阅读(8)  评论(0编辑  收藏  举报