02-Requests请求
request
requests是一个广泛使用的 HTTP 库,由 Kenneth Reitz 开发。它简化了 Python 与 HTTP 协议的交互,使得发送各种 HTTP 请求变得轻而易举,避免了使用 Python 标准库urllib时复杂的操作,极大地提升了开发效率
初步使用
以搜索引擎为示例进行爬取网页数据
import requestsrespones = requests.get('https://www.sogou.com/')print(response.status_code) # .status_code 查看响应状态码print(response.text) # 查看网页内容 User-Agent: 表示用户用什么设备发起请求, 设置后进行伪装让后端不在让认为你是一个自动化程序
# 搜狗网站首页进行搜索 或 百度首页进行搜索内容的链接url = f'https://www.sogou.com/web?query={val}'# 设置后进行伪装让后端不在让认为你是一个自动化程序, 处理一个小小的反爬headers = { "User-Agent": "" }resp = requests.get(url,headers=headers)print(resp.status_code)print(resp.text)print(resp.request.headers) # 查看请求头 未设置UA时:不是正常的设置请求数据请求类型
requests.get('http://httpbin.org/get') # GET请求requests.post('http://httpbin.org/post') # POST请求requests.put('http://httpbin.org/put')requests.delete('http://httpbin.org/delete')requests.head('http://httpbin.org/get')requests.options('http://httpbin.org/get')GET请求数据
查询GET参数
# 天气数据网址: https://www.weather.com.cn/url1 = 'https://cy.weather.com.cn/api/v1/promo_pos' # 对应地址headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36"}res = requests.get(url1, params={"ids": 3}, headers=headers)print(res.text) # 文本data = res.json() # 获取json数据 ===等同于 json.loads(res.text)print(data["msg"]) # 字典取值- json.loads() 解析json数据
- json.dumps() 将py数据转化成json格式
post请求携带数据
import json# 百度翻译url = 'https://fanyi.baidu.com/sug'haha = { "kw": "dog"}resp = requests.post(url, headers=headers, data=haha) # data参数:携带POST请求参数print(resp.status_code) # .status_code 查看响应状态码print(resp.text) # 获取文本字符串print(resp.json()) # 获取json数据格式print(json.loads(resp.text)) # 获取json数据格式 二进制数据
图片/pdf/视频为二进制数据, bytes 类型是一种不可变的数据类型,用于表示二进制数据
import requests# 请求图片地址r=requests.get('https://img0.baidu.com/it/u=2852563613,929482691&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1400')print(r.text) # 乱码 data = r.content # .content获取二进制数据 print(data)print(type(data)) # bytes 二进制数据格式# 将数据保存到本地with open('bbtp.gif','wb')as f: f.write(data)response属性
import requests# 简书 是http 不是httpsurl = 'http://www.jianshu.com'headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}r = requests.get(url)r = requests.get(url, headers=headers) print(r.status_code)print(r.headers) # 查看响应头信息print(r.url) # 查看urlprint(r.history) # 查看网页是否进行重定向 302重定向(http://www.jianshu.com)-
allow_redirects=True(默认):浏览器行为,自动跳转到新页面 -
allow_redirects=False:停止在重定向指令处,不自动跳转
r = requests.get(url, headers=headers,allow_redirects=False)
状态码
- 200 请求成功
- 301 302 请求发生跳转
- 404 页面没找到
- 500 502 503服务器内部错误
高级操作
写爬虫的时候,有一些网站你必须登录之后才能进行访问, 存在这种需求的时候你就必须要先登录才能访问,http/https 协议 是一种无状态的协议,对事物处理无记忆功能的,那么我们的浏览器是如何来记录这个登录的过程, 需要通过cookie来完成
cookie维持会话
通过cookie设置用户信息(账号+密码) 维持登录状态
对应网址可能会存在失效问题
-
https://www.17k.com/17k网址失效 -
https://www.qidian.com/使用起点小说网址
- 是存在cookie加密和账号无关: 可以用于此处讲解
import requests# 将cookie的身份信息放入了 headers = { # 'cookie':'', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36',}# 17k小说网站 需要设置登录之后设置cookie才能获取到对应的数据resp = requests.get("https://www.qidian.com/",headers = headers)# 未设置cookie 数据返回不会成功print(response.text)# 登录之后设置cookie 则可以成功获取数据# 再演示不设置cookie 能不能请求同域名下的数据, 请求也不会成功,需要进行设置直接使用Cookies请求时,需要手动管理Cookies。你要明确获取Cookies信息,并在每次请求时将其添加到请求中, 后续cookie发生变化时,也需要重新设置
注意:
- 能获取需要登陆之后才能采集数据, 但是会提高你被反爬的记录(cookie中存在你的信息,你经常请求会被记录,同意被封禁账户)
session会话连接
**Session:**在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。
根据上述对session的解释,session简单来说就是一个会话保持。就好比我们使用session去请求登录包之后,再去对其他页面发起请求的时候,自动就会携带着那些信息再去请求。如果说用爬虫requests请求每一次都是一个全新的请求,那么session请求就是包含上一次请求信息的请求(也就是等同于会保存 cookie 和记录的浏览
超时设置
url= 'https://www.baidu.com'r = requests.get(url,timeout =0.00000001) # 秒 timeout =(30,30) 请求 响应print(r.status_code)异常处理
try: # 处理异常,可能出现异常的代码都写在try方法里面 url= 'https://www.baidu.com' r = requests.get(url,timeout = 0.00000000001) # 秒 print(r.status_code)except: # 出现异常怎么处理 print('timeout!')finally: print("默认: 无论怎么样都会执行")代理设置
防止ip地址被封,无法爬取对应数据
内网ip - 1
公网ip - 2
- 隧道代理
- 代理服务器会自动为你轮换IP地址,每次请求或按时间间隔更换一个IP。你只需要配置一个代理地址,IP切换由服务端自动完成
- 无需手动切换IP,自动化程度高,适合大规模任务。因为IP不断变化,匿名性更强,不易被目标网站追踪和封禁
- 适用于: 大规模网页抓取、批量注册账号、刷流量、刷票等需要频繁更换IP的任务
- 私密代理
- 一个代理IP地址仅供你一个用户使用,不会与他人共享。重点在于 "独享使用权"
- 速度通常很快,连接稳定
- 独享代理
- 与私密代理相同,IP仅供你一人使用
- 海外代理
- 代理服务器位于中国以外的国家或地区
- 核心作用是伪装你的地理位置,让你能够以目标国家的网络身份访问互联网。
- 静态住宅海外代理
- 纯净独享: IP独属唯一客户,避免IP被滥用或污染,保障数据安全和独立性。
代理ip地址基本上都需要对于的账号密码,进行验证
import requests# 提取代理API接口,获取1个代理IPapi_url = "https://dps.kdlapi.com/api/getdps/?secret_id=o4zsfebj9j4nm0izhp7s&signature=ocoxalcpllkatvl57beyisep1vzj58p8&num=1&sep=1"# 获取API接口返回的代理IPproxy_ip = requests.get(api_url).text# 用户名密码认证(私密代理/独享代理)username = "d2089925381"password = "8ujkam0p"proxies = { "http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": proxy_ip}, "https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": proxy_ip}}# 要访问的目标网页target_url = "https://dev.kdlapi.com/testproxy"# 使用代理IP发送请求response = requests.get(target_url, proxies=proxies)# 获取页面内容if response.status_code == 200: print(response.text)查看我的 IP 地址 | 查询本机 IP 地址及归属地 | ip.skk.moe | Sukka (https://ip.skk.moe/)