爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网
前言
上篇文章 PyQuery (一) 回顾。今天来介绍具体 PyQuery 的使用方法。
穷游网目标与分析
开始之前,按照之前的套路一步步来。
一、先确立目标。
我们要爬取的目标是:
- 日本的城市
- 去过的人数
- 城市的详情景点
二、看源码,分析元素节点。
F12 查看当前网页源代码:
选中下图区域,可以看到这是一个 ul 标签,class 为 plcCitylist 。
- ul:unordered list,“无序列表”的意思。
class 为 plcCitylist ,全局检索一下,ul 标签的 class 值唯一:
在这个无序标签里,有许多 li 标签,class 为 item+数字。
- li:list item,“列表项”的意思。
继续分析。
有了上面两个基础结构,来看下其中要提取的详细信息,下图:
城市名字:包含在 a 标签中。
去过的人数:包含在 h3 标签中,且在 p 标签中,class 为 beenton 中。
详情景点:包含在 h3 标签中,且在 p 标签中,class 为 pois 中,且在 a 标签中。
- h3:给文本增加主标题的语义。(显示在页面上标题变粗)
- p:段落标签
以上分析完了,其实单纯分析节点很简单。重点在于代码如何使用。
PyQuery代码详讲
依然是分步骤来提取我们想要的。
回忆一下,用 PyQuery 请求到源代码,拿到实例对象。
**1. css选择器,提取外层 ul **
基于 css 选择器,获取 class=“plcCitylist” 的 ul 节点元素。因为 class 值唯一,上面说过了。
在 JQuery 的语法中, . 代表着类选择器的写法,而 # 代表着 id 选择器的写法。所以直接用 .值 ,直接可以获取当前标签元素节点,如下:
当然,如果当标签不唯一时,你也可以这样操作,在.前面声明具体标签:
2. 提取 ul 里层 li 节点元素
根据 ul_city 得到的节点变量,用括号加子标签的形式即可获取。
但需要注意的是,尽管我们 print 打印是你看到的文字,它们实际上并不是 str 类型的字符串,而是 PyQuery 这个类型。
3. 遍历单独的 li 元素节点
当我们获取 ul 下面的 li 元素节点时,匹配到的肯定是多个。此时想要逐个解析 li ,并且获取到 li 中的城市名称等抓取信息如何做呢?
通过调用 PyQuery 对象的 items 方法,即可逐层遍历相同元素,就像我们的 list 一样。
4. 标签多个 class 确定唯一值的选择器写法
仔细看我们 li 节点中的 h3 标签,class 里面是有两个值的。
通过这两个值的唯一性,我们可以直接定位到 h3 元素。
5. PyQuery 属性选择节点
如果你用不惯以上的所有获取节点元素的方法, PyQuery 还提供了一个便利的方法,即通过标签元素的属性进行定位元素。
h3(‘a’) 获取的是 h3 标签里 a 标签的元素节点。
使用 .attr 时,后面两个参数说明 a 标签原本的属性由如下组成:
attr 第一个参数是标签属性的名字,第二个参数则是属性具体的值。
6. PyQuery 节点元素提取文本内容
以上内容操作的都是标签元素的节点,而非本文内容,想要提取文本内容,则调用 xx.text() 方法,节点转为字符串。
成果展示
最终的成果展示如下:
写入 Excel 之后,可以看到第二行的数据都在一行,不方便美观,即使我代码中做了换行的操作。
所以程序跑完后,需要手动操作下 Excel ,让换行符生效,如下操作:
选中一列,然后数据 -> 分列:
选成文本,完成即可,自己就换行显示了。
获取到的信息写入 Excel 中。比如你想去哪个国家游玩,自己查攻略,通过这种方式来解决信息的整理,也是一种不错的高效方法。
总结
以上提到的 6 点,便是 PyQuery 常用到的基础方法。如果还有想了解具体详情的小伙伴,可以自行去官网查阅具体使用技巧。
实战中进步,学完 PyQuery 的用法,是否觉得学会了一个高效的解析节点的方法库呢?
关于本篇文章的全部源代码,去除空行约 50 行,非常简短,已经上传到 github 了。
有想学习的朋友,可以后台回复 “穷游” 二字,即可获取源码地址。