[爬虫]解决机票网站文本混淆问题-实战讲解
前言
最近有遇到很多小伙伴私信向我求助,遇到的问题基本上都是关于文本混淆或者是字体反爬的问题。今天给大家带来其中一个小伙伴的实际案例给大家讲讲解决方法
📝个人主页→数据挖掘博主ZTLJQ的主页
个人推荐python学习系列:
☄️爬虫JS逆向系列专栏 - 爬虫逆向教学
☄️python系列专栏 - 从零开始学python
首先呢我们要讲的就是去哪儿网实战案例,那么私信我的这位小伙伴呢是想爬机票的信息,那么我们首先第一步就是打开网站
打开网站以后呢,我们就可以随便选择一个飞机的方向,比如我选择北京到马尼拉的机票,点击以后就会出现这个画面如下:
我们可以看到,每一个时间段、航班的不同都会产生不同的价格,那么按照平时我们看到这样的静态网站直接打开F12定位一下价格,用XPATH或者正则表达式就直接爬取完毕了,但是这个问题就出现在这里了,让我们打开F12抓包工具,定位到价格会出现如下图所示的画面:
网页显示的价格
网页源码中定位到标签元素的价格
我们可以看到,b标签下的i标签拼凑起来是978 和原本的价格971是不一样的,但是我们又可以发现一个规律,b标签下面还有一个b标签,这个b标签中的1就是我们需要的价格,如下图:
似乎我们已经找对方向了,那么接下来我们多看看几个价格,找一下其中的规律,我们接着往下面看一个价格如下图:
网页显示的价格
网页源码中定位到标签元素的价格
我们会发现b标签下的i标签是9412明显不是我们想要的数据,但是下面的b标签中131不就是我们需要的数据吗?如下图:
这里我们会发现9412中最后一个2是我们要的数据,下面的b标签中131也是我们需要的数据,这个数据再按顺序排列一下就是1312就成为了我们的价格,但是这个顺序是怎么看的呢?我们仔细看,下面的b标签中style元素中有一项 left:-64px,这个值得引起我们的注意,在前端中px代表的是像素,也就是移动的举例,left表示左边,我们发现前面有一个width=16px,是不是说明每一个数字的占位宽带代表着16个像素,而1这个数字要向左移动64个像素,也就是最前面,这样就说的过去了,如下图:
那么我们就可以知道,上面的i标签是用来迷惑我们的,下面的b才是我们需要爬取的数字,并且b标签的style代表的是偏移的位置,也就是用来帮助我们对数字进行排序的,那么有了这个思路我们就可以开始写代码了。
首先呢我们先写一个文本,可以直接复制机票网站源码中偏移的标签
"""text = """
<em class="rel"><b style="width:64px;left:-64px"><i title="1275" style="width: 16px;">4</i><i title="1275" style="width: 16px;">2</i><i title="1275" style="width: 16px;">6</i><i title="1275" style="width: 16px;">5</i></b><b title="1275" style="width: 16px;left:-32px">7</b><b title="1275" style="width: 16px;left:-16px">5</b><b title="1275" style="width: 16px;left:-64px">1</b>
</em>
"""
接下来导入相应的库,然后写一个空的列表,先把所有的i标签文本获取下来,存入到空列表当中,如下图:
接下来呢,我们根据上面的规律,需要替换的i标签只有后面3个,所有我们只取新建列表的后3个数据,然后准备替换成b标签中的数据,其次我们需要获取b标签中的文本数据也就是数字,还有style中偏移的数据,用来准备替换新建列表中的排序顺序。
最后获取style的值,替换偏移的数字即可
下面是所有的代码大家可以参考:
text = """
<em class="rel"><b style="width:64px;left:-64px"><i title="1275" style="width: 16px;">4</i><i title="1275" style="width: 16px;">2</i><i title="1275" style="width: 16px;">6</i><i title="1275" style="width: 16px;">5</i></b><b title="1275" style="width: 16px;left:-32px">7</b><b title="1275" style="width: 16px;left:-16px">5</b><b title="1275" style="width: 16px;left:-64px">1</b>
</em>
"""import re
from lxml import etreecontent = etree.HTML(text)# 先保存列表 到占位的数据
zhanwei = []
for i in content.xpath('//em[@class="rel"]/b/i'):zhanwei.append(i.text)# 定位到后面3个b标签 也就是去除第一个先
tag = content.xpath('//em[@class="rel"]/b')[1:]
a1 = [(i.text,i.xpath('./@style')[0]) for i in tag]
# 获取styles的偏移值
for p,style in a1:styles = re.findall('width: 16px;left:-(.*?)px',style)[0]print(styles)# 替换 偏移值zhanwei[-int(styles) // 16] = pprint(zhanwei)
当然可能有的小伙伴没有见过-int这种写法,其实还有一种写法,我给大家举例让大家对比使用
# 2种写法
"""
for p,style in a1:styles = re.findall('width: 16px;left:(.*?)px',style)[0]print(styles)# 替换 偏移值zhanwei[int(styles) // 16] = p
""""""
for p,style in a1:styles = re.findall('width: 16px;left:-(.*?)px',style)[0]print(styles)# 替换 偏移值zhanwei[-int(styles) // 16] = p
"""
那么我们就可以完成这种偏移的数据的爬取了,具体大家想要爬取那些数据,大家可以自行写代码,方法和思路都教给大家了,大家加油吧!!!
相关文章:

[爬虫]解决机票网站文本混淆问题-实战讲解
前言 最近有遇到很多小伙伴私信向我求助,遇到的问题基本上都是关于文本混淆或者是字体反爬的问题。今天给大家带来其中一个小伙伴的实际案例给大家讲讲解决方法 📝个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列: ☄️爬虫J…...
【已解决】Flask项目报错AttributeError: ‘Request‘ object has no attribute ‘is_xhr‘
文章目录 报错及分析报错代码分析 解决方案必要的解决方法可能有用的解决方法 报错及分析 报错代码 File "/www/kuaidi/6f47274023d4ad9b608f078c76a900e5_venv/lib/python3.6/site-packages/flask/json.py", line 251, in jsonifyif current_app.config[JSONIFY_PR…...

【Java基础教程】Java学习路线攻略导图——史诗级别的细粒度归纳,持续更新中 ~
Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇7、新特性篇8、常用类库篇 前言 🍺🍺 各位读者朋友大家好!得益于各位朋友的支持和关注,我的专栏《Java基础…...
IntelliJ IDEA 2023.1 更新内容总结
IntelliJ IDEA 2023.1 更新内容总结 * 主要更新内容 * UI 大改版 * 性能改进项 * 其它更新内容IntelliJ IDEA 2023.1 更新内容总结 主要更新内容 IntelliJ IDEA 2023.1 针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施, …...

什么是计算机蠕虫?
计算机蠕虫诞生的背景 计算机蠕虫的诞生与计算机网络的发展密切相关。20世纪60年代末和70年代初,互联网还处于早期阶段,存在着相对较少的计算机和网络连接。然而,随着计算机技术的进步和互联网的普及,计算机网络得以迅速扩张&…...

【机器学习】吴恩达课程1-Introduction
一、机器学习 1. 定义 计算机程序从经验E中学习,解决某一任务T,进行某一性能P,通过P测定在T上的表现因经验E而提高。 2. 例子 跳棋程序 E:程序自身下的上万盘棋局 T:下跳棋 P:与新对手下跳棋时赢的概…...
DBC转excel(python语言)
重复造轮子,只是为了熟悉一下DBC格式。 与同类工具的不同点: 能批量转换在同一文件夹下的所有DBC,省时省力。很多同类工具转换后的excel列宽较小,不能直接显示全部信息。本代码使用了自适应的列宽,看起来更方便。** …...
Java集合(List、Set、Map)
Java中的集合是用于存储和组织对象的数据结构。Java提供了许多不同的集合类,包括List、Set和Map等,以满足不同的需求。下面将介绍一些常见的Java集合类及其使用方法。 一、List List是一个有序的集合,它允许元素重复出现,并提供…...
Linux--只执行一次的计划任务--at命令
Linux–只执行一次的计划任务–at命令 文章目录 Linux--只执行一次的计划任务--at命令一、atd的启动和at的运行方式二、at总结 一、atd的启动和at的运行方式 atd的启动: systemctl restrat atd #重新启动atd这个服务 systemctl enable atd #让这个服务开机自启动 sy…...
关于贪心算法的一个小结
下面的内容主要参考了数据结构与算法之美。 贪心算法的应用有: 霍夫曼编码(Huffman Coding) Prim和Kruskal最小生成树算法 01背包问题(当允许取部分物品的时候) 分糖果 我们有m个糖果和n个孩子。我们现在要把糖果分给这些孩子吃ÿ…...

五、DQL-2.基本查询
一、数据准备 1、删除表employee: drop table employee; 2、创建表emp: 3、添加数据: 4、查看表数据: 【代码】 -- 查询数据--------------------------------------------------------- drop table emp;-- 数据准备-----------…...
SSL证书常见问题:SSL证书的概念和作用
什么是SSL证书? SSL证书是一种数字证书,它与身份证、驾照的功能一样,用于证明网站的身份。SSL证书是由全球信任的证书颁发机构(CA)在验证服务器身份后颁发,安装SSL证书后会激活HTTPS协议,在用户…...
J2EEXML建模
目录 用一个xml-config文件实例: 先看config.xml文件 再看 ActionModel ConfigModel ActionNotFoundException ForwardNotFoundException ConfigModelFactory ActionDuplicateDefinitionException ForwardDuplicateDefinitionException InvalidPathExcept…...
vue中export和export default
参考:vue中export和export default的使用 参考:vue里的export default...
转职做项目经理,我为什么选择PMP?
老实说,在学习PMP之前,我做了很长时间的思想斗争,一是平时工作有些忙,没有大块儿时间集中学习;二是不确定考完之后是否真能用上。但现在我可以很明确的告诉每一个想学习PMP的人:放心学吧,知识不…...
LangChain(5)Conversational Agents
Large Language Models (LLMs) 在语义知识方面表现不错,但也有一些不足,如:不能正确计算数学公式、无法获取最新知识新闻 通过 Agents 可以赋予 LLMs 更多能力,让LLM能够计算、上网查询 agent 简单使用 from langchain import …...
【云原生】Kubernetes临时容器
临时容器 特性状态: Kubernetes v1.25 [stable] 本页面概述了临时容器:一种特殊的容器,该容器在现有 Pod 中临时运行,以便完成用户发起的操作,例如故障排查。 你会使用临时容器来检查服务,而不是用它来构建…...

Jenkins+Robot 接口自动化测试
目录 前言: 设计目标 项目说明 目录结构 配置 jenkins 1.安装插件 2.配置项目 前言: JenkinsRobot是一种常见的接口自动化测试方案,可以实现自动化的接口测试和持续集成。Jenkins是一个流行的持续集成工具,而Robot Framew…...

【Visual Studio Code】---自定义键盘快捷键设置
概述 一个好的文章能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径,学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、进入键盘快捷键设置 1、进入键盘快捷键设置方法1 使用快捷键进入键盘快捷键设置先按 Ctrl K再…...

FastEdit ⚡:在10秒内编辑大型语言模型
概述: 这个仓库旨在通过一个单一的命令,有效地将新鲜且定制化的知识注入到大型语言模型中,以辅助开发人员的工作。 支持的模型:○ GPT-J (6B)○ LLaMA (7B/13B)○ BLOOM (7.1B)○ Falcon (7B)○ Baichuan (7B/13B)○ InternLM (7…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...