目录
- 🌟前言
- 🍉request入门
- 1. params
- 2. data
- 3. json
- 4. headers
- 5. cookies
- 6. auth
- 7. files
- 8. timeout
- 9. proxies
- 10. allow_redirects
- 11. stream
- 12. verify
- 13. cert
- 🌟总结
🌟前言
在Python中,发送网络请求是一项常见的任务,特别是对于爬虫开发、API调用或任何需要与远程服务器交互的应用。requests库是最受欢迎的用于发送HTTP请求的第三方库,它提供了简洁易用的API来执行GET、POST、PUT、DELETE等多种HTTP方法。
🍉request入门
-
requests.request(method,url,** kwargs)
**kwargs:控制访问的参数,均为可选项
method:请求方式
参数 | 说明 | |
---|---|---|
1 | params | 跟在url连接后面,查询(搜索)的含义,字典或者字流格式 |
2 | data | 终点作为向服务器提供或提交资源时使用,字典、字节序列或文件对象,作为Request的内容 |
3 | json | JSON格式的数据,作为Request的内容 |
4 | headers | 字典、HTTP定制头 |
5 | cookies | 字典或CookieJar,Request中的cookie |
6 | auth | 元组,支持HTTP认证功能 |
7 | files | 字典类型,传输文件 |
8 | timeout | 设定超时时间,秒为单位 |
9 | poroxies | 字典类型,设定访问代理服务器,可以增加登录认证 |
10 | allow_redirects | True/False,默认为True,重定向开关 |
11 | stream | True/False,默认为True,获取内容立即下载开关 |
12 | verify | True/False,默认为True,认证SSL证书开关 |
13 | cert | 本地SSL证书路径 |
1. params
import requests
url = "https://example.com/search"
params = {"query": "Python爬虫","page": 1
}
response = requests.get(url, params=params) # 最终得到url = https://example.com/search?query=Python爬虫&page=1
2. data
import requests
url = "https://example.com/login"
# 相当于填写表单数据,如登录表单,post请求
data = {"username": "your_username","password": "your_password"
}
response = requests.post(url, data=data)
3. json
json
参数的作用是简化向API发送JSON数据的过程,确保了数据的正确序列化和HTTP头部的恰当设置,非常适合与那些期望接收JSON输入的现代Web服务交互。
import requests
import json
url = "https://api.example.com/data"
data = {"key": "value","another_key": "another_value"
}
response = requests.post(url, json=data)
# 注意:requests库内部会自动将data转换为JSON字符串,
# 并设置Content-Type为application/json
# data是一个Python字典,通过json=data传递给requests.post方法后,requests会将其转换为JSON字符串{"key": "value", "another_key": "another_value"}并设置请求头,以表明发送的是JSON格式的数据。
4. headers
实际上是http头的相关域,它对应了向某一个url访问时所发起的http头字段,利用这个字段定制某个访问url的http的协议头
User-Agent
: 指定客户端的信息,很多网站会根据这个字段判断访问者是浏览器还是爬虫,有时需要将其设置为常见的浏览器字符串来避免被识别为爬虫。Accept-Language
: 指定客户端接受的语言种类,可以帮助获取特定语言的网页内容。Content-Type
: 当发送POST请求且包含请求体时,这个字段指定了数据的格式,如application/x-www-form-urlencoded
、application/json
等。Authorization
: 如果网站需要认证,可以通过这个字段提供Token或其他认证信息。
import requests
url = "https://example.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3","Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
}
response = requests.get(url, headers=headers) # 模仿浏览器,请求数据
5. cookies
从http中解析cookies,它可以是字典,也可以是cookieJar形式;
解释:通过cookies
参数携带相应的cookie信息,可以使爬虫模拟已登录用户的行为,访问那些需要登录后才能查看的内容。这在爬取需要身份验证的网站数据时尤为重要。
作用:cookies
参数在Python爬虫中的作用是模拟浏览器的cookie机制,帮助爬虫程序绕过登录限制,访问受保护的内容,或是维持与服务器的会话状态,提高数据抓取的准确性和效率。
import requests
url = "https://example.com/userinfo"
cookies = {"sessionid": "abcdef123456","user": "example_user"
}
response = requests.get(url, cookies=cookies)
6. auth
字段是一个元组类型,它是支持http认证功能的,auth
参数可以是一个元组,通常包含用户名和密码,或者是一个AuthBase
的子类实例,用于自定义认证方案。
# 基本HTTP认证
from requests.auth import HTTPBasicAuth
url = "https://api.example.com/private"
username = "your_username"
password = "your_password"
response = requests.get(url, auth=HTTPBasicAuth(username, password))# API密钥认证
class APITokenAuth(requests.auth.AuthBase):def __init__(self, token):self.token = tokendef __call__(self, r):r.headers['Authorization'] = f'Token {self.token}'return r
url = "https://api.example.com/data"
token = "your_api_token"
response = requests.get(url, auth=APITokenAuth(token))# OAuth认证
对于支持OAuth的API,虽然直接通过auth参数处理可能较为复杂(通常需要先通过一系列步骤获取访问令牌),但也可以根据具体流程封装认证逻辑到自定义的AuthBase子类中。
通过合理使用auth参数,Python爬虫能够安全有效地访问那些需要认证的资源,确保了数据请求的合法性与安全性。
7. files
如何使用files
参数上传一个图片文件
import requests
url = "https://example.com/upload"
file_path = "/path/to/your/image.jpg"
with open(file_path, 'rb') as file:files = {'image': (file_path, file, 'image/jpeg')} # 文件名,文件对象,MIME类型response = requests.post(url, files=files)
print(response.text)
在这个例子中,我们首先打开要上传的图片文件,并以二进制模式读取('rb'
)。然后,我们将文件信息构造成一个字典,其中键 'image'
是服务器端预期接收文件的字段名,值是一个元组,包含文件名(这里也可以是任意字符串,服务器端可能会用作文件名)、文件对象和文件的MIME类型。最后,通过requests.post()
方法发送POST请求,并将这个字典作为files
参数传入。
files
参数的使用让Python爬虫能够执行涉及文件上传的任务,如图片上传、文件分享网站的数据抓取等场景。
8. timeout
用于设置网络请求的超时时间,如果一个请求超过指定的秒数还没有得到响应,requests
库将会抛出一个异常,而不是无限期地等待下去
import requests
url = "https://example.com"
timeout = 5 # 设置超时时间为5秒
try:response = requests.get(url, timeout=timeout)# 处理响应数据except requests.exceptions.Timeout:# 超时处理逻辑print("请求超时")# 请求https://example.com在5秒内没有得到服务器的响应,程序将不会一直等待,而是立即执行except块中的代码,打印出“请求超时”的信息
9. proxies
解释:proxies
参数用于配置HTTP或HTTPS代理服务器。代理服务器作为中间人,可以接收你的爬虫程序发出的网络请求,然后转发给目标服务器,并将响应结果再返回给你的爬虫。
目的:
- 匿名性:隐藏真实IP地址,防止被目标网站识别和封锁,尤其是在进行大量请求时,减少被封禁的风险。
- 地域限制绕过:通过选择不同地区的代理服务器,可以访问地理位置受限的内容或服务,比如某些网站仅对特定国家或地区开放。
- 性能优化:如果目标服务器对你的物理位置响应较慢,使用地理位置更近的代理服务器可以加快访问速度。
- 负载均衡和带宽管理:企业级应用中,可能会利用代理服务器来分配请求,优化网络资源使用。
import requests
proxies = {"http": "http://代理服务器地址:端口","https": "https://代理服务器地址:端口",
}
response = requests.get("http://example.com", proxies=proxies)
代码解释:proxies
参数是一个字典,其中键为协议名(“http” 或 “https”),值为代理服务器的URL(包括协议、地址和端口)。这样,所有通过requests
发起的请求都会通过指定的代理服务器进行。
注意:使用代理时应遵守目标网站的使用条款和服务协议,合法合规地进行数据抓取,尊重网站的Robots协议,并尽量减少对目标服务器的负担。同时,选择稳定可靠的代理服务对于爬虫的成功运行至关重要。
10. allow_redirects
requests
库会自动处理重定向,即自动向新的URL发送请求。当设置为False
时,则不自动处理重定向,而是直接返回原始的重定向响应。
import requests
# 允许重定向
response = requests.get('http://example.com/redirect', allow_redirects=True)
print(response.url) # 最终重定向后的URL
# 禁止重定向
response = requests.get('http://example.com/redirect', allow_redirects=False)
print(response.status_code) # 可能会得到一个重定向的状态码,如301或302
print(response.headers['location']) # 获取重定向的目标URL,而不是自动访问
11. stream
解释:在使用Python的requests
库进行网络请求时,stream
参数是一个非常实用的选项,它的主要作用是控制是否立即下载响应内容。当设置stream=True
时,requests
不会立即下载整个响应体,而是等到你需要时才按需读取,这对于大文件下载或者仅需处理部分响应内容的场景非常有用
stream
参数的作用:
- 节省内存:对于大型文件的下载,如果直接下载整个响应体到内存中,可能会消耗大量内存资源。使用
stream=True
可以让数据边下载边处理,减少内存占用。 - 按需读取:当你只想读取响应的一部分内容,而不是全部时,使用流式处理可以更加高效。例如,你可能只需要检查响应的前几行来决定是否继续下载剩余内容。
- 长时间运行的连接:在某些情况下,保持连接打开并逐步处理响应内容是有益的,比如实时数据流处理。
import requests
url = "http://example.com/large_file.zip"
response = requests.get(url, stream=True)
# 检查请求是否成功
if response.status_code == 200:# 打开一个本地文件用于保存下载的内容with open('large_file.zip', 'wb') as f:for chunk in response.iter_content(chunk_size=1024): # 如果chunk不是空的,才写入文件if chunk: f.write(chunk)
12. verify
verify=True
,这意味着requests
会验证服务器的SSL证书,确保与之建立的HTTPS连接是安全的,可以防止中间人攻击。- 有时候你可能需要关闭这个验证,比如在测试环境中,或者当遇到自签名证书(self-signed certificate)或证书链不完整的情况,这时可以将
verify
设置为False
。不过,这样做会降低安全性,应该谨慎考虑,并仅在确信不会导致安全问题的情况下使用。
import requests
url = "https://example.com"
response = requests.get(url, verify=False)
13. cert
cert
参数可以接收一个表示客户端证书文件路径的字符串,或者一个包含证书文件路径和私钥文件路径的元组。cert
参数用于指定HTTPS请求时的客户端证书。当目标网站或API需要客户端提供安全证书进行身份验证时,就需要用到这个参数。这对于访问那些启用了客户端证书认证的HTTPS服务尤为重要,比如一些内部系统、银行接口或是高度安全的API。
import requests
url = "https://example.com/api/secure-endpoint"
cert = "/path/to/client.pem" # 单个文件包含证书和私钥
# 或者,如果证书和私钥分开:
# cert = ("/path/to/cert.pem", "/path/to/key.pem")
response = requests.get(url, cert=cert)
🌟总结
requests
库的强大之处在于其简单直观的接口设计,使得开发者能够快速上手并完成复杂的网络请求任务,而无需关注底层细节。