推广 热搜: 公司  快速  上海  中国  企业    未来  政策  系统  公司2 

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

   日期:2024-12-16     作者:i6grpo    caijiyuan   评论:0    移动:http://www78564.xrbh.cn/mobile/news/30346.html
核心提示:老早以前写过一个用python的request包的爬虫文章,那里面我使用正则表达式去对信息进行筛选,今天我们来学习一种更

老早以前写过一个用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

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

本文地址:http://www78564.xrbh.cn/news/30346.html    迅博思语 http://www78564.xrbh.cn/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新资讯
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新资讯
点击排行
网站首页  |  二维码  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  粤ICP备2023022329号