爬虫需要知道的基础

2023-11-14

一、爬虫概述

1.爬虫必须知道的要素

爬虫要遵循网上的爬虫机器人协议,怎样查看——在网址后面加上/robots.txt来查看,可以查到哪些是允许的,哪些是不允许的

爬虫的基本步骤:找到网址,发起请求,解析页面并获得原始数据,对数据进行处理,保存处理后的数据

  • 网址分为http开头,https开头端口分别是80和443

2.爬虫的基本介绍

2.1网页布局的介绍

首先要知道按下F12之后网页的布局,一般来说就是从左到右是

元素也就是通常说的前端页面的代码,然后是控制台,再之后就是资源,再之后就是网络(一般检查元素就是在这里面,也就是下图的界面),下图中还有headers那里面也有特殊的几个要记得

  • 控制台可以输出东西,但是爬虫一般用到最多的就是network网络那个

  • request url——请求的网址,request method——请求的方法,分为get与post(一般get用于直接得到数据,post用于需要提交数据)

    • get方式请求通过params传递参数,传递参数的时候一种是在网址后面加上?然后以id=1的形式进行传递,多个参数用id来拼接,比如后面的钟离就是携带的参数——https://www.baidu.com/s?wd=钟离
    • post方式请求通过data提交表单
  • status code——状态码,一般熟悉的就是404请求错误,200是请求成功,500是服务器出错

    • 扩展:100到199是成功接收请求但仍需要填写剩余请求
    • 200到299请求成功,常用200
    • 400到499客户端错误,500到599服务端错误。
  • request headers——请求头,如果要提交参数或者需要i用到验证时就需要填写参数。

    • accept——表示接受的数据类型包括什么
    • cookie——记载用户和服务器之间的信息,多用于模拟登录,之后会有演示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zZXlHU8-1647862613858)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220124121030088.png)]

  • UA:user agent——用户标识,用来区分到底自己是不是爬虫的标识,一般需要伪装,以此来绕过robots协议
2.2编码格式的介绍

不同的网页编码的方式有很多种,所以要得到对应的就要用到解码,解码有三种方式

# 第一种直接修改响应数据的编码方式
response.encoding='utf-8'
# 第二种是先将数据转化为二进制,然后在进行解码
response.content.decode()
# 第三种设置默认编码为utf-8
response.encoding=response.apparent_encoding

下面是基本演示的代码,输入要搜索的关键字,通过百度网址进行搜索

import requests  # 导入请求包
keyword = input("请输入百度搜索的内容:")
# 找到请求的网址,可以把问好和keyword去掉,然后通过params={"wd":keyword}
url = "https://www.baidu.com/s?"+keyword
# 添加请求的表示,防止自己是爬虫程序,如果没有user agent则结果报错是下面的内容结果错误
'''
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ–°é—»</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>å
³äºŽç™¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前å¿
读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

'''
# 用户标识一定要写的
headers ={
    "user-agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0'
}
 # 用请求包来发起对url网址的请求
response = requests.get(url=url,headers=headers)
response.encoding=response.apparent_encoding
# 将获得的页面的元素打印出来
print(response.text)

3.爬虫的cookie与session会话维持

  • 访问网站有时需要输入账号和密码,一般的话第二次来说不再需要输入账号和密码,是因为你已经存入了cookie数据,但是一般来说会断,而session是维持这个链接的时间比较久的
  • cookie会作为一个参数传递,传递参数两个形式都是不同的
    • 第一种,在params中传递cookie参数,但是不加s
    • 第二种直接在requests.get中加入cookies,此时cookie有s
3.1得到登陆之后的cookie
import requests  # 导入请求包
# 将cookie转化为字典的包
from requests.utils import dict_from_cookiejar
# 获得需要访问的登陆的网址,当你的登录界面出来的时候,你就随便输一个账号和密码,然后再从network里面去找有关login的网址
url = "http://ptlogin.4399.com/ptlogin/login.do?v=1"
headers = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
}


data = {
    "username":"正确的账号",
    "password":"正确的密码"
}
response = requests.post(url=url,data=data,headers=headers)
response.encoding=response.apparent_encoding
print(dict_from_cookiejar(response.cookies))
3.2用cookie来进行登录
import requests  # 导入请求包
# 这是登陆之后的网址,访问时需要有cookie
url = "http://my.4399.com/forums/mtags"
headers = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
}

cookie = "Cookie: _gprp_c=""; _4399stats_vid=16249520161838411; _4399tongji_vid=162495325663923; Qnick=; zone_guide_limit=1; Hm_lvt_f1fb60d2559a83c8fa1ee6125a352bd7=1625536272,1625628031,1625824645; Puser=598340295; global_hs=4399.com%7C%7C%7C4399%u751F%u6B7B%"
cookie_dic = {}
# 将所有的等号形式转化为键值对的形式
for i in cookie.split(";"):
    cookie_dic[i.split("=")[0]]=i.split("=")[1]

# 这种传参数的时候就是在cookies上面加上s
response = requests.get(url=url,headers=headers,cookies=cookie_dic)
response.encoding=response.apparent_encoding
print(response.text)


3.3使用session来进行使用

session可以进行会话维持以至于下次再次访问需要登陆的网站时,就不用再提交表单了

import requests  # 导入请求包
# 这是需要输入账号和密码才能登陆的网址
login_url = "http://ptlogin.4399.com/ptlogin/login.do?v=1"
# 这是登陆之后的网址,访问时需要有cookie
forums_url = "http://my.4399.com/forums/mtags"
headers = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
}
data = {
    "username":"正确的账号",
    "password":"正确的密码"
}
# 实例化session对象
session = requests.session()
# 这种传参数的时候就是在cookies上面加上s
response1 = session.post(url=login_url,headers=headers,data=data)
response2 = session.get(url=forums_url,headers=headers)
response2.encoding=response2.apparent_encoding
print(response2.text)

4.页面跳转来源——防盗链

  • 需要在请求头里面多加入一个referer的跳转来源的网址,这是防盗的一种手段
headers = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0""referer":"跳转的网址""cookie":"在这添加需要的cookie,记住没有s"
}

5.代理

代理分为透明代理和普通代理以及匿名代理,一般的话建议使用高匿代理

推荐的代理网站——讯代理http://www.xdaili.cn/buyproxy,89代理https://www.89ip.cn/

代理的使用——防止同一个IP高频率的网站,每次访问时可以换IP

import requests  # 导入请求包
# 这是需要输入账号和密码才能登陆的网址
login_url = "http://ptlogin.4399.com/ptlogin/login.do?v=1"
headers = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
}
data = {
    "username":"",
    "password":""
}
# 使用代理的ip,这样可以防止爬取目标时被封禁
proxies={
    "http":"83.36.58.184:8080"
}
session = requests.session()
# 在get上面添加上proxies
response1 = session.post(url=login_url,headers=headers,data=data,proxies=proxies)

6.禁止重定向与超时处理

import requests  # 导入请求包
# 可以随便找一个发生重定向的网址
login_url = "https://www.google.com/"
headers = {
    "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
}
# 禁止重定向,加上超时处理(请求时间,响应时间)
try:
    response = requests.get(url=login_url,headers=headers,timeout=(3,7),allow_redirects=False)
    response.encoding=response.apparent_encoding
    print(response.url,response.request.url)
except requests.exceptions.ConnectionError as e:
    print(e)

7.retrying的使用

import requests  # 导入请求包
from retrying import retry

# 如果抛出异常则会重复进行访问
# @retry(stop_max_attempt_number=3) # 设置最大访问次数
# @retry(stop_max_delay=3000)  # 设置失败重试的最大访问时间,单位是毫秒
# @retry(wait_fixed=2000)  # 设置失败的间隔时间,单位是毫秒
@retry(wait_random_min=1000,wait_random_max=3000)  # 设置失败的随机间隔时间,单位是毫秒,最大是1秒最小是3秒
def emo():
    print("+===========+")
    raise
if __name__ == '__main__':
    emo()

用retrying来解决爬虫访问时的超时问题

import requests  # 导入请求包
from retrying import retry

login_url = "https://www.google.com/"
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
}
@retry(stop_max_attempt_number=3)
def spider_url():
    print("+====+")
    response = requests.get(url=login_url,headers=headers,timeout=(3,7),allow_redirects=False)
    response.encoding=response.apparent_encoding
    print(response.url)
spider_url()

二、记录一下今天其他的心得

1.如何清理anaconda中pkgs文件夹

在终端先输入conda clean -p——清除没有连接的依赖

在输入conda clean -t ——清除安装模块的压缩包

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫需要知道的基础 的相关文章

  • 为什么从 Pandas 1.0 中删除了日期时间?

    我在 pandas 中处理大量数据分析并每天使用 pandas datetime 最近我收到警告 FutureWarning pandas datetime 类已弃用 并将在未来版本中从 pandas 中删除 改为从 datetime 模块
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • Python ImportError:无法导入名称 __init__.py

    我收到此错误 ImportError cannot import name life table from cdc life tables C Users tony OneDrive Documents Retirement retirem
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重

随机推荐

  • C# socket异步通信服务器和客户端

    本文章向大家介绍C socket异步通信服务器和客户端 主要包括C socket异步通信服务器和客户端使用实例 应用技巧 基本知识点总结和需要注意事项 具有一定的参考价值 需要的朋友可以参考一下 服务器代码 只要客户端连接进来就会接收到Se
  • Qt之QTableView 保持滚动条自动滚动到底部

    在使用QTableView添加数据时 当数据量超出显示范围时会自动的打开滚动条 如果设置了在需要时打开滚动条属性 而默认的是滚动条一直是保持在最顶部 但是有些时候我们添加数据时是需要查看添加的最新结果的 所以一般都会把滚动条滚动到最新数据那
  • 【scrapy】scrapy爬取数据指南

    scrapy是爬虫界常用的基于Python爬虫框架 但是网上找了很多这类的文章 发现有多处错误 故为了让刚想尝试爬虫的蜘蛛们少走点坑 故把最新的方法奉上 在此之前 请先更新你的pip版本 并安装scrapy pymysql pip inst
  • kernelbase.dll崩溃的处理_kernelbase.dll故障教程

    kernelbase dll是存放在windows系统下的一个非常重要的dll文件 DLL英文全称Dynamic Link Library 中文意思是 动态链接库 DLL是一个作为共享函数库的可执行文件 它使进程可以调用不属于本身可执行代码
  • java 代理模式

    1 静态代理 1 1 代码实现 接口 interface Hello String sayHello String str 实现 class HelloImp implements Hello Override public String
  • 对象常用的方法

    思维导图 对象中常用的方法 Object prototype 1 hasOwnProperty 方法会返回一个布尔值 指示对象自身属性中是否具有指定的属性 也就是 是否有指定的键 检测是否为私有属性 即使属性的值是 null 或 undef
  • (五)redis常用命令之list

    概述 列表类型用来存储多个有序的字符串 列表中的每个字符串就是一个元素 一个列表最多可以存储2 32 1个元素 redis的列表结构操作起来非常灵活 应用场景非常广 lpush命令 从列表左边插入多个元素 格式 lpush key valu
  • 使用dockerfile发布go项目

    docker安装 下载docker yum install docker 设置docker随系统启动 chkconfig docker on 启动docker服务 service docker start 启动后查看docker状态 sys
  • pandas Cannot interpolate with all object-dtype columns

    pandas 不能使用所有的 object 类型的列进行插值 这意味着在使用 pandas 的插值函数 例如 interpolate 时 所有的列都必须是数值类型的 如果其中有一列是 object 类型的 则会抛出异常 要解决这个问题 你需
  • 单列模式--Singleton with Go

    package main import fmt sync Singleton 单例对象的类必须保证只有一个实例存在 全局有唯一接口访问 1 懒汉模式 指全局的单例实例在第一次被使用是构建 缺点 非线程安全 type singleton st
  • 软件测试必备的Linux知识(一)

    1 Linux 概述 1 1 测试人员为什么学习linux 对于软件测试人员来说 我们测试的任何产品都是基于操作系统 比如我们每天都在使用的QQ软件 它有windows ios Android Mac OS等版本 需要把QQ安装在各个平台上
  • 虚拟地址,虚拟地址空间, 交换分区

    1 虚拟内存是内存管理的一种方式 它在磁盘上划分出一块空间由操作系统管理 当物理内存耗尽是充当物理内存来使用 它将多个物理内存碎片和部分磁盘空间重定义为连续的地址空间 以此让程序认为自己拥有连续可用的内存 当物理内存不足时 操作系统会将处于
  • 从零开始的ESP8266探索(11)-定时任务调度器Ticker使用演示

    文章目录 目的 使用演示 基本使用1 基本使用2 动态设置和参数传递 停止和重启任务 注意事项 总结 目的 Arduino for esp8266属于无操作系统环境 对于开发多任务的复杂应用还是比较麻烦的 所以这里就提供了一个近似于操作系统
  • bugku No one knows regex better than me

    进入环境是一串php代码 代码审计 考的是正则
  • 感知器的数学表达和训练算法

    目录 一 感知器模型 二 两种训练法则 1 感知器训练法则 2 delta法则 三 小结 1 标准梯度下降算法与随机梯度下降算法的差异 2 有阈值的感知机算法和无阈值的感知机算法的差异 在人工神经网络简介一节中 图二中的ANN系统的每一个单
  • Numpy常用的数据结构

    numpy安装 pip install numpy numpy底层是使用C语言来实现运算的效果非常高 数据清洗的意义 现实生活中 数据并非完美 需要进行清洗才能进行后面的数据分析 数据清洗是整个数据分析项目最消耗时间的一步 数据的质量最终决
  • Java回调函数的理解

    2008 07 21 20 34 所谓回调 就是客户程序C调用服务程序S中的某个函数A 然后S又在某个时候反过来调用C中的某个函数B 对于C来说 这个B便叫做回调函数 例如Win32下的窗口过程函数就是一个典型的回调函数 一般说来 C不会自
  • DC/DC:闭环控制的升压(Boost)变换电路原理设计及实验仿真

    与降压 Buck 变换器类似 升压Boost变换电路也可以构建电压闭环反馈控制的闭环Boost变换器 Boost功率电路图如图所示 具体电路元器件参数计算可参考前期文章 直流电路中升压电路 Boost 的设计原理 参数计算及MATLAB仿真
  • Python实现FA萤火虫优化算法优化支持向量机分类模型(SVC算法)项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 视频讲解 如需数据 代码 文档 视频讲解可以直接到文章最后获取 1 项目背景 萤火虫算法 Fire fly algorithm FA 由剑桥大学Yang于2009年提出 作为最新的群智能
  • 爬虫需要知道的基础

    一 爬虫概述 1 爬虫必须知道的要素 爬虫要遵循网上的爬虫机器人协议 怎样查看 在网址后面加上 robots txt来查看 可以查到哪些是允许的 哪些是不允许的 爬虫的基本步骤 找到网址 发起请求 解析页面并获得原始数据 对数据进行处理 保