美文网首页🕸python虫虫
爬虫必备技能 xpath 用法和实战

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

作者: GoPython | 来源:发表于2019-07-18 09:53 被阅读17次

    环境配置

    python3
    requests
    scrapy

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

    image

    本文要点

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

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

    xpath 基本语法

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

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

    image image

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

    xpath 用法举例

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

    打开网页 https://movie.douban.com/top250

    image

    豆瓣电影 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.根据章节的链接地址,再爬取出章节小说

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

    image

    经过上面的讲解,相信大家很容易就可以写出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('')
    

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

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

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

    image

    最终爬虫代码如下:

    # 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 之间的区别,欢迎关注!

    相关文章

      网友评论

        本文标题:爬虫必备技能 xpath 用法和实战

        本文链接:https://www.haomeiwen.com/subject/inrklctx.html