老早以前写过一个用python的request包的爬虫文章,那里面我使用正则表达式去对信息进行筛选,今天我们来学习一种更简便的解析数据、筛选信息的方法,利用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)是基本值或者节点。
基本语法:
实例:
node
/node
node/bit
//node
node//bit
//@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的常见运算符
如果 price 是 9.90,则返回 false。
如果 price 是 9.80,则返回 false。
如果 price 是 9.90,则返回 false。
如果 price 是 9.90,则返回 false。
如果 price 是 9.80,则返回 false。
如果 price 是 9.70,则返回 false。
如果 price 是 9.50,则返回 false。
如果 price 是 8.50,则返回 false。
感谢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
商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢