第八十二期 requests与selenium初步使用

发布于 2024-11-22  111 次阅读


*以下内容不适用于对js代码做了混淆加密、使用机器人验证码等技术手段的反爬虫网站。

  • 工作流程
  1. 请求网页/API接口
  2. 解析网页/数据
  3. 数据清洗
  4. 数据存储
  • 发送请求

使用requests库

  • GET请求

用于请求获取指定资源的信息。

请求参数附在URL后,可见于URL中。

对服务器的数据不会产生修改。

  • POST请求

用于向指定资源提交要被处理的数据。

请求参数通常在请求体中,不可见于URL。

对服务器的数据可能产生修改

  • PATCH请求

类似于PUT,但用于对资源的部分内容进行更新。

请求体中包含要更新的资源的部分数据。

  • DELETE请求

请求服务器删除指定的资源。

通常没有请求体,删除操作由URL指定。

  • PUT请求

用于请求服务器存储一个资源,并用请求的数据替代指定资源的内容。

请求体中包含要更新的资源数据。

什么时候用什么请求,可以在开发者工具F12 Network选项卡,想要发送的请求找到:

需要用到那个哪种方式的请求,就用requests.请求方式,比如requests.get(), requests.post()等等。

 

  • 请求具有授权的网页/API接口
  • 了解鉴权与授权

请求需要分为直接请求网页或者是直接对一个网站的后端API发送请求。

  1. 鉴权

鉴权(Authentication):确认用户的身份,验证用户是否是他们声称的身份。通常通过用户名和密码的组合,或者其他身份验证方式来实现。

  1. 授权

授权(Authorization):确定用户是否有权限访问某些资源或执行某些操作。在你的例子中,用户需要是VIP才能观看特定的视频,这是一种授权机制。

举例:

  1. 用户登录:这是鉴权的过程,涉及用户名和密码的验证。
  2. 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等等,这些授权方式,不再展开。

  • 授权的发送载体或存储介质

按发送载体分类:

  1. 可基于 Cookie 的身份验证:
  2. 基于会话的身份验证(Session-Based Authentication)(必须Cookie传输)
  3. JWT Token (JSON Web Token)
  4. 自定义Token身份验证
  5. 可基于Header的身份验证(Authorization 头):
  6. JWT Token (JSON Web Token)
  7. Bearer 令牌(必须使用Authorization 头)::

示例: Authorization: Bearer <token>。

  1. Basic基本身份验证(必须使用Authorization 头):

示例: Authorization: Basic <base64编码>。

  1. 可基于请求体(Body 里FormData、application/json, URL Param传参等)的身份验证:

使用请求体发送的Token一般都会存储在浏览器的localStorage中。

  1. 自定义Token身份验证
  2. JWT 令牌 (JSON Web Token)

按存储载体分类:

  1. 可存储于Cookie中的:
  2. 基于会话的身份验证(Session-Based Authentication)(必须存储于Cookie)
  3. JWT Token (JSON Web Token)
  4. 自定义Token身份验证
  5. localStorage
  6. JWT Token (JSON Web Token)
  7. 自定义Token身份验证
  8. 不做存储的
  9. Basic验证

 

  • 查看授权的发送方式
  1. Cookie

JSESSION ID、Token等字样在请求的Cookie中出现:

  1. Header: Authoriztion

Basic验证、Bearer都是在Header里设置Authoriztion头。

有时JWT Token、自定义Token会以Bearer的形式发送,在请求的Request Headers里出现了Authoriztion头,基本就是通过此方式发送授权Token的

  1. 基于请求体(Body 里FormData、application/json, URL Param传参等)的身份验证通过Cookie传输,特征是https://xxxx.com/api?token=xxxx

一般会在URL内带上token字眼参数,这也是需要注意的。

 

 

  • 安装selenium与Chrome Driver

使用selenium库之前需要做一些准备工作:

  1. 下载Google Chrome浏览器的特定版本的离线安装包并安装需要特定版本的原因是,默认官方链接下载的Google Chrome版本为最新版本,可能没有与其版本对应的Chrome Driver

如果没有Google Chrome,需要安装它,如果您已安装它,请跳转到下一步。

  1. 查看Google Chrome版本号

版本号前三位大于等于120的,请使用此链接,查看此处图片。

https://googlechromelabs.github.io/chrome-for-testing/#stable

选择与自己版本号最后一个小数点前相同的版本的Chrome Driver

  1. 手动提取
  2. 自动化提取

版本号前三位小于等于114的,请使用此链接,查看此处图片。:

https://registry.npmmirror.com/binary.html?path=chromedriver/

选择与自己版本号最后一个小数点前相同的版本的Chrome Driver

 

  1. 解压Chrome Driver到您知晓的位置,并确保此路径没有权限问题,

比如C盘的根目录或是其他人的用户目录、C:\Program Files、C:\Windows 都可能存在权限问题,请将它放到没有权限问题的目录。

  1. 为Chrome Driver添加环境变量

首先复制您刚刚解压到的路径

搜索env,选择编辑系统环境变量。

  1. 添加用户和系统环境变量

 

  • 提取授权

在了解了常见的授权方式、类型、发送载体后,就可以提取这些内容。

  1. 存储在Cookie中的授权Token提取方式:
  2. 手动提取
    1. 第一种方案:浏览器开发工具F12,查看Network选项卡有关此网站域名的Fetch请求或是本网页地址:
    2. 第二种方案:浏览器开发工具F12,查看Application选项卡有关此网站域名的Cookie。
  3. 自动化提取

使用Python的selenium库。

  1. 创建Python项目
  2. 引入selenium库

from selenium import webdriver

  1. # 实例化 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)

  1. 存储在localStorage中的授权方式
  2. 手动提取
    1. 第一种方案:浏览器开发工具F12,进入Console选项卡,输入localStorage:
    2. 第二种方案:浏览器开发工具F12,查看Application选项卡有关此网站域名的localStorage。

 

  1. 自动化提取
  2. 创建Python项目
  3. 引入selenium库,selenium与chrome driver的安装参见cookie部分。

from selenium import webdriver

  1. # 实例化 Chrome WebDriver
    driver = webdriver.Chrome()
    # 打开网站
    get("需要获取cookie的站点url")
    # 获取所有localStorage的内容
    all_local_storage = driver.execute_script("return window.localStorage;")

相较于cookie, 获取到的localStorage直接是一个标准的键值对字典格式,可以直接访问。

  • 在Python代码中使用授权
  1. 使用Cookies

在使用request发送请求时在传参时使用cookies=:

api="https://www.chinamoney.com.cn/r/cms/www/chinamoney/

# cookies变量为您通过手动或自动化的方式获取的cookie

data=requests.post(url=api,cookies=cookies)

 

  1. 使用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)

 

  1. 使用请求体发送授权

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的获取方式(有许多方式,仅介绍三种)
  1. 手动提取,访问任意有效网站,通过F12开发者工具 Network选项卡,选择任意请求查看User-Agent
  2. 手动提取,访问任意有效网站,通过F12开发者工具 Console选项卡输入输入userAgent
  3. 自动化提取,使用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)

 

 

 


Skyler & Harry 's Notes