Python爬虫Xpath和lxml类库系列之九

Num01–XPath类库知识

1,介绍

XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。

2,XPath 开发工具

  • 开源的XPath表达式编辑工具:XMLQuire(XML格式文件可用)
  • Chrome插件 XPath Helper
  • Firefox插件 XPath Checker

3,常用路径表达式

《Python爬虫Xpath和lxml类库系列之九》 这里写图片描述

4,谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。

《Python爬虫Xpath和lxml类库系列之九》 这里写图片描述

5,选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

《Python爬虫Xpath和lxml类库系列之九》 这里写图片描述

6,选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

《Python爬虫Xpath和lxml类库系列之九》 这里写图片描述

7,XPath的运算符

《Python爬虫Xpath和lxml类库系列之九》 这里写图片描述

《Python爬虫Xpath和lxml类库系列之九》 这里写图片描述

Num02–lxml类库知识

1,介绍

lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。

lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。

需要安装C语言库,可使用 pip 安装:pip install lxml

Num03–爬取贴吧图片案例

from urllib import request, parse
# 导入lxml库的etree类用来处理HTML源文件,注意此处导入的是lxml的3.7.1版本
from lxml import etree


class TiebaSpider(object):
    def __init__(self):
        self.tieba_name = input('请输入要爬取的贴吧的名字:')
        self.begin_page = int(input('请输入要爬取的起始页:'))
        self.end_page = int(input('请输入要爬取的终止页:'))
        self.baseURL = 'https://tieba.baidu.com/f?'
        self.headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)'}

    def tieba_spider(self):
        '''贴吧爬虫调度器,用来构造url'''
        # 组合搜索的关键字
        keyword_name = {'kw': self.tieba_name}
        # 对关键字进行编码,后面加不加encode(’utf-8‘),要尝试才只知道的
        kw_name = parse.urlencode(keyword_name)
        # 组合请求路径
        url = self.baseURL + kw_name
        # 分页处理的爬虫,range()函数是包左不包右
        for page in range(self.begin_page, self.end_page + 1):
            pn_page = (page - 1) * 50
            pn = parse.urlencode({'pn': pn_page})
            # 组合最全的url路径
            fullurl = url + '&' + pn
            html = self.load_request(fullurl)
            self.deal_page(html)

    def load_request(self, url):
        '''发送请求,返回html页面'''
        req = request.Request(url, headers=self.headers)
        try:
            response = request.urlopen(req)
            return response.read()
        except:
            print('亲!下载失败...')

    def deal_page(self, html):
        '''处理贴吧每一页'''
        # 转换为html的dom
        html = etree.HTML(html)
        # 提取每一页里面每条帖子的链接,/p/1234567890,返回一个列表
        link_page = html.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
        for every_page in link_page:
            print('正在处理第%s页' % every_page)
            # 拼接url
            url_page = 'https://tieba.baidu.com' + every_page
            # 发送请求,返回每个帖子的响应文件
            html = self.load_request(url_page)
            self.load_image(html)

    def load_image(self, html):
        '''处理每个帖子的文件,提取图片链接,发送图片请求'''
        html_image = etree.HTML(html)
        link_image = html_image.xpath('//img[@class="BDE_Image"]/@src')
        for every_image in link_image:
            # 发送图片请求链接
            data = self.load_request(every_image)
            self.write_image(data, every_image[-10:])

    def write_image(self, data, param):
        print('正在保存图片%s' % param)
        '''把提取到的图片存放到本地磁盘文件'''
        with open(param, 'wb') as f:
            f.write(data)


if __name__ == '__main__':
    spider = TiebaSpider()
    spider.tieba_spider()

    原文作者:晓可加油
    原文地址: https://www.jianshu.com/p/890394cd002a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞