爬虫解析利器 PyQuery 的使用

@Author: Runsen

每个网页,都有一定的特殊结构和层级关系,而且很多节点都有 id 或 class 作为区分,我们可以借助它们的结构和属性来提取信息。

如果你用惯了xpath和bs4,学习Pyquery是一个不错的选择。

pyquery 是 Python 的第三方库,我们可以借助于 pip3 来安装,安装命令如下:

<code>pip install pyquery /<code>

下面,我以CSDN首页为例。

<code>import requests from pyquery import PyQuery as pq headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" } res = requests.get("https://www.csdn.net/",headers = headers) res.encoding = 'utf-8' doc = pq(res.text) print(doc("title")) print(doc("title").text()) /<code>

输出如下

<code> CSDN-专业IT技术社区 CSDN-专业IT技术社区 /<code>

下面,我需要拿到文章分类的标签。

<code>print(doc(".nav_com ul li").text()) /<code>

输出如下

<code>推荐 动态 程序人生 Python Java 百万人学AI 前端 架构 区块链 数据库 5G 游戏开发 移动开发 运维 安全 云计算/大数据 研发管理 物联网 计算机基础 音视频开发 其他 /<code>

在上面的例子中,我们初始化 pyquery 对象之后,传入 CSS 选择器 .nav_com ul li,它的意思是先选取 class 为 nav_com 的节点,然后再选取其内部 ul ,在选择内部节点的li 节点,最后打印输出。

下面,我们拿文章。查找子节点需要用到 find 方法,传入的参数是 CSS 选择器

<code> for item in doc("#feedlist_id li").items(): print(item.find(".title h2 a").text()) /<code>

输出如下

<code>应聘3万的职位,有必要这么刁难我么。。。沙雕。。。 荐 阿里面试,问了B+树,这个回答让我通过了 14个提高代码质量的好问题 你好,我们可以认识一下吗? 荐 面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从? /<code>

因为每次访问都是不一样的推荐内容,所有输出的文章标题不相同。

提取到节点之后,我们的最终目的当然是提取节点所包含的信息了。比较重要的信息有两类,一是获取属性,二是获取文本。

获取文本就是text()方法,获取属性是attr方法,比如attr('href')

<code>for item in doc("#feedlist_id li").items(): print(item.find(".list_con .title h2 a").attr('href')) /<code>

输出如下

<code> https://blog.csdn.net/likun557/article/details/105608851 /<code>

下面,我用自己的博客来使用pyquery

代码如下

<code>import requests from pyquery import PyQuery as pq headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" } res = requests.get("https://blog.csdn.net/weixin_44510615",headers = headers) res.encoding = 'utf-8' doc = pq(res.text) print(doc("title")) print(doc("title").text()) for item in doc(".article-list div").items(): print(item.find("h4 a").text(),item.find("h4 a").attr('href')) /<code>

输出如下

<code>记录润森奋斗的点点滴滴_润森_CSDN博客-从零学Python数据分析,零基础学习Python的机器学习,零基础学Python爬虫领域博主 记录润森奋斗的点点滴滴_润森_CSDN博客-从零学Python数据分析,零基础学习Python的机器学习,零基础学Python爬虫领域博主 原创 我的回忆录 https://blog.csdn.net/weixin_44510615/article/details/103949794 原创 我 https://blog.csdn.net/weixin_44510615/article/details/90384881 原创 自我感触 https://blog.csdn.net/weixin_44510615/article/details/90302069 原创 什么是人工智能,还有如何学习人工智能,看我这篇的吹水文 https://blog.csdn.net/weixin_44510615/article/details/105620125 /<code>

对于PyQuery可以参考官方文档:https://pyquery.readthedocs.io/en/latest/