Python爬蟲Xpath和lxml類庫系列之九

Num01--XPath類庫知識

1,介紹

XPath (XML Path Language) 是一門在 XML 文檔中查找信息的語言,可用來在 XML 文檔中對元素和屬性進行遍歷。

2,XPath 開發(fā)工具

  • 開源的XPath表達式編輯工具:XMLQuire(XML格式文件可用)
  • Chrome插件 XPath Helper
  • Firefox插件 XPath Checker

3,常用路徑表達式

這里寫圖片描述

4,謂語(Predicates)

謂語用來查找某個特定的節(jié)點或者包含某個指定的值的節(jié)點,被嵌在方括號中。

這里寫圖片描述

5,選取未知節(jié)點

XPath 通配符可用來選取未知的 XML 元素。

這里寫圖片描述

6,選取若干路徑

通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。

這里寫圖片描述

7,XPath的運算符

這里寫圖片描述

這里寫圖片描述

Num02--lxml類庫知識

1,介紹

lxml 是 一個HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 數(shù)據(jù)。

lxml和正則一樣,也是用 C 實現(xiàn)的,是一款高性能的 Python HTML/XML 解析器,我們可以利用之前學(xué)習(xí)的XPath語法,來快速的定位特定元素以及節(jié)點信息。

需要安裝C語言庫,可使用 pip 安裝:pip install lxml

Num03--爬取貼吧圖片案例

from urllib import request, parse
# 導(dǎo)入lxml庫的etree類用來處理HTML源文件,注意此處導(dǎo)入的是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):
        '''貼吧爬蟲調(diào)度器,用來構(gòu)造url'''
        # 組合搜索的關(guān)鍵字
        keyword_name = {'kw': self.tieba_name}
        # 對關(guān)鍵字進行編碼,后面加不加encode(’utf-8‘),要嘗試才只知道的
        kw_name = parse.urlencode(keyword_name)
        # 組合請求路徑
        url = self.baseURL + kw_name
        # 分頁處理的爬蟲,range()函數(shù)是包左不包右
        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):
        '''發(fā)送請求,返回html頁面'''
        req = request.Request(url, headers=self.headers)
        try:
            response = request.urlopen(req)
            return response.read()
        except:
            print('親!下載失敗...')

    def deal_page(self, html):
        '''處理貼吧每一頁'''
        # 轉(zhuǎn)換為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
            # 發(fā)送請求,返回每個帖子的響應(yīng)文件
            html = self.load_request(url_page)
            self.load_image(html)

    def load_image(self, html):
        '''處理每個帖子的文件,提取圖片鏈接,發(fā)送圖片請求'''
        html_image = etree.HTML(html)
        link_image = html_image.xpath('//img[@class="BDE_Image"]/@src')
        for every_image in link_image:
            # 發(fā)送圖片請求鏈接
            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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容