*以下内容不适用于对js代码做了混淆加密、使用机器人验证码等技术手段的反爬虫网站。
- 工作流程
- 请求网页/API接口
- 解析网页/数据
- 数据清洗
- 数据存储
- 发送请求
使用requests库
- GET请求
用于请求获取指定资源的信息。
请求参数附在URL后,可见于URL中。
对服务器的数据不会产生修改。
- POST请求
用于向指定资源提交要被处理的数据。
请求参数通常在请求体中,不可见于URL。
对服务器的数据可能产生修改
- PATCH请求
类似于PUT,但用于对资源的部分内容进行更新。
请求体中包含要更新的资源的部分数据。
- DELETE请求
请求服务器删除指定的资源。
通常没有请求体,删除操作由URL指定。
- PUT请求
用于请求服务器存储一个资源,并用请求的数据替代指定资源的内容。
请求体中包含要更新的资源数据。
什么时候用什么请求,可以在开发者工具F12 Network选项卡,想要发送的请求找到:
需要用到那个哪种方式的请求,就用requests.请求方式,比如requests.get(), requests.post()等等。
- 请求具有授权的网页/API接口
- 了解鉴权与授权
请求需要分为直接请求网页或者是直接对一个网站的后端API发送请求。
- 鉴权
鉴权(Authentication):确认用户的身份,验证用户是否是他们声称的身份。通常通过用户名和密码的组合,或者其他身份验证方式来实现。
- 授权
授权(Authorization):确定用户是否有权限访问某些资源或执行某些操作。在你的例子中,用户需要是VIP才能观看特定的视频,这是一种授权机制。
举例:
- 用户登录:这是鉴权的过程,涉及用户名和密码的验证。
- VIP用户观看特定视频:这是授权的过程,系统需要验证用户是否是VIP,以决定是否授予观看特定视频的权限。这个过程可能涉及通过网站中间件的验证来确认用户的VIP状态。
- 授权的种类
在请求网页内容或对后端API发送请求时最主要的就是授权。授权方式有许多种,最常见的有以下几类:
- 基于会话的身份验证(Session-Based Authentication):在用户登录后,服务器创建一个session会话并为用户分配Session ID,服务器将其发送给客户端存储于Cookie上并以Cookie形式发送。
- JWT Token(JSON Web Token):令牌包含了一些声明,例如用户身份信息和权限,使用签名进行验证,JWT 使用签名来确保数据的完整性,所以不要试图去篡改权限信息,这是幼稚的,没有特定加密格式和特定的发送方式。
- Bearer Token:没有特定加密格式,通过设置请求header“Authorization”头发送。
- Basic验证:用户名和密码的base64编码,相当于明文,通过设置请求header“Authorization”头发送。
- 自定义Token验证:没有特定加密格式和特定的发送方式。
还有Oauth、OpenID Connect、SAML、mTLS等等,这些授权方式,不再展开。
- 授权的发送载体或存储介质
按发送载体分类:
- 可基于 Cookie 的身份验证:
- 基于会话的身份验证(Session-Based Authentication)(必须Cookie传输)
- JWT Token (JSON Web Token)
- 自定义Token身份验证
- 可基于Header的身份验证(Authorization 头):
- JWT Token (JSON Web Token)
- Bearer 令牌(必须使用Authorization 头)::
示例: Authorization: Bearer <token>。
- Basic基本身份验证(必须使用Authorization 头):
示例: Authorization: Basic <base64编码>。
- 可基于请求体(Body 里FormData、application/json, URL Param传参等)的身份验证:
使用请求体发送的Token一般都会存储在浏览器的localStorage中。
- 自定义Token身份验证
- JWT 令牌 (JSON Web Token)
按存储载体分类:
- 可存储于Cookie中的:
- 基于会话的身份验证(Session-Based Authentication)(必须存储于Cookie)
- JWT Token (JSON Web Token)
- 自定义Token身份验证
- localStorage
- JWT Token (JSON Web Token)
- 自定义Token身份验证
- 不做存储的
- Basic验证
- 查看授权的发送方式
- Cookie
JSESSION ID、Token等字样在请求的Cookie中出现:
- Header: Authoriztion
Basic验证、Bearer都是在Header里设置Authoriztion头。
有时JWT Token、自定义Token会以Bearer的形式发送,在请求的Request Headers里出现了Authoriztion头,基本就是通过此方式发送授权Token的
- 基于请求体(Body 里FormData、application/json, URL Param传参等)的身份验证通过Cookie传输,特征是https://xxxx.com/api?token=xxxx
一般会在URL内带上token字眼参数,这也是需要注意的。
- 安装selenium与Chrome Driver
使用selenium库之前需要做一些准备工作:
- 下载Google Chrome浏览器的特定版本的离线安装包并安装需要特定版本的原因是,默认官方链接下载的Google Chrome版本为最新版本,可能没有与其版本对应的Chrome Driver
如果没有Google Chrome,需要安装它,如果您已安装它,请跳转到下一步。
- 查看Google Chrome版本号
版本号前三位大于等于120的,请使用此链接,查看此处图片。
https://googlechromelabs.github.io/chrome-for-testing/#stable
选择与自己版本号最后一个小数点前相同的版本的Chrome Driver
- 手动提取
- 自动化提取
版本号前三位小于等于114的,请使用此链接,查看此处图片。:
https://registry.npmmirror.com/binary.html?path=chromedriver/
选择与自己版本号最后一个小数点前相同的版本的Chrome Driver
- 解压Chrome Driver到您知晓的位置,并确保此路径没有权限问题,
比如C盘的根目录或是其他人的用户目录、C:\Program Files、C:\Windows 都可能存在权限问题,请将它放到没有权限问题的目录。
- 为Chrome Driver添加环境变量
首先复制您刚刚解压到的路径
搜索env,选择编辑系统环境变量。
- 添加用户和系统环境变量
- 提取授权
在了解了常见的授权方式、类型、发送载体后,就可以提取这些内容。
- 存储在Cookie中的授权Token提取方式:
- 手动提取
- 第一种方案:浏览器开发工具F12,查看Network选项卡有关此网站域名的Fetch请求或是本网页地址:
- 第二种方案:浏览器开发工具F12,查看Application选项卡有关此网站域名的Cookie。
- 自动化提取
使用Python的selenium库。
- 创建Python项目
- 引入selenium库
from selenium import webdriver
- # 实例化 Chrome WebDriver
driver = webdriver.Chrome()
# 打开网站
get(api_server)
# 获取cookies,会返回一个字典
cookies = driver.get_cookies()
# 关闭浏览器,关闭后无法对网页、客户端存储信息做出任何操作。
driver.quit()
# 将获取到的字典转换为能够用的。
cookies = {cookie['name']: cookie['value'] for cookie in cookies}
# 使用cookies
print(cookies)
- 存储在localStorage中的授权方式
- 手动提取
- 第一种方案:浏览器开发工具F12,进入Console选项卡,输入localStorage:
- 第二种方案:浏览器开发工具F12,查看Application选项卡有关此网站域名的localStorage。
- 自动化提取
- 创建Python项目
- 引入selenium库,selenium与chrome driver的安装参见cookie部分。
from selenium import webdriver
- # 实例化 Chrome WebDriver
driver = webdriver.Chrome()
# 打开网站
get("需要获取cookie的站点url")
# 获取所有localStorage的内容
all_local_storage = driver.execute_script("return window.localStorage;")
相较于cookie, 获取到的localStorage直接是一个标准的键值对字典格式,可以直接访问。
- 在Python代码中使用授权
- 使用Cookies
在使用request发送请求时在传参时使用cookies=:
api="https://www.chinamoney.com.cn/r/cms/www/chinamoney/
# cookies变量为您通过手动或自动化的方式获取的cookie
data=requests.post(url=api,cookies=cookies)
- 使用Header: Authoriztion头
api="https://www.chinamoney.com.cn/r/cms/www/chinamoney/data/fx/ccpr.json"
# 创建headers字典
headers = {
"Authorization": "Bearer" + token
}
data = requests.post(url=api, headers=headers)
- 使用请求体发送授权
api="https://www.chinamoney.com.cn/r/cms/www/chinamoney/data/fx/ccpr.json"
data = requests.post(url=api + "token=" + token)
- 请求具有根据UA标识反机器人/按UA识别反爬虫的网站
- 概念
"User-Agent" 是一个HTTP头字段,它包含了向服务器发送请求的用户代理(通常是一个浏览器或其他客户端应用程序)的信息。该字段允许服务器识别用户代理的类型和版本,以便为不同的客户端提供适当的响应或服务。
User-Agent 字段通常包含了用户代理的名称、版本号和操作系统信息。例如,一个常见的User-Agent字符串可能是:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
在这个例子中,User-Agent字符串表明用户代理是基于WebKit引擎的Chrome浏览器,版本号是91.0.4472.124,操作系统是Windows 10。
网站和服务器可以使用User-Agent信息来调整其响应,以确保在不同的设备或浏览器上提供最佳的用户体验。然而,有时用户代理也可以被修改或伪装,这样用户就可以模拟不同的客户端来获取特定的服务或信息。
- UA的获取方式(有许多方式,仅介绍三种)
- 手动提取,访问任意有效网站,通过F12开发者工具 Network选项卡,选择任意请求查看User-Agent
- 手动提取,访问任意有效网站,通过F12开发者工具 Console选项卡输入输入userAgent
- 自动化提取,使用selenium库
from selenium import webdriver
# 使用Chrome浏览器,你也可以选择其他浏览器
driver = webdriver.Chrome()
# 访问一个网页,这里使用Google首页作为例子
driver.get("https://www.google.com")
# 使用JavaScript执行获取User-Agent的脚本
user_agent = driver.execute_script("return navigator.userAgent;")
# 打印获取到的User-Agent信息
print("User-Agent:", user_agent)
# 关闭浏览器
driver.quit()
- UA在Python request中的使用
UA的使用非常简单,只需在headers里加上”User-Agent”头
创建headers字典,并在请求时使用它
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
data = requests.get(url, headers=headers)


叨叨几句... NOTHING