選擇技術(shù)

Selection Techniques


選擇技術(shù)是web抓取最重要的方面之一。當(dāng)您點(diǎn)擊web瀏覽器中的內(nèi)容來創(chuàng)建內(nèi)容和模板時(shí),您將使用最基本的選擇技術(shù),這是簡(jiǎn)單的point and click。除了簡(jiǎn)單的point and click功能外,Visual Web Ripper還提供了一系列工具來幫助你做出完美的選擇。這些工具包括:

  • 允許您操作選擇XPath的XPath編輯器
  • 樹形視圖瀏覽器提供了一個(gè)不同的,更精確的網(wǎng)頁視圖
  • 列表選項(xiàng),幫助您創(chuàng)建選擇元素列表的選項(xiàng)
  • 幫助您將條件應(yīng)用到選擇XPath的過濾器

很重要的一點(diǎn)是,當(dāng)您在Web瀏覽器中選擇HTML元素時(shí),Visual Web Ripper無法讀懂您的思路。新手用戶常常會(huì)在一些情況下感到困惑,比如當(dāng)他們有一個(gè)搜索結(jié)果時(shí),每個(gè)條目都有一個(gè)標(biāo)題。有時(shí)標(biāo)題是鏈接,有時(shí)是純文本,所以標(biāo)題的HTML可能是這樣的:

<h1><a >Heading as a link</a></h1>
<h1><span>Heading as plain text</span></h1>

如果您想要提取所有標(biāo)題的文本,您可以選擇第一個(gè)標(biāo)題,并通過重復(fù)選擇創(chuàng)建一個(gè)列表模板。如果第一個(gè)標(biāo)題是鏈接,那么這樣的選擇只會(huì)選擇鏈接的標(biāo)題,而不是純文本的標(biāo)題。Visual Web Ripper 不知道你想要提取所有的標(biāo)題,但是認(rèn)為你在嘗試選擇鏈接。在本例中,您需要更改選擇,以便在創(chuàng)建列表之前選擇“標(biāo)記”而不是鏈接標(biāo)記。

選擇XPath


每次單擊web瀏覽器中的內(nèi)容時(shí),Visual Web Ripper 就會(huì)在幕后進(jìn)行一些高級(jí)處理,以計(jì)算選擇XPath。XPath是一種常用的語法,用于在類似于xml的文檔中選擇元素,比如HTML文檔。Visual Web Ripper 使用了XPath的定制實(shí)現(xiàn),它支持XPath v1.0語法。定制的Visual Web Ripper XPath版本還支持一系列特別設(shè)計(jì)的新方法來簡(jiǎn)化Web抓取。

選擇XPath可以選擇一個(gè)或多個(gè)HTML元素。通常,創(chuàng)建list模板使用一個(gè)選擇多個(gè)元素的XPath。

Visual Web Ripper 有一系列工具可以幫助您創(chuàng)建一個(gè)完美的XPath,而不需要了解XPath語法。但是,在某些情況下,您可能需要手動(dòng)調(diào)整XPath,因此,如果您想成為一個(gè)專業(yè)的web采集機(jī),您必須知道XPath語法。

每次在web瀏覽器中進(jìn)行選擇時(shí),您都可以在Options選項(xiàng)卡中查看選擇XPath。

xPath

上面的圖像中的XPath包含以下兩個(gè)步驟:

  1. 使用ID屬性值listView選擇頁面上的所有DIV標(biāo)簽
  2. 然后選擇帶有class屬性值hproduct的所有子DIV標(biāo)簽

Visual Web Ripper 支持自定義XPath函數(shù)。請(qǐng)參閱自定義XPath函數(shù)獲得更多信息。

Visual Web Ripper 支持以下非標(biāo)準(zhǔn)XPath方法、屬性和axis。

非標(biāo)準(zhǔn)的XPath方法 Non-standard XPath Methods
Position 這是標(biāo)準(zhǔn)位置方法的一個(gè)擴(kuò)展。
Position() - 類似于標(biāo)準(zhǔn)Postion XPath方法。
Position(StartIndex) - 選擇除第一個(gè)StartIndex節(jié)點(diǎn)之外的所有節(jié)點(diǎn)。
Position(StartIndex, EndIndex) - 選擇StartIndexEndIndex之間的所有節(jié)點(diǎn)。
Position(StartIndex, EndIndex, SkipLastIndex) - 選擇StartIndexEndIndex-SkipLastIndex之間的所有節(jié)點(diǎn)。如果EndIndex為0,那么簡(jiǎn)單地跳過最后一個(gè)SkipLastIndex節(jié)點(diǎn)。
Example:
//table/tr/[position(2,0,1)]
Count 返回給定XPath的節(jié)點(diǎn)數(shù)量。
Count(XPath)
Example:
//table/tr/[count(td)=2]
Span 在選擇中包含許多兄弟節(jié)點(diǎn)。
Span(Count) -在選擇中包括計(jì)數(shù)Count的兄弟節(jié)點(diǎn)。
Span(UntilElementXPath) - 包括所有的兄弟節(jié)點(diǎn),直到遇到UntilElementXPath指定的元素為止。
Example://div/p[span('hr')]
非標(biāo)準(zhǔn)XPath屬性 Non-standard XPath Attributes
node-position 返回當(dāng)前節(jié)點(diǎn)在其父節(jié)點(diǎn)中的位置。
root-node-position 返回其父節(jié)點(diǎn)中的根節(jié)點(diǎn)的位置。這只適用于PageArea模板選擇,因?yàn)橐粋€(gè)PageArea的根節(jié)點(diǎn)不是文檔的根節(jié)點(diǎn)。如果PageArea tempate是一個(gè)列表模板,那么根節(jié)點(diǎn)就是當(dāng)前的PageArea列表元素的節(jié)點(diǎn)。
tag-text 返回當(dāng)前節(jié)點(diǎn)的文本,不包括任何子節(jié)點(diǎn)的文本。
非標(biāo)準(zhǔn)XPath Axis Non-standard XPath Axis
Root 一個(gè)PageArea模板選擇的根節(jié)點(diǎn)。如果PageArea tempate是一個(gè)列表模板,那么根節(jié)點(diǎn)就是當(dāng)前的PageArea列表元素的節(jié)點(diǎn)。

優(yōu)化選擇XPath / Optimizing the Selection XPath


如果目標(biāo)頁面的變化稍微有些變化,那么長(zhǎng)的XPath不太可能很好地工作。XPath中的每一步都必須匹配頁面上的HTML標(biāo)記。如果這些標(biāo)記中的任何一個(gè)被刪除或移到網(wǎng)頁的其他地方,XPath將會(huì)失敗。

當(dāng)您在web瀏覽器中單擊HTML元素時(shí),Visual Web Ripper會(huì)自動(dòng)嘗試創(chuàng)建一個(gè)優(yōu)化的選擇XPath。它通過使XPath盡可能短而做到這一點(diǎn)。例如,對(duì)DIV HTML元素的完整選擇XPath路徑如下:

DIV[1]/DIV[5]/TABLE[2]/TBODY[1]/TR[2]/TD[1]/DIV

如果DIV標(biāo)簽有一個(gè)惟一的ID值listView,那么優(yōu)化的XPath就是:

//DIV[@id='listView']

Visual Web Ripper 將會(huì)在網(wǎng)頁上尋找一個(gè)具有ID屬性值listView的DIV標(biāo)簽。XPath非常健壯,對(duì)未來的頁面更改不敏感。只要這個(gè)元素存在于網(wǎng)頁上,XPath就可以工作,即使網(wǎng)頁的其他部分也會(huì)改變。

Visual Web Ripper 喜歡使用ID屬性來優(yōu)化xpath,因?yàn)镮Ds在web頁面上應(yīng)該是惟一的。然而,有時(shí)網(wǎng)站使用的ID是特定的內(nèi)容元素,例如產(chǎn)品ID,而這些ID不適合在XPath中使用。如果從產(chǎn)品目錄中提取數(shù)據(jù),通過使用XPath從所有產(chǎn)品細(xì)節(jié)頁面中提取產(chǎn)品標(biāo)題,您不希望XPath依賴于特定的產(chǎn)品ID,比如這個(gè)XPath:

//H1[@id='sku_245865']

這樣的XPath只適用于一種特定的產(chǎn)品,而不適用于其他產(chǎn)品。在這種情況下,您需要使用沒有IDs的XPath選項(xiàng)。您可以使用其他一些XPath選項(xiàng)來調(diào)整選擇。

Optimize Xpath
Xpath 選項(xiàng) XPath Options
Optimize XPath 自動(dòng)嘗試優(yōu)化選擇XPath,使之盡可能短。這使得XPath更加健壯,對(duì)未來的頁面更改也不那么敏感。
Optimize without IDs 選擇這個(gè)選項(xiàng),告訴Visual Web Ripper 不要在xpath中使用id。Visual Web Ripper 喜歡使用ID屬性來優(yōu)化xpath,因?yàn)镮D在網(wǎng)頁上應(yīng)該是唯一的。有些網(wǎng)站可能使用不適合XPath的id,因?yàn)樗鼈兣c網(wǎng)頁上的特定內(nèi)容有關(guān),比如產(chǎn)品id,或者因?yàn)樗鼈兪歉鶕?jù)日期和時(shí)間生成的。
Accuracy 這個(gè)選項(xiàng)指定XPath中需要多少步驟。
一個(gè)四步XPath可以是這樣的:
//TABLE/TBODY/TR/TD
一個(gè)兩步的XPath可以是這樣的:
//TR/TD
Attributes 該選項(xiàng)指定在XPath的第一步中應(yīng)該使用哪些屬性。
具有屬性類的XPath可以是這樣的:
//TABLE[@class='table1']/TBODY/TR/TD
將查找?guī)в兄付▽傩缘牡谝粋€(gè)標(biāo)記,該屬性至少可以通過精度選項(xiàng)指定的步驟數(shù)量來生成XPath。例如,如果將屬性設(shè)置為類,并且精度設(shè)置為2,那么XPath仍然可以像下面的XPath一樣,如果標(biāo)記TBODY、TR和YD沒有一個(gè)類屬性:
//TABLE[@class='table1']/TBODY/TR/TD
Row span 在PageArea模板中使用行span,在選擇中包含指定的兄弟HTML元素?cái)?shù)量。
例如,您可能想要選擇標(biāo)題元素和以下兩段的第一個(gè)段落:
<h1>header text<h1><p>paragraph1</p><p>paragraph2</p><p>paragraph3</p><p>paragraph4</p>
在本例中,您可以選擇header元素,并將行span選項(xiàng)設(shè)置為3。當(dāng)在List模板中使用Row span時(shí),它將應(yīng)用到列表中的所有項(xiàng),但是一個(gè)列表項(xiàng)的兄弟元素將不會(huì)與下一個(gè)列表項(xiàng)重疊。

創(chuàng)建列表Creating Lists


在許多情況下,您將希望從列表中提取數(shù)據(jù),例如表或搜索結(jié)果。Visual Web Ripper有幾個(gè)工具可以幫助你創(chuàng)建一個(gè)列表選擇。
嘗試使用不同的工具來確定給定場(chǎng)景的最佳技術(shù)。首先,最好先嘗試創(chuàng)建列表上下文菜單工具。如果這不起作用,試試不同的列表選項(xiàng)。

創(chuàng)建列表上下文菜單 The Create List Context Menu

創(chuàng)建一個(gè)在大多數(shù)場(chǎng)景中起作用的列表的最簡(jiǎn)單方法是使用create list上下文菜單,遵循以下兩個(gè)簡(jiǎn)單步驟:

  1. 在web瀏覽器中選擇列表中的第一個(gè)元素。這個(gè)選擇必須準(zhǔn)確地選擇第一個(gè)元素。例如,如果您正在創(chuàng)建一個(gè)選擇表中的所有行的列表,那么該選擇應(yīng)該選擇一個(gè)完整的表行。
  2. 右鍵單擊列表中的另一個(gè)元素,并從上下文菜單中選擇Create list。

以下兩步的過程如下圖所示:

步驟1 - 在web瀏覽器中選擇列表中的第一個(gè)元素

Select First Elements

步驟2 - 右鍵單擊列表中的另一個(gè)元素

Create List

Visual Web Ripper 使用列表中的兩個(gè)元素的信息來創(chuàng)建完整的列表。如果列表中的行看起來不同,比如上面的圖像中的交錯(cuò)行,那么選擇一種類型的行并右鍵單擊另一種類型的行是很重要的,這樣Visual Web Ripper 就可以使用來自這兩種類型的信息來創(chuàng)建完整的列表。如果在選擇中沒有包含某些類型的行,或者如果您想從選擇中刪除某些類型的行,可以使用上下文菜單保存在列表中,并從列表中刪除。

列表選項(xiàng) List Options

列表選項(xiàng)可用于重復(fù)選擇,以便創(chuàng)建列表選擇。要使用列表選項(xiàng),您必須首先在web瀏覽器中選擇一個(gè)HTML元素,然后選擇其中一個(gè)列表選項(xiàng)。


List Options

自由重復(fù)(Free repeat)選項(xiàng)從選擇XPath中刪除位置信息,從而選擇一個(gè)與所選元素相似位置的頁面上的所有元素。這個(gè)選項(xiàng)通常會(huì)選擇太多的元素,但是您可以使用擴(kuò)展/限制(Expand/Limit)選擇工具欄按鈕來包含或者從列表選擇中排除元素。

流重復(fù)(Flow repeat)選項(xiàng)在其父容器中重復(fù)選擇。當(dāng)您想要選擇一個(gè)HTML列表中的所有元素,或者您想要選擇單個(gè)表行中的所有列時(shí),這個(gè)選項(xiàng)就可以很好地工作。

父流重復(fù)(Parent flow repeat)選項(xiàng)被設(shè)計(jì)用于為表中的所有行選擇單個(gè)列。

手動(dòng)(Manual)選項(xiàng)不修改選擇XPath。如果您想手動(dòng)輸入選擇XPath,請(qǐng)使用此選項(xiàng)。如果您輸入的是選擇多個(gè)元素的XPath,但是您沒有選擇手動(dòng)列表選項(xiàng),那么Visual Web Ripper 將不會(huì)把您的選擇識(shí)別為一個(gè)列表選擇,并且只處理列表中的第一個(gè)元素。

可以使用Start索引和Count選項(xiàng)來排除列表中的某些元素。Start index選項(xiàng)指定包含在列表中的第一個(gè)元素的索引。Count選項(xiàng)指定要包含在列表中的選項(xiàng)的數(shù)量。

Advanced Options選項(xiàng)卡包含列表選項(xiàng)跳過最后一行計(jì)數(shù),它指定從列表末尾刪除的固定數(shù)量的元素。

使用過濾器 Using Filters

選擇篩選器用于限制選擇,因此只有在滿足特定條件時(shí)才選擇元素。選擇過濾器通常用于以下兩種情況:

  • 當(dāng)您想要將一個(gè)列表選擇限制為包含特定子元素的元素時(shí)
  • 當(dāng)您想從屬性表中選擇一個(gè)值時(shí),一個(gè)特定的名稱/值對(duì)位于不同的web頁面的不同位置

使用篩選器來限制列表的選擇 Using a Filter to Limit a List Selection

下圖顯示了一個(gè)列表選擇,其中所有的行都被選中。標(biāo)題行是表中的一個(gè)普通行,因此這個(gè)行包含在列表中。如果您想從這個(gè)表中提取數(shù)據(jù),您通常不會(huì)對(duì)標(biāo)題行感興趣,因?yàn)樗话魏螖?shù)據(jù)。然而,有時(shí)很難將行排除在列表選擇之外。


demo

請(qǐng)注意,上面的表中所有的行都有一個(gè)詳細(xì)的鏈接元素。您可以使用此信息來過濾列表,因此只有包含該鏈接的行才包含在列表中。您可以通過右鍵單擊鏈接元素,并從上下文菜單中選擇必須包含這個(gè)元素過濾器。


image.png

現(xiàn)在,標(biāo)題行已經(jīng)從下面的列表選擇中刪除了。

image.png

使用篩選器來選擇不同位置的內(nèi)容

模板定義了如何從一種類型的網(wǎng)頁中提取數(shù)據(jù),例如產(chǎn)品目錄中的產(chǎn)品細(xì)節(jié)頁面。有時(shí),內(nèi)容位于同一類型網(wǎng)頁的不同位置。例如,您可能有一個(gè)產(chǎn)品細(xì)節(jié)頁面,它顯示了產(chǎn)品屬性列表,例如下面的屏幕截圖。不同的產(chǎn)品可能有不同的產(chǎn)品特性。例如,在下圖中,產(chǎn)品屬性產(chǎn)品寬度可能位于表的不同位置。
Visual Web Ripper 在特定位置尋找內(nèi)容,因此對(duì)于一種產(chǎn)品,它可以提取產(chǎn)品寬度,但對(duì)于另一種產(chǎn)品,它可以提取產(chǎn)品重量。

文本過濾器可以處理不同位置的內(nèi)容。網(wǎng)頁上的大多數(shù)數(shù)據(jù)屬性都有一個(gè)相關(guān)的文本組件來描述數(shù)據(jù)屬性。在下面的網(wǎng)頁上,文本域產(chǎn)品寬度描述了產(chǎn)品寬度的數(shù)據(jù)屬性,因此你可以告訴Visual Web Ripper 在表格中尋找文本“產(chǎn)品寬度”,然后選擇相關(guān)的數(shù)據(jù)屬性。

要使用文本過濾器,選擇您想要提取的數(shù)據(jù)屬性,右鍵單擊相關(guān)聯(lián)的文本元素,然后選擇Must Have Text...過濾

image.png



























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

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

  • 理解概念 在開始使用Visual Web Ripper之前,您需要理解底層的模板(Template)概念。大多數(shù)w...
    游俠兒evil閱讀 705評(píng)論 0 0
  • 項(xiàng)目選項(xiàng) 項(xiàng)目選項(xiàng)是適用于整個(gè)項(xiàng)目的選項(xiàng)。最常用的項(xiàng)目選項(xiàng)與以下三個(gè)方面相關(guān): 開始的urls 連接 代理 您可以...
    游俠兒evil閱讀 862評(píng)論 0 0
  • 運(yùn)行一個(gè)項(xiàng)目Running a Project 在您設(shè)計(jì)了一個(gè)數(shù)據(jù)提取項(xiàng)目之后,您需要運(yùn)行它來提取數(shù)據(jù)。您可以以許...
    游俠兒evil閱讀 1,230評(píng)論 0 0
  • Content Transformation 內(nèi)容轉(zhuǎn)換腳本用于在從網(wǎng)頁中提取內(nèi)容后轉(zhuǎn)換內(nèi)容。內(nèi)容轉(zhuǎn)換通常用于HTM...
    游俠兒evil閱讀 839評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139