【那些反爬和反反爬】xpath根据兄弟节点定位元素

其实这篇不涉及什么高大上的反爬,但是实在不知道要把这篇文章归类到哪里,就直接先扔这里吧。

先吐槽一句:萌娘百科绝对是我再也不想爬第二次的网站。

第二句:(真理)把网站弄得越乱越让人摸不着头脑,就是最好的反爬手段,比什么加密都管用。

先看需求:爬取萌娘百科中所有游戏角色介绍

正常对于一个百科类网站而言,一拿到这个需求,第一反应肯定是先弄一个游戏角色名的list,然后挨个进行search,抓取返回的页面内容。然而当我想进一步索要游戏角色名的list时,得到的回复是:没有现成的游戏角色名,把萌娘上有的游戏角色爬了就行。

歪日???

一开始的思路还是先自己整一个游戏角色名的list,这样我面临一个很大的问题就是,量上不去。即便在度娘的帮助下,我能找到的游戏角色也就那么几个,再去除一些萌娘没有收录的词条,就所剩无几了。

没辙,死磕网站吧。

然后我找到了这个:https://mzh.moegirl.org.cn/Special:特殊页面

我一度以为自己发现了宝藏,直到我在让人眼花撩乱的页面中怎么也找不到我要的游戏角色分类…这分类都是啥啊,太乱了吧。

后来勉强又找到了两个看上去能爬的、勉强贴近我的需求的页面:https://mzh.moegirl.org.cn/Category:分类、https://mzh.moegirl.org.cn/Category:电子游戏角色列表

可算是有点东西了。虽然这肯定不是所有的链接,但好歹能缓解我的燃眉之急。

这也算是给了一个新的思路:爬这种百科类的网站的时候,可以尝试去定位网站的根目录,然后从根目录里沿着网站的分类树一级一级地往下搜索,把需要的链接抓全

这是爬萌娘遇到的第一个问题,勉强算解决了吧。

爬的过程中发现,萌娘的每一个词条的最底端,会附上一大堆的相关或者参考链接,有很多游戏角色都会给总给在一个类似下边的大表中:

在这里插入图片描述

这张大表除了有游戏角色,还有一堆乱七八糟的分类,并且,每个页面下的大表可能都不一样,当然也有可能一样。

在这里插入图片描述
那我只要里边的角色名和链接,我该怎么操作?

观察页面源代码发现,表格的第一列(即带有xx角色字样的标题列)跟其右边的内容是一一对应的,同在一个tr标签下,也就是说,他们是兄弟节点。

在这里插入图片描述XPath的following-sibling轴可以选择当前节点之后的兄弟节点:

from lxml import etree

# 使用XPath选择包含"角色"文字的td标签,并获取其下一个兄弟节点的内容
selected_elements = tree.xpath('//td[contains(text(), "角色")]/following-sibling::td[1]')

在XPath表达式中,//td[contains(text(), "角色")]/following-sibling::td[1]表示选择包含"角色"文字的td标签,然后获取其下一个兄弟节点的内容。

最终的代码如下:

def get_table_links(url):
    headers = {
        'User-Agent': random.choice(USER_AGENTS_LIST),
        'Referer': url
    }
    resp = requests.get(url, headers=headers)
    text = resp.text

    html = etree.HTML(text)
    # 所有罗列了游戏角色的表格定位
    hrefs = html.xpath('(//table[@class="navbox"])[1]//td[contains(text(), "角色")]/following-sibling::td[1]//a[not(@class="new") and not(starts-with(@href, "http"))]/@href')
    return hrefs

其中,//a[not(@class="new") and not(starts-with(@href, "http"))]意味获取所有class不为“new”的a标签下的链接,之所以要排除掉这个class,是因为萌娘中,class="new"意味着该页面不存在。

最后感慨,我确实、十分、非常佩服萌娘网站的设计者,顶礼膜拜的那种。

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

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

相关文章

【2024提前批/秋招笔试汇总2】——大疆-嵌入式软件-2023.08.06

一、 单选题(40分) 1. 以下关于GPU的特点描述不准确的是: A.GPU无法使用共享内存结构,提高通信速度 B.GPU的并行数据处理可以大幅度提高运算能力 C.GPU使用高速全局内存可以进一步提升运算速度 D.GPU的计算能力比CPU强 2.下列关…

技术架构-单机架构

前言 从今天开始系统学习 Docker 课程,总结下 Docker 是什么,用来做什么,架构是怎样的。 注:(1)当浏览器 / APP访问服务器时,如果服务器适用的时 http 协议,那么默认端口时80&#…

Learn runqlat in 5 minutes

内容预告 learn X in 5 系列第一篇. 本篇主要介绍进程时延统计方式和 rawtracepoint. runqlat "高负载场景下应用为何卡顿", "进程 A 为什么得不到调度". 当我们在工作生活中产生这样的疑问, 目标进程的调度时延是一个不错的观测切入点. runqlat 可以帮…

CentOs7 NAT模式连接网络

1.配置动态网络 1.1 检查主机网卡配置 检查主机的网络设置 进入控制面板,找到网络共享中心 查看适配器是否都已经开启 1.2 设置虚拟机的网络配置 打开虚拟机网络配置设置,对网卡VMnet8 进行设置 记住网关 全部选择应用,确定 1.3 设置…

数据结构:树的基本概念(二叉树,定义性质,存储结构)

目录 1.树1.基本概念1.空树2.非空树 2.基本术语1.结点之间的关系描述2.结点、树的属性描述3.有序树、无序树4.森林 3.树的常考性质 2.二叉树1.基本概念2.特殊二叉树1.满二叉树2.完全二叉树3.二叉排序树4.平衡二叉树 3.常考性质4.二叉树的存储结构1.顺序存储2.链式存储 1.树 1.…

PyTorch技术和深度学习——三、深度学习快速入门

文章目录 1.线性回归1)介绍2)加载自由泳冠军数据集3)从0开始实现线性回归模型4)使用自动求导训练线性回归模型5)使用优化器训练线性回归模型 2.使用torch.nn模块构建线性回归模型1)使用torch.nn.Linear训练…

文件改名:避免繁琐操作,利用筛选文件批量重命名技巧优化文件管理

在我们的日常生活和工作中,我们经常需要处理大量的文件,从文档、图片到音频和视频等。在这些情况下,一个高效的文件管理策略至关重要。文件重命名的必要性主要体现在两个方面。首先,对于大量文件,手动进行重命名不仅费…

邻接矩阵储存图实现深度优先遍历(C++)

目录 基本要求: 图的结构体: 图的构造: 图的深度优先(DFS): 图的打印输出: 完整代码: 测试数据: 运行结果: 通过给出的图的顶点和边的信息&#xff0c…

Sprint Boot 学习路线 4

微服务 Spring Microservices是一个框架,它使用Spring框架更容易地构建和管理基于微服务的应用程序。微服务是一种架构风格,其中一个大型应用程序被构建为一组小型、独立可部署的服务。每个服务具有明确定义的职责,并通过API与其他服务通信。…

S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)

S7-1200PLC的以太网通信UDP通信相关介绍还可以参考下面文章链接: 博途PLC开放式以太网通信TRCV_C指令应用编程(运动传感器UDP通信)-CSDN博客文章浏览阅读2.8k次。博途PLC开放式以太网通信TSENG_C指令应用,请参看下面的文章链接:博途PLC 1200/1500PLC开放式以太网通信TSEND_…

Flink之Table API SQL连接器

连接器 Table API & SQL连接器1.概述2.支持连接器 DataGen连接器1.概述2.SQL客户端执行3.Table API执行 FileSystem连接器1.创建FileSystem映射表2.创建source数据源表3.写入数据4.解决异常5.查询fileTable6.查看HDFS Kafka连接器1.添加kafka连接器依赖2.重启yarn-session、…

vue.cli 中怎样使用自定义的组件

目录 创建自定义组件 注册并使用自定义组件 全局注册自定义组件 使用 Props 传递数据 总结 前言 在Vue CLI中使用自定义组件是构建交互式和模块化Web应用的重要一环。Vue CLI为开发者提供了使用自定义组件的灵活性和简便性。通过Vue CLI,你可以创建、注册和使…

【算法练习Day45】最长公共子序列不相交的线最大子数组和

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 最长公共子序列不相交的线最…

开发者眼中的向量数据库应用领域

目录 引言向量数据库概念向量数据库优势应用领域亚马逊云科技向量数据库向量数据库的使用步骤最后 引言 随着人工智能和大数据技术的快速发展,越来越多的技术倾向于数据存储方面,数据库领域也随着人工智能和大数据的发展而发展,尤其是向量…

月销破30万辆后,比亚迪整了波大的

最近乘联会公布了 2023 年 10 月新能源乘用车厂商销量榜单。 其中最为亮眼犹如鹤立鸡群的榜首,没错依然是我们熟悉的那个迪子! 单月销量超 30 万辆,相较去年同期暴涨 38.4%,创下了比亚迪有史以来新高。 同时也成为了国内首个月销…

PEFT概述:最先进的参数高效微调技术

了解参数高效微调技术,如LoRA,如何利用有限的计算资源对大型语言模型进行高效适应。 PEFT概述:最先进的参数高效微调技术 什么是PEFT什么是LoRA用例使用PEFT训练LLMs入门PEFT配置4位量化封装基础Transformer模型保存模型加载模型推理 结论 什…

Java学习 9.Java-数组 讲解及习题

一、数组的定义与使用 1.数组的基本概念 1.1 为什么要使用数组 数组是最简单的一种数据结构 组织一组相同类型数据的集合 数据结构本身是来描述和组织数据的 数据加结构 1.2.1 数组的创建 代码实现 new int 可省略; char[] chars{a,b,c};//定义一个整形类型数…

在线免费语音克隆工具,1分钟,复制你的声音

hi,同学们,我是赤辰。玩自媒体这么多年,总结出凡是用自己的声音做短视频,既有识别度,也更容易上热门,但是录制音频的艰难,试过的都知道,市面上也有很多克隆工具,但是基本…

【Git】Git分支与标签掌握这些技巧让你成为合格的码农

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Git》。🎯🎯 &#x1f449…

Qt——连接mysql增删查改(仓库管理极简版)

目录 UI布局设计 .pro文件 mainwindow.h main.cpp UI布局设计 .pro文件 QT core gui QT core gui sql QT sqlgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any …