[爬虫]解决机票网站文本混淆问题-实战讲解

 前言
最近有遇到很多小伙伴私信向我求助,遇到的问题基本上都是关于文本混淆或者是字体反爬的问题。今天给大家带来其中一个小伙伴的实际案例给大家讲讲解决方法

📝个人主页→数据挖掘博主ZTLJQ的主页

b1691e6f246947eeb06ee06469621bc2.gif

个人推荐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 etree


content = 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] = p

print(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
"""

那么我们就可以完成这种偏移的数据的爬取了,具体大家想要爬取那些数据,大家可以自行写代码,方法和思路都教给大家了,大家加油吧!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Windows下安装Anaconda平台

Anaconda介绍 安装Python的方法有很多&#xff0c;其中利用Anaconda来安装&#xff0c;是最为安全和便捷的方法之一。在Python中安装类库&#xff0c;各个类库之间可能存在相互依赖、版本冲突等问题。为了解决这个问题&#xff0c;Python社区提供了方便的软件包管理工具&#…

在SPringBoot生成验证码

1.引入依赖,这个依赖中包含了生成验证码的工具类 <!--引入hutool --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.9</version></dependency> 2.编写配置类 import cn.hu…

【NLP】国外新动态--LLM模型

一、说明 NLP走势如何?这是关于在实践中使用大型语言模型(LLM)的系列文章中的一篇文章。在这里,我将介绍LLM,并介绍使用它们的3个级别。未来的文章将探讨LLM的实际方面,例如如何使用OpenAI的公共API,Hugging Face Transformers Python库,如何微调LLM,以及如何从头开始…

Maven -- <dependencyManagement>管理子项目版本

背景&#xff1a; 一个旧项目&#xff0c;想使用mybatis-plus&#xff0c;想着这是比较基础的依赖包&#xff0c;就在父项目中添加对应依赖&#xff0c;如下: <!-- 依赖声明 --><dependencyManagement><dependencies><!-- mybatis-plus 依赖配置 -->&l…

WMTS 地图切片Web服务 协议数据解析

1. WMTS 描述 WMTS(Web Map Tiles Service):地图切片Web服务。 2. 数据示例&#xff1a; arcgis online 导出的wmts xml&#xff1a; https://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/WMTS 内容解析&#xff1a; contents中可能包…

云计算相关概念

文章目录 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云--区别和特性二、华为云&#xff1a;简介、主要业务、特点和优势、不同场景和行业中的应用三、华为云-三剑客&#xff1a;IaaS、PaaS、SaaS 一、云计算的三种部署模式&#xff1a;公有云、私有云、混合云–…

uni-app的H5版本下载跨域问题

前端能正常访问图片&#xff0c;但无法下载 因为路径不经过业务代码&#xff0c;所以需要在nginx配置跨域 代码&#xff1a; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET, POST, OPTIONS; add_header Access-Control-Allow-H…

WIN无法访问linux开启的SAMBA服务器

WIN无法访问linux开启的SAMBA服务器 打开搜索框“管理Windows凭据” 点击编辑

[java安全]CommonsCollections1(LazyMap)

文章目录 【java安全】CommonsCollections1(LazyMap)前言LazyMap如何创建LazyMap对象&#xff1f;如何调用LazyMap的get()方法&#xff1f;如何触发AnnotationInvocationHandler#invoke()方法&#xff1f;POC总结参考 【java安全】CommonsCollections1(LazyMap) 前言 前面我们…

【云原生】k8s之HPA,命名空间资源限制

1.HPA的相关知识 HPA&#xff08;Horizontal Pod Autoscaling&#xff09;Pod 水平自动伸缩&#xff0c;Kubernetes 有一个 HPA 的资源&#xff0c;HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、 Deployment 或者Replica Set 中的 Pod 数量。 &#xff08;1&a…

ubuntu 20.04 4090 显卡驱动安装 深度学习环境配置

1. 显卡驱动安装 准备工作&#xff1a; 换源安装输入法&#xff1a;重启的步骤先不管&#xff08;自选&#xff09;sudo apt update && sudo apt upgrade 禁用nouveau驱动&#xff08;这个驱动是ubuntu开源小组逆向破解NVIDIA的开源驱动&#xff0c;与英伟达的原有驱…

实训笔记7.19

实训笔记7.19 7.19一、座右铭二、Hadoop的HDFS分布式文件存储系统的相关原理性内容2.1 HDFS上传数据的流程2.2 HDFS下载数据的流程2.3 HDFS中NameNode和SecondaryNameNode工作机制&#xff08;涉及到HDFS的元数据管理操作&#xff09;2.4 HDFS中NameNode和DataNode的工作机制&a…

CVE-2023-1454注入分析复现

简介 JeecgBoot的代码生成器是一种可以帮助开发者快速构建企业级应用的工具&#xff0c;它可以通过一键生成前后端代码&#xff0c;无需写任何代码&#xff0c;让开发者更多关注业务逻辑。 影响版本 Jeecg-Boot<3.5.1 环境搭建 idea 后端源码&#xff1a; https://git…

opencv -12 图像运算之按 《位或》 运算(图像融合图像修复和去除)

位或运算 或运算的规则是&#xff0c;当参与或运算的两个逻辑值中有一个为真时&#xff0c;结果就为真。其逻辑关系可以类比为如图 所示的并联电路&#xff0c;两个开关中只要有任意一个闭合时&#xff0c;灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明&#xff0c;…

050、事务设计之Percolator事务模型

Percolator 背景 Bigtable: 大表打散每行到各个节点&#xff0c;每一行作为一个kv。解决的问题 一个事务涉及的行在多个节点&#xff0c;如何用单行对一个事务进行控制&#xff0c;实现原子性。 快照隔离级别&#xff08;snapshot &#xff09; 白色点&#xff1a;代表事务开始…

Spring:Bean生命周期

Bean 生命周期生命周期 Bean 生命周期是 bean 对象从创建到销毁的整个过程。 简单的 Bean 生命周期的过程: 1.实例化(调用构造方法对 bean 进行实例化) 2.依赖注入(调用 set 方法对 bean 进行赋值) 3.初始化(手动配置 xml 文件中 bean 标签的 init-method 属性值,来指…

C语言小项目——通讯录高阶(文件管理版)

通讯录初阶: 点这里 通讯录中阶: 点这里 文件管理版本改进之处通讯录初始化退出通讯录并保存 完整代码contact.hcontact.ctest.c 文件管理版本改进之处 通讯录初始化 contact.c 退出通讯录并保存 test.c contact.c contact.h 完整代码 contact.h #pragma once#include&l…

Android应用启动全流程分析(源码深度剖析)

作者&#xff1a;努比亚技术团队 源码来源&#xff1a;努比亚技术团队 1.前言 从用户手指点击桌面上的应用图标到屏幕上显示出应用主Activity界面而完成应用启动&#xff0c;快的话往往都不需要一秒钟&#xff0c;但是这整个过程却是十分复杂的&#xff0c;其中涉及了Android系…

【Win10系统下载Python3】

Python3官网&#xff1a;https://www.python.org/downloads/windows/ 注

基于springboot的微信小程序宠物领养医院系统(源代码+数据库+10000字论文)085

基于springboot的微信小程序宠物领养医院系统(源代码数据库10000字论文)085 一、系统介绍 本项目有网页版和小程序端 本系统分为管理员、医生、用户三种角色 用户角色包含以下功能&#xff1a; 登录、注册、宠物领养、医生在线咨询、查看挂号、个人中心、密码修改、宠物寄…
最新文章