爬虫必备技能xpath的用法和实战

环境配置

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

2.使用到的依赖包以下:html

requests
scrapypython

在安装 scrapy 以前须要先安装 Twisted(点击下载) 下载符合本身版本的 Twisted,而后将其放入 python 安装目录中,先使用命令安装 pip install Twisted。安装完以后,scrapy 就很容易安装了,安装命令以下: pip install scrapy
编程

本文要点

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

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

xpath 基本语法

xpath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。
xpath 的选择功能十分强大,它提供了很是简洁明了的路径选择表达式,几乎全部咱们想要定位的节点均可以用 xpath 来选择。首先咱们来看下 xpath 的基本语法。
ide


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

xpath 用法举例

接下来咱们以豆瓣电影为例子,来熟悉一下 xpath 基本用法:
打开网页 https://movie.douban.com/top250
spa

豆瓣电影top250
豆瓣电影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 爬取盗墓笔记

目标地址:
盗墓笔记全篇 http://seputu.com/

整体思路:

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技能

相关文章
相关标签/搜索