爬蟲必備技能之網頁解析庫:xpath用法和實戰

環境配置

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

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

requests
scrapypython

在安裝 scrapy 以前須要先安裝 Twisted 地址:  https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted。下載符合本身版本的 Twisted,而後將其放入 python 安裝目錄中,先使用命令安裝 pip install Twisted。安裝完以後,scrapy 就很容易安裝了,安裝命令以下: pip install scrapy
編程

本文要點

1.xpath 基本語法和用法示例微信

2.使用 xpath 爬取《盜墓筆記》實例app

xpath 基本語法

xpath,全稱 XML Path Language,即 XML 路徑語言,它是一門在 XML 文檔中查找信息的語言。
xpath 的選擇功能十分強大,它提供了很是簡潔明瞭的路徑選擇表達式,幾乎全部咱們想要定位的節點均可以用 xpath 來選擇。首先咱們來看下 xpath 的基本語法。
scrapy


在這裏列出了xpath的經常使用匹配規則,例如 / 表明選取直接子節點,// 表明選擇全部子孫節點,. 表明選取當前節點,.. 表明選取當前節點的父節點,@ 則是加了屬性的限定,選取匹配屬性的特定節點。ide

xpath 用法舉例

接下來咱們以豆瓣電影爲例子,來熟悉一下 xpath 基本用法:
打開網頁 https://movie.douban.com/top250
url

豆瓣電影top250

首先須要找到咱們所匹配的內容在 html 中的位置。
從圖片中能夠看到排名第一的電影標題是在標籤爲 div,class 屬性爲 *hd中的 a 標籤中全部的 span 標籤裏面!
而後咱們須要一級一級往上面找,由於這個層級太深了,有時候會匹配不到咱們所須要的內容。
咱們最開始匹配的標籤要知足它的全部特徵加起來是惟一的。
很容易看到屬性爲 article 正是咱們所須要的標籤!由於找不到第二個 div 標籤且 class 屬性爲 article 的標籤!
由於是文本內容,因此要用  text(),獲取電影標題語法以下 : 

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

同理,咱們獲取電影詳情連接的語法,由於是屬性,因此要用 @屬性值spa

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

咱們能夠將其加入到爬蟲代碼中,效果以下:

豆瓣電影爬蟲

使用 xpath 爬取盜墓筆記

目標地址:
盜墓筆記全篇 http://seputu.com/

整體思路:

1.分析網頁結構,取出咱們須要的標題,以及下一步須要用到的連接

2.根據章節的連接地址,再爬取出章節小說

首先分析咱們須要爬取的內容,在網頁中的位置。

通過上面的講解,相信你們很容易就能夠寫出 xpath 的語法。由於咱們是要爬取全部小說內容,因此咱們要循環全部 li 標籤裏面的內容!

1html.xpath(".//div[@class='box']/ul//li")

遍歷這個列表,取出咱們所須要的章節,詳細連接

1li_list = selector.xpath(".//div[@class='box']/ul//li")
2    for text in li_list:
3        title = text.xpath("./a/text()").extract_first('')
4        href = text.xpath('./a/@href').extract_first('')

接下來,從詳情連接中取出小說內容,即完成了這個小爬蟲!

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

最重要的分析部分完成了,接下來主要就是將全部的內容放入代碼中,而後保存到本地就完成了。


最終爬蟲代碼以下:

 1# coding: utf-8
2from scrapy import Selector
3import requests
4
5
6class KeyEnum(object):
7    TITLE = "title"
8    CONTENT = "content"
9    HREF = "href"
10
11
12class NovelSpider(KeyEnum):
13
14    def __init__(self):
15        self.headers = {
16            "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
17                          "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
18        }
19
20    def spider(self):
21        url = 'http://seputu.com/'
22        response = requests.get(url, headers=self.headers)
23        selector = Selector(text=response.content)
24        data_list = []
25        li_list = selector.xpath(".//div[@class='box']/ul//li")  # 章節列表
26        for text in li_list:
27            title = text.xpath("./a/text()").extract_first('')  # 標題
28            href = text.xpath('./a/@href').extract_first('')  # 連接
29            content = self._content_spider(href)  # 詳情頁面爬蟲
30            data_list.append(
31                {
32                    KeyEnum.HREF: href,
33                    KeyEnum.TITLE: title,
34                    KeyEnum.CONTENT: content,
35                }
36            )
37
38        return data_list
39
40    def _content_spider(self, url):
41        content = ''
42
43        for _ in range(5):  # 由於沒用代理,若是失敗,再重試5次
44            if url:  # 加個url是否爲空的判斷
45                response = requests.get(url, headers=self.headers)
46                if response.status_code != 200:
47                    continue
48                selector = Selector(text=response.content)
49
50                p_list = selector.xpath(".//div[@class='content-body']//p")
51                for data in p_list:
52                    content += data.xpath("./text()").extract_first('')
53
54            return content
55
56    def main(self):
57        data_list = self.spider()
58        for i in data_list:
59            with open('盜墓筆記.txt''a', encoding='utf-8')as f:
60                f.write(i['content'])
61
62
63if __name__ == '__main__':
64    spider = NovelSpider()
65    spider.main()

總結

本文主要介紹了 python 中解析庫 xpath 的使用方法和示例,用法其實很簡單,關鍵在於多多練習!下篇文章打算分享另外一個解析庫 css 的用法,以及和 xpath 之間的區別,歡迎關注!


若是以爲不錯或對你有幫助,請分享給更多人

關注[Python編程與實戰]

從零開始學Python,提高Python技能



本文分享自微信公衆號 - Python編程與實戰(GoPy1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索