selenium网络爬虫去哪儿机票利用performance获取日志截获加载的xhr,ajax,js等数据

news2025/1/20 3:49:07

这次练习获取的网站使用了许多反爬技术:

1.html页面使用了css字体偏移

2.xhr加载有webdriver反爬检测

3.请求接口使用了多项加密参数以及cookie验证

4.部分js代码用了ob混淆

 

一开始只是想学习练手一下css偏移学习后是解决了,但想获取页面源代码时候遇到了重重问题。

爬取测试思路:

        request请求无数据内容,说明数据是异步请求得来,查看xhr找到了请求的api,查看试图逆向参数发现稍有难度,参数比较多,接着试图换一个思路,用selenium访问获取页面源代码,接着驱动访问发现显示不出内容,并要求登录,然后解决cookies:解决登录获取cookies.载入cookies后发现依旧是不现实数据,经过检查发现有个js文件监测webdriver访问,所以要将selenium伪装。最后成功加载出内容。接着获取页面源代码看看,结果又再次发现新问题!!!页面获取后发现是经过ob混淆的页面源代码,处理起来难度又更高了(最后总结发现并非全部混淆只是哈有ob混淆的代码就以为运用上了),最后几经思考了解到利用日志定位到页面加载的数据从而获取加载过了什么数据,等于抓包软件抓取的原理。经过测试终于成功获得api返回的数据。

        (虽然后面发现可以定位页面获取想要的数据并没有ob混淆只是部分运用了,但获取请求的返回更高效不需要翻页请求一次获取全部内容,并且摸索学会了新的爬取技术)

下面记录一下本次学习到的获取方法:

先记录一下学习过程遇到的问题:

1.为获取performance日志添加项的报错

因为pip下载是最新版本的selenium所以option.add_experimental_option('w3c',False),会报错因为4.3版本后w3c默认了不允许设置False。降版本到3.141.0即可解决。

2.定位标签点击却报错字典类型无法使用click(),解决方法也是降低版本解决。

        需要添加一些项才能使用driver.get_log('performance')获取日志,具体原理因为我也不是很了解浏览器设计原理所以没有深究

caps = DesiredCapabilities.CHROME
caps['loggingPrefs'] = {
    'browser':'ALL',
    'performance':'ALL',
}
caps['perfLoggingPrefs'] = {
    'enableNetwork' : True,
    'enablePage' : False,
    'enableTimeline' : False
    }
option = webdriver.ChromeOptions()
option.add_experimental_option('perfLoggingPrefs',{
    'enableNetwork':True,
    'enablePage':False,
})
driver = webdriver.Chrome(options=option,desired_capabilities=caps)

伪装浏览器的基础上再加上上面内容才能获取日志

接着获取到日志后,循坏查找里面允许了api的那一条获取他的requestid再通过id定位到加载的数据:

具体代码如下:

def get_xhr(driver,url1):
    driver.get(url1)    #访问地址
    time.sleep(2)       #给予时间载入日志
    try:
        request_log = driver.get_log('performance') #获取日志
        # print(request_log)
        print(len(request_log)) #查看数据数量
        for i in range(len(request_log)):       #通过循环获取request中的url
            message = json.loads(request_log[i]['message'])
            message = message['message']['params']
            # .get() 方式获取是了避免字段不存在时报错
            request = message.get('request')    
            if (request is None):
                continue#
            url = request.get('url')
            if (url == "https://flight.qunar.com/touch/api/domestic/wbdflightlist"): 
                # 定位得到requestId
                requestid = message['requestId']
                print(requestid)
                # 通过requestId获取接口内容
                content = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestid})
                print(content)
                break
    except:
        # 因为selenium原因载入cookie维持登录状态需要刷新,而刷新会影响工作日志,导致获取不到这时递归再次获取一次即可
        get_xhr(driver,url1)    

运行代码:

成功获取到数据,因为此网站的数据是直接返回所有当天的所有机票数据,所以更方便不需要跳转页面来获取,只需要对数据进行提取即可!

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

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

相关文章

Apache Traffic Server 存在拒绝服务漏洞

漏洞描述 Apache Traffic Serve(ATS) 是一个开源的 HTTP/1.1 和 HTTP/2 缓存代理服务器,uri_signing 是 ATS 的一款 URI 签名插件,用来阻止所有不具有有效 JWT 的请求。 Apache Traffic Server 的受影响版本中存在拒绝服务漏洞&…

人工神经网络 ANN 基础概念

目录 一:简介 二:感知器 三:权重和阈值 四:多层前馈网络 五:BP神经网络 一:简介 机器学习是实现人工智能的方法,深度学习是实现机器学习的技术。在实现人工智能时需要人工辅助(半自动)&…

图像分类:Pytorch图像分类之--LetNet模型

文章目录前言LetNet简介程序的实现model.py的实现LetNet模型操作流程经过Conv卷积后输出尺寸的计算公式如下Conv2d()函数介绍MaxPool2d()函数介绍Tensor的展平:view()train.py导入数据集加载数据集参数设置训练数据保存模型train_tool.pypred…

前端基础(十四)_隐藏元素的方法

隐藏元素的方法 1、display 通过display:none来控制元素隐藏 不使用&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">…

以数据驱动的自动驾驶时代,还有多远?丨曼孚科技

自动驾驶即将来到数据驱动时代。 在经历了硬件(激光雷达)、软件(多传感器融合)等技术革新后&#xff0c;自动驾驶迎来了第三波浪潮。 去年&#xff0c;除造车新势力外&#xff0c;国内一批主机厂吉利、上汽、广汽等&#xff0c;纷纷加大了自动驾驶数据标注业务投入。到今年&a…

参加 Spartacus 开源项目开发时需要注意的一些编程规范

我们使用 NgRx 存储来管理 Spartacus 功能中的全局应用程序状态。 使用 NgRx 在性能、更好的可测试性和易于故障排除、方面具有明显的优势。 除非有令人信服的理由不这样做&#xff0c;否则在某项 feature 的开发里&#xff0c;请总是使用 Rgrx 来管理状态。 使用 Store 并不…

PS CS6视频剪辑基本技巧(二)视频剪接和添加图片

上一讲&#xff0c;介绍了PS CS6可以实现视频剪接、添加图片、添加声音、添加字幕、添加logo、添加动画等6种功能&#xff0c;今天这讲介绍一下视频剪接和添加图片这两个功能。 目录 一、基本操作 1、打开时间轴窗口 2、创建时间轴 二、视频剪接 1、打开已存在的视频文件…

c++visualStudio学习笔记

文章目录5 c如何工作5.1include5.2main5.3 <<5.3 linker链接器7 C链接器linker是如何工作的7.1案例10 头函数10.1案例10.2头文件10.3pragma once34const34.1 常数34.2指针34.3类和方法34.4引用34.5mutable5 c如何工作 源文件就是文本文件转化到可执行的二进制文件或者程…

MySQL自增主键一定是连续的吗

测试环境&#xff1a; MySQL版本&#xff1a;8.0 数据库表&#xff1a;T &#xff08;主键id&#xff0c;唯一索引c&#xff0c;普通字段d&#xff09; 如果你的业务设计依赖于自增主键的连续性&#xff0c;这个设计假设自增主键是连续的。但实际上&#xff0c;这样的假设是错…

一个大二计算机学生的学期总结(2022末年)

学期总结前言一、本学期的自我反思&#xff08;1&#xff09;返校之前在家期间练习题黑马头条教学管理平台Ajax练习仿写JD&#xff08;2&#xff09;返校之后在学校期间练习题本学期课程hbase、hive、Hadoop一直奉行的话前言 ☀️东流逝水&#xff0c;叶落纷纷&#xff0c;荏苒…

初级程序员 中级程序员 高级程序员级别划分

网络上众说纷纭&#xff0c;大都站立在对某一技术的知识掌握量上来界定&#xff0c;或者有些人说着说着&#xff0c;发现无法自圆其说&#xff0c;然后就说这三种人就是一种叫法&#xff0c;你觉得你是高级你就高级了&#xff0c;从概念上讲&#xff0c;这三者之间必然有质的区…

20221221查看RK3588开发板的LCD屏幕的分辨率(1536x2048)

20221221查看RK3588开发板的LCD屏幕的分辨率 2022/12/21 18:46 方法一&#xff1a;adb/串口 console:/ $ console:/ $ [ 37.217258][ T57] vbus5v0_typec: disabling [ 37.217707][ T57] vcc3v3_pcie20: disabling console:/ $ console:/ $ console:/ $ dumpsys wi…

我国输配电及控制设备行业现状及竞争分析 营收及企业规模整体增长

根据观研报告网发布的《中国输配电设备行业发展趋势研究与未来投资分析报告&#xff08;2022-2029年&#xff09;》显示&#xff0c;输配电及控制设备主要应用于电力系统和下游用电企业的电能传输和电能控制等&#xff0c;直接影响电网的建设、安全与可靠运行&#xff0c;输配电…

Go:使用 go-micro 构建微服务(二)

1. 什么是go micro# 1.1 go micro作用 它是一个可插入的RPC框架&#xff0c;用于在Go中编写微服务。开箱即用&#xff0c;您将收到&#xff1a; 服务发现: 应用程序自动注册到服务发现系统负载平衡: 客户端负载平衡&#xff0c;用于平衡服务实例之间的请求同步通信: 提供请求…

12月21日:fastadmin顶部搜索栏selectpage事件绑定以及实现添加表单和查询数据在同一个页面

fastadmin将添加表单从弹窗转为页面 如图所示&#xff0c;实现这种两个标签页&#xff0c;各自执行自己的操作 添加页从弹窗转为页面实现步骤&#xff1a; 首先&#xff1a;从前端页面来看&#xff0c;需要将添加的功能移动到index页面&#xff0c;即可初步实现 将Index页面如…

l2实时接口在手机APP上的使用方法介绍

考虑到很多人白天只能在手机上看行情&#xff0c;因此也重点介绍一下l2实时接口在手机APP上的使用方法&#xff0c;但是功能上PC才是最直观的。除了本文介绍的重点功能&#xff0c;Level2还有其他功能&#xff0c;具体使用方法可参考同花顺官方介绍。 利用“BBD”看当天大盘走…

R语言中的风险价值模型度量指标TVaR与VaR

99&#xff05;的预期缺口[…]与99.6&#xff05;的[…]风险值非常接近 受到“ 瑞士经验”报告中一句话的启发&#xff0c; 在99&#xff05;置信水平[...]上的预期缺口[…]对应于大约99.6&#xff05;至99.8&#xff05;的风险价值 最近我们被客户要求撰写关于VaR的研究报告…

DPDK KNI 接口3

图1. kni结构图 从结构图中可以看到KNI需要内核模块的支持&#xff0c;即rte_kni.ko 当rte_kni模块加载时&#xff0c;创建/dev/kni设备节点&#xff08;rte_kni模块创建kni杂项设备&#xff0c;文件系统节点/dev/kni需要手动或者通过udev机制创建&#xff09;&#xff0c;藉…

django.test.client的一些用法

对于文件&#xff08;文本文件&#xff0c;或图片文件等等文件&#xff09;从客户端上传到服务端&#xff0c;对于常规情况&#xff0c;也就是真实服务端和客户端&#xff0c;我们往往是需要给files这个参数的。 具体来说&#xff0c;就像这样&#xff1a; import requestshe…

万字总结Bootloader到内核的启动流程

Bootloader启动流程分析 Bootloader的启动过程可以分为单阶段、多阶段两种。通常多阶段的 Bootloader能提供更为复杂的功能以及更好的可移植性。从固态存储设备上启动的 Bootloader大多都是两阶段的启动过程。第一阶段使用汇编来实现&#xff0c;它完成一些依赖于CPU体系结构的…