博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬虫必备技能xpath的用法和实战
阅读量:6589 次
发布时间:2019-06-24

本文共 3876 字,大约阅读时间需要 12 分钟。

环境配置

1.本文使用的python版本是python3

2.使用到的依赖包如下:

requests

scrapy

在安装 scrapy 之前需要先安装 (点击下载) 下载符合自己版本的 Twisted,然后将其放入 python 安装目录中,先使用命令安装 pip install Twisted。安装完之后,scrapy 就很容易安装了,安装命令如下: pip install scrapy

本文要点

1.xpath 基本语法和用法示例

2.使用 xpath 爬取《盗墓笔记》实例

xpath 基本语法

xpath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。

xpath 的选择功能十分强大,它提供了非常简洁明了的路径选择表达式,几乎所有我们想要定位的节点都可以用 xpath 来选择。首先我们来看下 xpath 的基本语法。

在这里列出了xpath的常用匹配规则,例如 / 代表选取直接子节点,// 代表选择所有子孙节点,. 代表选取当前节点,.. 代表选取当前节点的父节点,@ 则是加了属性的限定,选取匹配属性的特定节点。

xpath 用法举例

接下来我们以豆瓣电影为例子,来熟悉一下 xpath 基本用法:

豆瓣电影top250
首先需要找到我们所匹配的内容在
html 中的位置。
从图片中可以看到排名第一的电影标题是在标签为
div,class 属性为
*hd中的
a 标签中所有的
span 标签里面!
然后我们需要一级一级往上面找,因为这个层级太深了,有时候会匹配不到我们所需要的内容。
我们最开始匹配的标签要满足它的所有特征加起来是唯一的。
很容易看到属性为
article 正是我们所需要的标签!因为找不到第二个
div 标签且
class 属性为
article 的标签!
获取电影标题语法如下,因为是文本内容,所以要用
text()

html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a//span[1]/text()") 复制代码

同理,我们获取电影详情链接的语法,因为是属性,所以要用 @属性值

html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a/@href") 复制代码

我们可以将其加入到爬虫代码中,效果如下:

豆瓣电影爬虫

使用 xpath 爬取盗墓笔记

目标地址:

总体思路:

1.分析网页结构,取出我们需要的标题,以及下一步需要用到的链接

2.根据章节的链接地址,再爬取出章节小说

首先分析我们需要爬取的内容,在网页中的位置。

经过上面的讲解,相信大家很容易就可以写出 xpath 的语法。因为我们是要爬取所有小说内容,所以我们要循环所有 li 标签里面的内容!

html.xpath(".//div[@class='box']/ul//li") 复制代码

遍历这个列表,取出我们所需要的章节,详细链接

li_list = selector.xpath(".//div[@class='box']/ul//li")     for text in li_list:         title = text.xpath("./a/text()").extract_first('')         href = text.xpath('./a/@href').extract_first('') 复制代码

接下来,从详情链接中取出小说内容,即完成了这个小爬虫!

p_list = selector.xpath(".//div[@class='content-body']//p")     for data in p_list:         content += data.xpath("./text()").extract_first('') 复制代码

最重要的分析部分完成了,接下来主要就是将所有的内容放入代码中,然后保存到本地就完成了。

最终爬虫代码如下:

# coding: utf-8 from scrapy import Selector import requests class KeyEnum(object):     TITLE = "title"     CONTENT = "content"     HREF = "href" class NovelSpider(KeyEnum):     def __init__(self):         self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "                           "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"         }     def spider(self):         url = 'http://seputu.com/'         response = requests.get(url, headers=self.headers)         selector = Selector(text=response.content)         data_list = []         li_list = selector.xpath(".//div[@class='box']/ul//li")  # 章节列表         for text in li_list:             title = text.xpath("./a/text()").extract_first('')  # 标题             href = text.xpath('./a/@href').extract_first('')  # 链接             content = self._content_spider(href)  # 详情页面爬虫             data_list.append(                 {
                    KeyEnum.HREF: href,                     KeyEnum.TITLE: title,                     KeyEnum.CONTENT: content,                 }             )         return data_list     def _content_spider(self, url):         content = ''         for _ in range(5):  # 因为没用代理,如果失败,再重试5次             if url:  # 加个url是否为空的判断                 response = requests.get(url, headers=self.headers)                 if response.status_code != 200:                     continue                 selector = Selector(text=response.content)                 p_list = selector.xpath(".//div[@class='content-body']//p")                 for data in p_list:                     content += data.xpath("./text()").extract_first('')             return content     def main(self):         data_list = self.spider()         for i in data_list:             with open('盗墓笔记.txt', 'a', encoding='utf-8')as f:                 f.write(i['content']) if __name__ == '__main__':     spider = NovelSpider()     spider.main() 复制代码

总结

本文主要介绍了 python 中解析库 xpath 的使用方法和示例,用法其实很简单,关键在于多多练习!下篇文章打算分享另一个解析库 css 的用法,以及和 xpath 之间的区别,欢迎关注!


如果觉得不错或对你有帮助,请分享给更多人

关注[Python编程与实战]

从零开始学Python,提升Python技能


转载于:https://juejin.im/post/5c851aa45188257afe2d72f1

你可能感兴趣的文章
PowerShell中单引号和双引号的区别
查看>>
【ARM】gpio·arm体系结构之gpio
查看>>
数据库启动时遇到ORA-01578错误
查看>>
Fedora 12 (Constantine)Beta版及Alpha镜像下载
查看>>
稳扎稳打Silverlight(3) - 2.0控件之Border, Button, Calendar, Canvas, CheckBox, ComboBox
查看>>
Who's Using Cyberthreat Intelligence and How?
查看>>
【翻译】SQL Server索引进阶:第六级,标签
查看>>
确定两串乱序同构
查看>>
寒假研究计划
查看>>
Android:ListView、BaseAdapter、convertView、ListView优化及事件、notifyDataSetChanged()
查看>>
新版发布功能上线,新增「大屏快照」功能!
查看>>
代码调优及其他zz
查看>>
Centos7+Postfix+Dovecot实现邮件收发
查看>>
“蒜你狠”和“豆你玩”的遐想。。
查看>>
无法解析连接描述中指定的SID
查看>>
ext3格式化成ext4
查看>>
自己编译redhat 9.0内核心得
查看>>
SQL Server数据库的管理及维护
查看>>
Silverlight在MSDN类库中的小变化
查看>>
再说java多线程Thread
查看>>