Python Selenium 自动化爬虫 + Charles Proxy 抓包

news2024/9/22 16:34:49

一、场景介绍

我们平常会遇到一些需要根据省、市、区查询信息的网站。

1、省市查询

比如这种,因为全国的省市比较多,手动查询工作量还是不小。

2、接口签名

有时候我们用python直接查询后台接口的话,会发现接口是加签名的。

而签名算法我们是不知道的。

扩展:

nonce(“只使用一次的数字”):number once 也就是随机验证码。

timestamp:客户端访问时间戳。

sign:请求参数签名。通过特定算法,将请求参数集合映射为一个字符串,这个字符串就是签名。签名能有效防止请求信息被黑客篡改。

province、city:就是我们前端请求的业务参数。

有了 sign 签名,为什么还需要 timestamp 和 nonce 呢?


timestamp 和 nonce 参数是为了防止重放攻击。

基于 timestamp 方案

每次HTTP请求,都需要加上 timestamp 参数,然后把 timestamp 和其他参数一起进行数字签名。
因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,
所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,
是否超过了60s,如果超过了则认为是非法的请求。

但这种方式的漏洞也是显而易见的,如果在60s之内进行高饱和重放攻击,那就没办法了,所以这种方式不能保证请求仅一次有效。

基于 nonce 方案

nonce 的意思是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,所以该参数一般与时间戳有关,方便起见,可以直接使用时间戳的16进制,实际使用时可以加上客户端的ip地址,mac地址等信息做个哈希之后,作为nonce参数。

我们将每次请求的 nonce 参数存储到一个“集合”中,可以 json 格式存储到数据库或缓存中。
每次处理HTTP请求时,首先判断该请求的nonce参数是否在该“集合”中,如果存在则认为是非法请求。

这种方式也有很大的问题,那就是存储 nonce 参数的“集合”会越来越大,验证 nonce 是否存在“集合”中的耗时会越来越长。我们不能让nonce“集合”无限大,所以需要定期清理该“集合”,但是一旦该“集合”被清理,我们就无法验证被清理了的nonce参数了。也就是说,假设该“集合”平均1天清理一次的话,我们抓取到的该url,虽然当时无法进行重放攻击,但是我们还是可以每隔一天进行一次重放攻击的。而且存储24小时内,所有请求的“nonce”参数,也是一笔不小的开销。

基于 timestamp 和 nonce 方案

那我们如果同时使用 timestamp 和 nonce 参数呢?
nonce的一次性可以解决 timestamp 参数60s的问题,timestamp 可以解决 nonce 参数“集合”越来越大的问题。

我们在timestamp方案的基础上,加上nonce参数,因为timstamp参数对于超过60s的请求,都认为非法请求,所以我们只需要存储60s的nonce参数的“集合”即可。

结论:

timestamp 和 nonce 和其他参数一起进行数字签名。这样就能防止请求信息被篡改,还能防止重放攻击。

3、Selenium 自动化爬虫

这个时候,就是 python Selenium 自动化爬虫的用武之地了。

它通过分析前端界面元素,模拟用户真实点击的方式,来 请求接口数据

然后通过分析 界面DOM元素 的方式,来 提取响应数据

二、环境介绍

  • python:3.12.5
  • Edge 浏览器驱动:Edge 浏览器驱动官网
  • Selenium python 插件
  • Charles抓包软件(下文会介绍为什么需要)Charles 安装 可以看这篇博文

三、步骤

1、下载 Edge 浏览器驱动

首先进入 Edge 浏览器驱动官网 

选择 beta(公测) 或者 stable(稳定) 版,根据自身操作系统型号,选择 64位或32位下载。

解压到电脑中某个位置备用。

2、安装 Selenium

pip install selenium

3、安装 Edge-Selenium 工具

pip install msedge-selenium-tools

4、F12 分析前端页面

可以找到 省 的数据。此时,市的数据界面上并没有显示出来。

 

不过,通过翻看网站的JS资源,我们找到一个 area.js 这个就是全国区域的基础数据。

进一步分析,我们还知道 parentid 还是 省的 id。

5、area.js 数据导入 Excel

把 area.js 数据导入 Excel 通过 JSON数据行转列方式 得到Excel 数据

通过 Excel 的数据过滤方式,进一步证实了我们的猜测。

parentid 还是 省的 下拉控件的 value。

福建的 province 14 过滤出福建的 9 个城市。

6、初步思路

这个时候,我们有了一个用 Selenium 自动化请求的初步思路。

用 Selenium 遍历点击 省份控件,接着 级联点击 城市控件,然后点击 查询控件,

最后再用 DOM 方式提取请求响应数据。

7、数据准备

在电脑上,新建一个 city 文件夹,里面存放以 省份ID 命名的文件。

文件里面则是 城市ID,每个 城市ID 占一行。

8、Selenium 方案初版代码

经过上面的数据准备,我们基本可以写出初版的爬虫代码:

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time

# 浏览器驱动的存放位置
service = Service(executable_path=r"G:\msedgedriver.exe")
driver = webdriver.Edge(service=service)
driver.get("你的网页")

# 暂停 3 秒  等待网页加载完成
time.sleep(3)

# 找到  省    下拉框元素
province_element = driver.find_element(By.ID, 'province')
# 创建 Select 对象
province_select = Select(province_element)
# 找到  市  下拉框元素
city_element = driver.find_element(By.ID, 'city')
# 创建 Select 对象
city_select = Select(city_element)

# 输入文件
input_path = r"C:\Users\Administrator\Desktop\py\city"
# 输出文件
output_path = r"C:\Users\Administrator\Desktop\py\output.txt"

for  province  in  range(1, 35):
    print('-----------省份【' + str(province) + '】开始')
    # 选中省份
    province_select.select_by_value(str(province))

    # 省份文件
    file_path = input_path + "\\"+str(province)+'.txt'
    with open(file_path, 'r', encoding='utf-8') as input_file:
            for line in input_file:
                city = line.strip()
                print('---------------城市【'+city+'】开始')
                # 选中城市
                city_select.select_by_value(city)
                # 找到 搜索 按钮
                submit_element = driver.find_element(By.ID, 'submit')
                # 点击搜索
                submit_element.click()
                # 暂停 2 秒  等待网页加载完成
                time.sleep(2)
                # 获取无序列表中的所有列表项
                li_elements = driver.find_elements(By.TAG_NAME, 'li')
                # 提取列表项中的文本内容并打印
                for li in li_elements:
                    # 根据 属性或者 class 过滤掉不是我们想要的数据 li
                    # 因为一个界面里面,可能不止一个 列表
                    if None != li.get_attribute("data-index"):
                      with open(output_path, 'a', encoding='utf-8') as output_file:
                          output_file.write('\n' + li.text)

                print('---------------城市【'+city+'】结束')
    print('-----------省份【' + str(province) + '】结束')

# 关闭驱动
driver.quit()

爬到的数据因为涉及信息安全问题,就不在这里展示了。

但是这个代码爬取数据,有一个问题,那就是,

有时候,接口响应的数据是完整的,但是,有些数据并没有在界面上展示,Selenium 又是基于 DOM 对界面进行分析的,这部分数据我们就拿不到了,用 python 直接访问这些接口,因为有签名的存在,又没有这个条件。这个时候,Charles 代理就闪亮登场了。

通过将浏览器的网络,指向这个 Charles 代理,Selenium 在前端进行自动化请求的同时,Charles 代理负责对会话进行记录,最后通过分析 Charles 会话数据,就可以获取到我们的接口请求数据了。

处理过程如下:

 9、Selenium + Charles 方案

这个时候的爬虫代码,就变简单了,只要无脑点击就好。

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time

# 浏览器驱动的存放位置
service = Service(executable_path=r"G:\msedgedriver.exe")
driver = webdriver.Edge(service=service)
driver.get("你的网页")

# 暂停 3 秒  等待网页加载完成
time.sleep(3)

# 找到  省    下拉框元素
province_element = driver.find_element(By.ID, 'province')
# 创建 Select 对象
province_select = Select(province_element)
# 找到  市  下拉框元素
city_element = driver.find_element(By.ID, 'city')
# 创建 Select 对象
city_select = Select(city_element)

# 输入文件
input_path = r"C:\Users\Administrator\Desktop\py\city"

for  province  in  range(1, 35):
    print('-----------省份【' + str(province) + '】开始')
    # 选中省份
    province_select.select_by_value(str(province))

    file_path = input_path + "\\"+str(province)+'.txt'
    with open(file_path, 'r', encoding='utf-8') as input_file:
            for line in input_file:
                city = line.strip()
                print('---------------城市【'+city+'】开始')
                # 选中城市
                city_select.select_by_value(city)
                # 找到 搜索 按钮
                submit_element = driver.find_element(By.ID, 'submit')
                # 点击搜索
                submit_element.click()
                # 暂停 2 秒  等待网页加载完成
                time.sleep(2)
                print('---------------城市【'+city+'】结束')
    print('-----------省份【' + str(province) + '】结束')

# 关闭驱动
driver.quit()

 10、分析 Charles 会话 JSON

分析 Charles 会话 JSONicon-default.png?t=O83Ahttps://blog.csdn.net/matrixlzp/article/details/142308538?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

keil5 MDK 最新版本官网下载(v5.40为例) ARM单片机环境搭建安装教程(STM32系列为例)

正所谓授之以鱼不如授之以渔。本文将细讲从官网下载keil5MDK来保证keil5为最新版本的实时性 (注意新老版本可能出现版本兼容问题,若不放心,跟着老弟我一起下载5.40版本即可) 目录 一、下载keil5 MDK 方法①:CSDN下载&#xff0…

计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【深入学习Redis丨第六篇】Redis哨兵模式与操作详解

〇、前言 哨兵是一个分布式系统,你可以在一个架构中运行多个哨兵进程,这些进程使用流言协议来接收关于Master主服务器是否下线的信息,并使用投票协议来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。 文章目录 〇、…

Django 5 学习笔记 2024版

1. 官方中文文档 Django 文档 | Django 文档 | Django (djangoproject.com) 2. 第一个应用 博客 总目录 <1>依赖安装: pip install django <2> 创建 工程 myapp django-admin startproject myapp cd myapp <3>创建 应用 app > python manage.py s…

算法-排序算法(冒泡选择插入希尔快速归并堆计算)

1.算法概述 1.1什么是算法 算法是特定问题的求解步骤的描述&#xff0c;是独立存在的一种解决问题的思想和方法。对于算法而言计算机编程语言并不重要&#xff0c;可以用任何计算机编程语言来编写算法。 程序数据结构算法 1.2数据结构和算法的区别和联系 数据结构只是静态…

CentOS 7 YUM源不可用

CentOS 7 操作系统在2024年6月30日后将停止官方维护&#xff0c;并且官方提供的YUM源将不再可用。 修改&#xff1a;nano /etc/yum.repos.d/CentOS-Base.repo # CentOS-Base.repo [base] nameCentOS-$releasever - Base baseurlhttp://mirrors.aliyun.com/centos/$rel…

数据库管理-第243期 云栖有感:AI?AI!(20240922)

数据库管理243期 2024-09-22 数据库管理-第243期 云栖有感&#xff1a;AI&#xff1f;AI&#xff01;&#xff08;20240922&#xff09;1 AI2 干货3 数据库总结 数据库管理-第243期 云栖有感&#xff1a;AI&#xff1f;AI&#xff01;&#xff08;20240922&#xff09; 作者&am…

Apache 中间件漏洞

CVE-2021-41773 环境搭建 docker pull blueteamsteve/cve-2021-41773:no-cgid 访问172.16.1.4:8080 使⽤curl http://172.16.1.4:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

Linux中的调度算法

nice值的范围有限&#xff0c;即为[-20, 19]&#xff0c;也就是40个数字&#xff0c;优先级为[60, 99]即一共40个优先级 目前谈论的Linux操作系统叫做分时操作系统&#xff0c;调度的时候主要强调公平&#xff0c;还有一种是实时操作系统&#xff0c;比如智能汽车里面必须装有这…

网站设计中安全方面都需要有哪些考虑

网站设计中的安全性是一个多方面的问题&#xff0c;需要从多个角度进行考虑和实施。以下是一些关键的安全考虑因素&#xff1a; 数据加密&#xff1a; 使用SSL&#xff08;安全套接字层&#xff09;证书来建立加密连接&#xff0c;确保数据在传输过程中不被截获。定期更新SSL证…

学习IEC 62055付费系统标准

1.IEC 62055 国际标准 IEC 62055 是目前关于付费系统的唯一国际标准&#xff0c;涵盖了付费系统、CIS 用户信息系统、售电系统、传输介质、数据传输标准、预付费电能表以及接口标准等内容。 IEC 62055-21 标准化架构IEC 62055-31 1 级和 2 级有功预付费电能表IEC 62055-41 STS…

【重学 MySQL】三十七、聚合函数

【重学 MySQL】三十七、聚合函数 基本概念5大常用的聚合函数COUNT()SUM()AVG()MAX()MIN() 使用场景注意事项示例查询 聚合函数&#xff08;Aggregate Functions&#xff09;在数据库查询中扮演着至关重要的角色&#xff0c;特别是在处理大量数据时。它们能够对一组值执行计算&a…

波分技术基础 -- Liquid OTN

什么是Liquid OTN 传统OTN技术主要定位于骨干网和城域网应用&#xff0c;主要用于承载大于1Gbits/s速率业务&#xff0c;在OTN下沉到城域/接入网后&#xff0c;面临如下问题&#xff1a;管道弹性不足&#xff08;最小管道ODU0&#xff09;、连接数少、带宽调整不够灵活等挑战。…

最强AI人脸高清修复

效果展示 大家好&#xff0c;今天给大家带来github上超火的人脸高清修复AI技术code former&#xff0c;算法不仅能够修复图像&#xff0c;还能够对视频进行修复 再上一些高模糊的图像&#xff0c;测试一下算法效果&#xff1a; 怎么样&#xff0c;效果是不是非常强大。 算…

正点原子RK3588(二)——lenet测试和modelzoo模型

文章目录 一、lenet二、modelzoo模型2.1 介绍2.2 测试 一、lenet import cv2 import numpy as np from rknnlite.api import RKNNLite RKNN_MODEL LeNet5_mnist_model.rknndef show_top5(result):output result[0].reshape(-1)output_sorted sorted(output, reverseTrue)to…

微信小程序教程:如何在个人中心实现头像贴纸功能

在微信小程序中&#xff0c;个性化设置是提升用户体验的重要手段。本文将详细介绍如何在个人中心模块中实现头像贴纸功能&#xff0c;让用户可以自由地装饰自己的头像。 头像贴纸功能允许用户在个人头像上添加装饰性贴纸&#xff0c;增加个性化表达。以下是实现该功能的主要步骤…

设计模式-行为型模式-命令模式

1.命令模式的定义 命令模式将请求封装为一个对象&#xff0c;这样可以使用不同的请求参数化其他对象&#xff08;将不同请求依赖注入到其他对象&#xff09;&#xff0c;并且能够支持请求的排队执行、记录日志、撤销等功能&#xff1b; 1.1 命令模式优缺点 优点 降低系统的耦…

独立站如何批量查收录,如何进行独立站的批量收录查询的详细操作

对于独立站&#xff08;即自主搭建的网站&#xff09;进行批量收录查询&#xff0c;是网站优化与管理中的一项重要工作&#xff0c;它有助于了解网站在搜索引擎中的表现情况&#xff0c;从而制定更有效的SEO策略。介绍如何进行独立站的批量收录查询&#xff1a; 一、准备阶…

C++:数组与字符串

一、数组 数组是一种存储若干元素的数据类型&#xff0c;在诸多编程语言中存在&#xff0c;其显著的特点是元素通常是在物理层面上连续存储的&#xff08;逻辑上的数组&#xff0c;比如链表&#xff0c;可能不是&#xff09;&#xff0c;并且具有极快的元素访问速度。 数组通常…

Nuxt Kit API :路径解析工具

title: Nuxt Kit API :路径解析工具 date: 2024/9/22 updated: 2024/9/22 author: cmdragon excerpt: 摘要:本文介绍了Nuxt Kit中用于解析路径的API工具,包括resolvePath、resolveAlias、findPath和createResolver。这些工具助力开发者处理模块路径、别名、文件扩展名,提…