2013-07-18 28 views
0

我會展示我的確切示例,但我認爲這可能是一個普遍情況的問題,您必須抓取其網址指向不同頁面的一個頁面。具有相同網址的兩頁。如何抓取?

我要抓取的頁面位於此網址http://www.oxygenboutique.com/Shoes-All.aspx之下,但不是您直接關注此鏈接時得到的頁面。我想要的是你看到的,如果你點擊「全部顯示」。

我怎樣才能讓我的蜘蛛在我想要的那個開始?

感謝

回答

2

「全部顯示」鏈接是網頁上的一個JavaScript函數的調用,它被稱爲是這樣的:

__doPostBack('ctl00$ContentPlaceHolder1$PGN01','') 

我的主要瀏覽器是火狐,它具有優異的您可以使用的附加組件。 我使用了「Web Developer」加載項。

在包含該頁面的選項卡中,執行以下操作: 讓鼠標光標懸停在顯示所有鏈接上。 然後右鍵單擊並選擇「Web Developer」>「信息」>「查看Javascript Alt + Shift + J」 然後,Firefox將打開一個包含所有頁面正在使用的Javascript的新選項卡。

在標籤 - 快速搜索找到__doPostBack函數,它是編碼這樣的:

function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 

即SCRIPT關閉的話可以降低至低於JavaScript代碼,測試在IF-statemment求值爲真,我們使用從函數調用函數的參數:

theForm.__EVENTTARGET.value = 'ctl00$ContentPlaceHolder1$PGN01'; 
theForm.__EVENTARGUMENT.value = ''; 
theForm.submit(); 

現在我們需要知道'theForm'是什麼。

下面的代碼被發現正上方__doPostBack功能:

var theForm = document.forms['aspnetForm']; 
if (!theForm) { 
    theForm = document.aspnetForm; 
} 

從我們現在知道的是,「theForm」是一個「形式」的HTML標籤,它具有id屬性的引用「aspnetForm」(ID =「aspnetForm」),這意味着在HTML文檔中,我們shold尋找一些這樣開始的:

<form id="aspnetForm" 

要知道,標籤究竟怎麼寫,我將使用火狐瀏覽器看看你感興趣的頁面的修改過的HTML。 這裏我使用的是FireBug插件。

HTML表格的開始標記看起來是這樣的:

<form id="aspnetForm" onsubmit="javascript:return WebForm_OnSubmit();" 
action="/Shoes-All.aspx" method="post" name="aspnetForm"> 

所以動作是使用相同的HTML文件!

讓我們來看看有什麼WebForm_OnSubmit()函數是這樣做的:

function WebForm_OnSubmit() { 
    if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) 
     return false; 
    return true; 

}

讓我們來看看ValidatorOnSubmit()函數,它是用一個有趣的變量:

var Page_ValidationActive = false; 

// ... 

function ValidatorOnSubmit() { 
    if (Page_ValidationActive) { 
     return ValidatorCommonOnSubmit(); 
    } 
    else { 
     return true; 
    } 
} 

這意味着該函數將始終返回'true',因此我們現在可以將表單的開始標記重寫爲:

<form id="aspnetForm" onsubmit="javascript:return true;" 
action="/Shoes-All.aspx" method="post" name="aspnetForm"> 

從這我們可以得出結論,網頁需要從網絡服務器重新加載。

現在我們需要知道在HTTP POST請求中使用哪些變量和值。

要做到這一點,我再次用JavaScript打開Firefox。 此外,我正在使用真棒的Firebug插件。 在第一個div標籤的形式元素,我們發現這一點:

<div> 
    <input id="__EVENTTARGET" type="hidden" 
     value="" name="__EVENTTARGET"> 
    <input id="__EVENTARGUMENT" type="hidden" value="" name="__EVENTARGUMENT"> 
    <input id="__LASTFOCUS" type="hidden" value="" name="__LASTFOCUS"> 
    <input id="__VIEWSTATE" type="hidden" 
     value="(lots of data here)" name="__VIEWSTATE"> 
</div> 

如果你還記得我們以前減少JavaScript代碼,它修改了2輸入標籤形式的價值屬性,所以HTML必須通過該功能被modfied,所以這真的是:

<div> 
    <input id="__EVENTTARGET" type="hidden" 
     value="ctl00$ContentPlaceHolder1$PGN01" name="__EVENTTARGET"> 
    <input id="__EVENTARGUMENT" type="hidden" value="" name="__EVENTARGUMENT"> 
    <input id="__LASTFOCUS" type="hidden" value="" name="__LASTFOCUS"> 
    <input id="__VIEWSTATE" type="hidden" 
     value="(lots of binary data here)" name="__VIEWSTATE"> 
</div> 

你當然需要做的id爲「_VIEWSTATE」輸入變量的值屬性的內容的完整副本。

僅供參考,火狐說,_VIEWSTATE輸入標籤XPath是:

//*[@id="__VIEWSTATE"] 

...並且它的CSS選擇器是:

form#aspnetForm div input#__VIEWSTATE 

已經從網絡服務器下載的所有項目後,您將接着解析HTML頁面。

有趣的內容嵌入到表格深處。 它是一個HTML表格。

爲表中的相關XPath是:

//*[@id="ctl00_ContentPlaceHolder1_dlList"] 

...和CSS選擇器是

table#ctl00_ContentPlaceHolder1_dlList 

它包含了一個TBODY,TR,TD,DIV,和另一個表(=更糟糕的設計 - 有人需要了解無表設計,智能手機和平板電腦上的HTML表格看起來會很糟糕。)

我認爲在這一點上,你應該把美麗的湯4解析器的工作。

+0

經過一段時間「學習」你寫的東西,我明白了按鈕SHOW ALL只是修改了形如「aspnetForm」形式的hte輸入__EVENTTARGET的屬性「值」,然後提交它並更改html。 但我仍然不明白爲什麼我必須複製輸入「__VIEWSTATE」的屬性值的內容,爲什麼我必須從服務器上下載一些項目。基本上我不明白我的蜘蛛如何解析這個修改後的HTML,因爲它不是一個鏈接。 (我對所有這些都很新穎,我不知道是否有一種方法可以抓取修改後的HTML而不是新的給定URL) – 700z

+0

並且非常感謝! – 700z