爬蟲必備技能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技能

相關文章
相關標籤/搜索