Requests
1、提交请求 get
params 参数是用于添加 URL 查询参数的,通常用于 GET 请求。将参数作为字典传递给 params 参数,requests 会自动将其编码为 URL 查询参数并添加到 URL 中
import requests
url = "https://www.baidu.com/s"
params = {
"ie": "utf-8",
"wd": "python"
}
results = requests.get(url=url, params=params)
print(results.url)
# print返回的是:https://www.baidu.com/s?ie=utf-8&wd=python
2、提交请求 post
data 参数则是用于 POST 请求中传递表单数据的,通常用于向服务器提交数据。将参数作为字典传递给 data 参数,requests 会自动将其编码为表单数据并添加到请求体中
import requests
url = "https://www.xxxxxxx.com/s"
data = {
"kw":"nihao"
}
results = requests.post(url=url, data=data)
此外还有提交json
json = {
"kw":"nihao"
}
results = requests.post(url=url, json=json)
# 如果返回的数据是json,可以results.json() 或者 json.loads(results.text)取出返回数据字符串
3、请求头 header
提交请求头信息
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
"Cookie" : "xxxxxxxxxxxxxxxxx"
}
results = requests.get(url=url, params=params, headers=headers)
4、cookie 与 session
Cookie 存储在客户端,可以被禁用或删除,而 Session 存储在服务器端,对客户端不可见并且通常具有更长的生命周期
cookie
由于HTTP是一个无状态的协议,这个无状态就会导致浏览器第二次请求服务的时候,服务器不清楚它第一次请求时的身份,为了能让服务器区分发起请求的是谁,在第一次请求成功后,服务器会给浏览器生成一个值(存储在用户的本地计算机上),这个值就叫cookie,浏览器每一次请求,都会在请求头中携带这个值让服务器判断,有 则为“老用户”,没有 则为“新用户”
session
Session 是在服务器端存储数据的机制。当用户第一次访问应用程序时,服务器会为该用户创建一个唯一的会话标识符,并将该标识符存储在 Cookie 中,然后将其发送回客户端。客户端在随后的请求中将该 Cookie 作为请求头发送回服务器。服务器使用该会话标识符来检索与该用户相关联的存储在服务器上的数据。
使用cookie进行提交
① 手动复制提交
# 也可以把这个字符串放到 header中
cookie_str = """BAIDUID=61C28DE43621507EB2DA6F5384F9F287:FG=1; BIDUPSID=61C28DE43621507EB2DA6F5384F9F287; PSTM=1688463709; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BAIDUID_BFESS=61C28DE43621507EB2DA6F5384F9F287:FG=1; delPer=0; BD_CK_SAM=1; BA_HECTOR=a02h0gala005848l85012h2a1iad9f01o; B64_BOT=1; ZFY=uX:AM9gj4nQFQPpFhPO5VR8mYOswFyPOew5OXYGQM95Y:C; kleck=86e1fb0e27cf173bcf67fd298ddf687d; COOKIE_SESSION=107_0_1_8_0_3_1_0_1_3_1_0_0_0_0_0_0_0_1688643161%7C8%230_0_1688643161%7C1; PSINO=7; ispeed_lsm=30; RT="z=1&dm=baidu.com&si=8ff89b3f-722a-4383-8ec3-e4295eb2e287&ss=ljrx11yl&sl=3&tt=3e9&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=hd6&ul=kw9&hd=l14"; BD_HOME=1; H_PS_PSSID=36561_39027_39023_38942_38879_38907_38955_38980_38831_38920_38972_38803_38637_26350_39041_38683"""
cookies = {items[:items.find("=")]:items[items.find("=")+1:] for items in cookie_str.split("; ")}
# print(cookies)
# {'BAIDUID': '61C28DE43621507EB2DA6F5384F9F287:FG=1', 'BIDUPSID': '61C28DE43621507EB2DA6F5384F9F287', 'PSTM': '1688463709', 'BD_UPN': '12314753', 'BDORZ': 'B490B5EBF6F3CD402E515D22BCDA1598', 'BAIDUID_BFESS': '61C28DE43621507EB2DA6F5384F9F287:FG=1', 'delPer': '0', 'BD_CK_SAM': '1', 'BA_HECTOR': 'a02h0gala005848l85012h2a1iad9f01o', 'B64_BOT': '1', 'ZFY': 'uX:AM9gj4nQFQPpFhPO5VR8mYOswFyPOew5OXYGQM95Y:C', 'kleck': '86e1fb0e27cf173bcf67fd298ddf687d', 'COOKIE_SESSION': '107_0_1_8_0_3_1_0_1_3_1_0_0_0_0_0_0_0_1688643161%7C8%230_0_1688643161%7C1', 'PSINO': '7', 'ispeed_lsm': '30', 'RT': '"z=1&dm=baidu.com&si=8ff89b3f-722a-4383-8ec3-e4295eb2e287&ss=ljrx11yl&sl=3&tt=3e9&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=hd6&ul=kw9&hd=l14"', 'BD_HOME': '1', 'H_PS_PSSID': '36561_39027_39023_38942_38879_38907_38955_38980_38831_38920_38972_38803_38637_26350_39041_38683'}
results = requests.get(url=url, params=params, headers=headers, cookies=cookies)
② 从响应头中获取
方便下次访问时直接传递
import requests
url = "https://www.baidu.com/"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
}
results = requests.get(url=url,headers=headers)
cookies = results.cookies.get_dict()
print(cookies)
# {'BAIDUID': '5B500E77018549AA52A59C76708980AD:FG=1', 'BIDUPSID': '5B500E77018549AACB9865169D4680C6', 'PSTM': '1688714495', 'H_PS_PSSID': '36557_39027_38942_38881_38958_38956_39009_38918_38972_38817_39031_38986_38636_26350', 'BAIDUID_BFESS': '5B500E77018549AACB9865169D4680C6:FG=1', 'BDSVRTM': '0', 'BD_HOME': '1'}
③ request中的Session()方法
在Python中使用requests库发送HTTP请求时,可以使用Session对象来维护会话状态。Session对象允许您在多个请求之间共享参数,例如cookies和身份验证信息。它还允许您在请求之间保持持久连接,从而提高性能。
也就是说:在下次请求时会自动携带上cookie,不用自己填写;实现长连接
import requests
url = "https://www.baidu.com/"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
}
s = requests.Session()
print("第一请求baidu")
result = s.get(url=url, headers=headers)
print(result.request.headers)
print("第二次请求百度")
result2 = s.get(url=url)
print(result2.request.headers)
此处可以看到,第二次请求自动携带了第一次请求是返回的cookie
5、重定向 3xx
例如:访问 www.360buy.com 会自动跳转到 https://www.jd.com/
# 添加 allow_redirects=False 禁止自动跳转
results = requests.get(url=url,headers=headers, allow_redirects=False)
6、其他参数
参数 | 作用 |
---|---|
verify=False | 遇到证书ssl错误的网站导致不能爬取,添加verify=False参数解决 results = requests.get(url=url,verify=False) |
timeout=1 | 设置请求超时时间,超过1秒则报错,用例:ip代理池,如果该ip请求超过某时间值,则可以把该ip从池中移除,保证代理池的效率 results = requests.get(url=url,timeout=1) |
proxies=proxies | 代理,proxies = { ‘http’: ‘http://ip:port’, ‘https’: ‘http://ip:port’} |