业界动态
Python爬虫进阶——Xpath解析数据 并 爬取一个IP池
2024-12-16 15:21

老早以前写过一个用python的request包的爬虫文章,那里面我使用正则表达式去对信息进行筛选,今天我们来学习一种更简便的解析数据、筛选信息的方法,利用Xpath,并且了解了基本语法后,我们来爬取一个IP池。

Python爬虫进阶——Xpath解析数据 并 爬取一个IP池

 

 

 

 

 


XPath,全称 XML Path Language,即 XML 路径语言,它是一门在XML文档中查找信息的语言。XPath 最初设计是用来搜寻XML文档的,但是它同样适用于 HTML 文档的搜索。它也是是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。

 

一些术语(可以参考XML的知识方便理解

1. 在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

2. 基本值(或称原子值,Atomic value)是无父或无子的节点。

3. 项目(Item)是基本值或者节点。

 

 

基本语法

表达式描述nodename选择这个节点名的所有子节点/从当前节点选择直接子节点//从当前节点选取子孙节点.选择当前节点…选取当前节点的父节点@选取属性

 

实例

表达式结果

node

选取 node元素的所有子节点。

/node

选取根元素 node。假如路径起始于 / ,则此路径始终代表到某元素的绝对路径,就像Linux里的路径规则。

node/bit

选取属于 node 的子元素的所有 bit 元素。

//node

选取所有 node 子元素,而不管它们在文档中的位置。

node//bit

选择属于 node 元素的后代的所有 bit 元素,而不管它们位于 node 之下的什么位置。

//@lang

选取名为 lang 的所有属性。

 

谓语(Predicates

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

表达式结果

/bookstore/book[1]

选取属于 bookstore 子元素的第一个 book 元素。

/bookstore/book[last()]

选取属于 bookstore 子元素的最后一个 book 元素。

/bookstore/book[last()-1]

选取属于 bookstore 子元素的倒数第二个 book 元素。

/bookstore/book[position()<3]

选取最前面的两个属于 bookstore 元素的子元素的 book 元素。

//title[@lang]

选取所有拥有名为 lang 的属性的 title 元素。

//title[@lang=’eng’]

选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。

/bookstore/book[price>35.00]

选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。

/bookstore/book[price>35.00]/title

选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

这里感谢这位兄台总结的表——https://cuiqingcai.com/2621.html

 

 


首先我们在Pycharm的终端运行命令来安装lxml,这里为了学习Xpath先安装lxml

 

我们可以先来简单的小试牛刀

 

输出

 

注解

上面的 etree.HTML() 是将字符串解析为html文档并对HTML文本进行自动修正。

而后面的 etree.tostring() 输出修正后的结果,类型是bytes。

另外上面的道理读取html文件也是可以的

 
 
 

如果想要获得所有tbody的节点,只要修改上面的xpath即可

 
 

还是在上面程序的基础上进行修改,修改xpath里的匹配规则

比如我想要获得tbody节点下的tr的直接子节点

 

如果是所有子孙的tr节点

 
 

结合上面说的,加一个谓语即可

 

如上所示,获取所有 li节点 且要求具有属性 class=”item-0″

 

利用 .. 即可往上翻一层

例如获取tr的父节点

 

也可以用 节点轴——parent::* 来获取父节点

 
 

其实更常用的操作还是获取文本信息

我们用 XPath 中的 text() 方法可以获取节点中的文本

例如上面的html文件中,有两个td节点,里面分别有一些字符串,我们现在来获取他们

 
 

另外,有的时候我们可以直接用 // 加 text() 的方式获取,这样可以爬到最全面的文本信息,但是可能会夹杂一些换行符等特殊字符。所以还是定位的越细致越好。

 

获取li节点的属性

 
 
 

例如上面的html文件中有这样的一句

 

我们要经过 li 节点去获取内部的 first item 文本

这时就可以用到 contains() 函数了

 

这样只要li节点还有属性 class,且属性有值sp即可被匹配

 

当一个节点有多个属性

 

利用Xpath的运算符即可

 

下面是Xpath的常见运算符

运算符描述实例返回值|计算两个节点集//book | //cd返回所有拥有 book 和 cd 元素的节点集+加法6 + 410–减法6 – 42*乘法6 * 424div除法8 div 42=等于price=9.80如果 price 是 9.80,则返回 true。

 

如果 price 是 9.90,则返回 false。

!=不等于price!=9.80如果 price 是 9.90,则返回 true。

 

如果 price 是 9.80,则返回 false。

<小于price<9.80如果 price 是 9.00,则返回 true。

 

如果 price 是 9.90,则返回 false。

<=小于或等于price<=9.80如果 price 是 9.00,则返回 true。

 

如果 price 是 9.90,则返回 false。

>大于price>9.80如果 price 是 9.90,则返回 true。

 

如果 price 是 9.80,则返回 false。

>=大于或等于price>=9.80如果 price 是 9.90,则返回 true。

 

如果 price 是 9.70,则返回 false。

or或price=9.80 or price=9.70如果 price 是 9.80,则返回 true。

 

如果 price 是 9.50,则返回 false。

and与price>9.00 and price<9.90如果 price 是 9.80,则返回 true。

 

如果 price 是 8.50,则返回 false。

mod计算除法的余数5 mod 21

感谢w3school运算符

 


基本语法就先记录到这里了,感谢这位CSDN的带翅膀的猫

另外这个谷歌插件也是很不错——XPath Helper
按住shift选择我们需要的内容,自动生成匹配规则

或者更简单的,在审查元素里找到你要的资源右击,选择Copy,就可以直接copy这个节点的xpath

 


下面的例子仅供参考

我们找到一个免费ip代理网站,这个其实还蛮好找的

我们先来确定网页是静态网页还是动态:如果是静态,那网页源代码里的数据就是呈现给你的数据,即网页的任何数据都是在源代码中可以找到的,它的url地址对应的就是导航栏中的地址。

我们这个网站是个静态网站,好,我直接把url记录到python代码中

在网页中我们在审查元素的network里(刷新一下)得到UA头,来伪造我们的爬虫是浏览器

 

接下来我们使用requests模块的get去发送请求

 

一般没问题的就会发现它成功把网页源代码打印了出来

,现在咱们就要利用Xpath去解析数据,把需要的数据筛出来,首先我们先安装parsel库

 or 

然后在代码中导入

 

对于该网站的html中,我们需要的数据就是 IP、IP端口、协议类型 ,这三个字段

最后我们要弄成这样{“协议类型”:”IP:IP端口”}

每一个IP信息在审查元素中都是这样

,利用这样的Xpath即可得到每个tr标签内的信息

 

此时,parse_list就是一个列表,我们再用for循环遍历,将每一个代理IP作为一个字典存到一个集合中

 

好了,这一页的代理IP就全被我们采集了

 

那要采集多页呢?我们调动数据之后发现不同的页的区别其实就是在URL中的最后数字的变化,好,我们再做个大循环,将刚才的数据做到循环里面

 

最后输出

 

,接下来我们来对 proxies_list 进行筛选高质量的IP

再定义一个方法

 

最后全部的代码如下

 
 

 

不错吧,一共60个IP,56个质量不错

爬取到的数据可以存放到数据库中,例如MongoDB数据库(非关系型数据库,无需建字段

好了,IP池就搭建完成

 


 

 

 

 

博客:is-hash.com

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

    以上就是本篇文章【Python爬虫进阶——Xpath解析数据 并 爬取一个IP池】的全部内容了,欢迎阅览 ! 文章地址:http://www78564.xrbh.cn/news/30346.html 
     文章      相关文章      动态      同类文章      热门文章      栏目首页      网站地图      返回首页 迅博思语移动站 http://www78564.xrbh.cn/mobile/ , 查看更多   
最新文章
今天有好东西,大折扣!
仰仰铺子·好物盘点这一期好物盘点,千万别错过!都是好宝贝,超低价,就连我们好久没有福利活动的丝蓓缇黑姜分解酵母也弄到了特
SEO推广排名的奥秘,全面解析实现路径与战略意义
SEO推广排名是指通过搜索引擎优化技术提高网站在搜索引擎结果页面(SERP)中的排名。实现SEO排名需要优化网站内容、结构、技术等
【图】领克05欢迎莅临赏鉴 价格直降1.1万 详询:4009728340
购好车来领福新年享9重好礼【试驾礼】进店试乘试驾均享受精美礼品一份【大客户】指定企业员工购车享3000元补贴。【置换礼】至高
快步剪辑师(快剪辑教学)
摘要:快步剪辑师,快剪辑教学课程,场课为您整理出关于快步剪辑师的相关在线教程知识,欢迎访问了解快步剪辑师(快剪辑教学)的
推动手机能效标准化:从用户呼声看行业未来
近年来,智能设备的普及让我们越来越依赖手机,而手机的能效问题逐渐引起了用户的关注。近期,有用户提出建议,希望将手机能效列
GPT-4 接入 Office 全家桶:Word 一键变成 PPT,打工人的春天来了!
作者 | 屠敏出品 | CSDN(ID:CSDNnews)这一周的科技圈异常地热闹,且多数都是大模型给的:周二
双十二荣耀手机别乱买!这三款物美价廉,性价比几乎“零差评”
每年到了双十二,买手机这件事就像一场“技术与钱包的拔河赛”。想选性价比高的,又怕踩雷;想要配置好的,又担心被钱包发出“哀
分析Android 搜狗输入法在微信和QQ中发送图片和表情
好记性不如烂笔头。生活中多做笔记,不仅可以方便自己,还可以方便他人。有没有发现,有时候表情或图片的交流更能让气氛更愉悦。
企业SEO用什么程序:提升搜索引擎排名的必备工具与策略
在当今数字化时代,企业的在线存在变得日益重要。为了在激烈的市场竞争中取得优势,企业必须充分利用搜索引擎优化(SEO)技术。
Python 到底能干嘛?—次学会Python所有开发技能_学python能干嘛,需要全学吗 (2)
最后 Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多ÿ