本發(fā)明涉及計算機技術(shù),特別是涉及一種深度鏈接獲取方法和裝置。
背景技術(shù):
隨著當(dāng)今互聯(lián)網(wǎng)的飛速發(fā)展,各種網(wǎng)絡(luò)信息的內(nèi)容日益豐富。作為網(wǎng)絡(luò)信息主要承載形式的萬維網(wǎng)被應(yīng)用了大量復(fù)雜技術(shù)例如adobeflash、ajax、連接加密等來呈現(xiàn)內(nèi)容,以提高用戶體驗和安全性。由于大量內(nèi)容是網(wǎng)頁加載后由javascript動態(tài)生成的,導(dǎo)致一些深度鏈接難以抓取和利用。
傳統(tǒng)的網(wǎng)絡(luò)爬蟲在抓取網(wǎng)頁數(shù)據(jù)時,只能抓取具有特殊關(guān)鍵字符的數(shù)據(jù),但很多網(wǎng)站并不會將所有的內(nèi)容都直接輸出到一個頁面中,部分?jǐn)?shù)據(jù)需要通過javascript處理才能得到,還有些內(nèi)容可能需要用戶觸發(fā)才會被加載。所以傳統(tǒng)的爬蟲無法抓取深度鏈接的網(wǎng)頁數(shù)據(jù)。而目前解決這些限制的一般做法需要運行一套完整的瀏覽器環(huán)境以獲取這些動態(tài)內(nèi)容。由于完整的瀏覽器環(huán)境需要較大的資源開銷并且速度較慢,會導(dǎo)致深度鏈接的抓取成本高而且效率低。
技術(shù)實現(xiàn)要素:
基于此,有必要針對深度鏈接抓取成本高、效率低的問題,提供一種開銷比較低且效率比較高的深度鏈接獲取方法和裝置。
一種深度鏈接獲取方法,所述方法包括:獲取目標(biāo)頁面的地址;根據(jù)所述目標(biāo)頁面的地址下載所述目標(biāo)頁面并獲取適用于所述目標(biāo)頁面的配置文件;根據(jù)所述配置文件中的配置規(guī)則從所述目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)以及提取解析所述目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量;根據(jù)提取出的所述目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接。
在其中一個實施例中,所述根據(jù)提取出的所述目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接的步驟包括:獲取所述配置文件中的觸發(fā)代碼;將所述觸發(fā)代碼、解析所述目標(biāo)數(shù)據(jù)所述需要的函數(shù)和變量進行組合得到組合代碼;調(diào)用運行引擎運行所述組合代碼,根據(jù)運行的結(jié)果解析所述目標(biāo)數(shù)據(jù)得到所述目標(biāo)深度鏈接。
在其中一個實施例中,所述根據(jù)所述配置文件中的配置規(guī)則從所述目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)以及提取解析所述目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量的步驟包括:根據(jù)所述配置文件中預(yù)設(shè)的字段從所述目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù);根據(jù)所述配置文件中預(yù)設(shè)的正則表達(dá)式從所述目標(biāo)頁面中提取解析所述目標(biāo)數(shù)據(jù)所需要的第一函數(shù);通過語法分析獲取所述第一函數(shù)的依賴關(guān)系;根據(jù)所述依賴關(guān)系提取所述第一函數(shù)依賴的第二函數(shù)和變量;所述根據(jù)提取出的所述目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接的步驟包括:根據(jù)提取出的所述目標(biāo)數(shù)據(jù)、第一函數(shù)、第二函數(shù)和變量獲取目標(biāo)深度鏈接。
在其中一個實施例中,根據(jù)所述依賴關(guān)系提取所述第一函數(shù)依賴的第二函數(shù)和變量的步驟包括:根據(jù)所述依賴關(guān)系從所述目標(biāo)頁面的源代碼中以及從與所述目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼中獲取所述第一函數(shù)依賴的第二函數(shù)和變量。
在其中一個實施例中,在根據(jù)所述依賴關(guān)系提取所述第一函數(shù)依賴的第二函數(shù)和變量的步驟之前還包括:檢測緩存內(nèi)是否存在與所述目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼;若不存在,則獲取與所述目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼,將獲取到的所述外部頁面的源代碼存入所述緩存內(nèi)。
一種深度鏈接獲取裝置,所述裝置包括:地址獲取模塊,用于獲取目標(biāo)頁面的地址;下載模塊,用于根據(jù)所述目標(biāo)頁面的地址下載所述目標(biāo)頁面;配置文件獲取模塊,用于根據(jù)所述目標(biāo)頁面的地址獲取適用于所述目標(biāo)頁面的配置文件;提取模塊,用于根據(jù)所述配置文件中的配置規(guī)則從所述目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)以及提取解析所述目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量;深度鏈接獲取模塊,用于根據(jù)提取出的所述目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接。
在其中一個實施例中,所述深度鏈接獲取模塊包括:觸發(fā)代碼獲取模塊,用于獲取所述配置文件中的觸發(fā)代碼;組合模塊,用于將所述觸發(fā)代碼、解析所述目標(biāo)數(shù)據(jù)的函數(shù)和變量進行組合得到組合代碼;調(diào)用模塊,用于調(diào)用運行引擎運行所述組合代碼,根據(jù)運行的結(jié)果解析所述目標(biāo)數(shù)據(jù)得到所述目標(biāo)深度鏈接。
在其中一個實施例中,所述提取模塊包括:目標(biāo)數(shù)據(jù)提取模塊,用于根據(jù)所述配置文件中預(yù)設(shè)的字段從所述目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù);第一函數(shù)提取模塊,用于根據(jù)所述配置文件中預(yù)設(shè)的正則表達(dá)式從所述目標(biāo)頁面中提取解析所述目標(biāo)數(shù)據(jù)所需要的第一函數(shù);分析模塊,用于通過語法分析獲取所述第一函數(shù)的依賴關(guān)系;第二函數(shù)提取模塊,用于根據(jù)所述依賴關(guān)系提取所述第一函數(shù)依賴的第二函數(shù)和變量;所述深度鏈接獲取模塊還用于根據(jù)提取出的所述目標(biāo)數(shù)據(jù)、第一函數(shù)、第二函數(shù)和變量獲取目標(biāo)深度鏈接。
在其中一個實施例中,所述第二函數(shù)提取模塊還用于根據(jù)所述依賴關(guān)系從所述目標(biāo)頁面的源代碼中以及從與所述目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼中獲取所述第一函數(shù)依賴的第二函數(shù)和變量。
在其中一個實施例中,所述裝置還包括:檢測模塊,用于檢測緩存內(nèi)是否存在與所述目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼;存入模塊,用于若緩存內(nèi)不存在所述外部頁面的源代碼則獲取與所述目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼,將獲取到的所述外部頁面的源代碼存入所述緩存內(nèi)。
上述深度鏈接獲取方法和裝置,通過獲取目標(biāo)頁面的地址,根據(jù)目標(biāo)頁面的地址下載所述目標(biāo)頁面并獲取適用于目標(biāo)頁面的配置文件,根據(jù)配置文件中的配置規(guī)則從目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)以及提取解析該目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量,根據(jù)提取出的目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接。上述深度鏈接獲取方法通過預(yù)先設(shè)置針對不同頁面的配置文件,然后根據(jù)配置文件來提取需要用到的目標(biāo)數(shù)據(jù)、以及解析該目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量就可以獲取目標(biāo)深度鏈接,該方法不需要運行完整的瀏覽器環(huán)境,只需要根據(jù)配置規(guī)則提取相關(guān)數(shù)據(jù)即可,所以用很小的開銷就可以快速提取網(wǎng)頁中的深度鏈接,因此,不但降低了抓取深度鏈接的成本,而且提高了獲取的效率。進一步的,當(dāng)網(wǎng)頁結(jié)構(gòu)改變的時候仍可以采用該方法,即該方法具有一定的兼容性。
附圖說明
圖1為一個實施例中深度鏈接獲取方法的流程圖;
圖2為一個實施例中根據(jù)提取出的目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接的方法流程圖;
圖3為一個實施例中根據(jù)配置文件中的配置規(guī)則提取目標(biāo)數(shù)據(jù)、函數(shù)和變量的方法流程圖;
圖4為一個實施例中深度鏈接獲取裝置的結(jié)構(gòu)框圖;
圖5為一個實施例中深度鏈接獲取模塊的結(jié)構(gòu)框圖;
圖6為一個實施例中提取模塊的結(jié)構(gòu)框圖;
圖7為另一個實施例中深度鏈接獲取裝置的結(jié)構(gòu)框圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
如圖1所示,在一個實施例中,提出了一種深度鏈接獲取方法,該方法既可應(yīng)用于終端中,也可以應(yīng)用于服務(wù)器中,包括:
步驟102,獲取目標(biāo)頁面的地址。
具體的,首先獲取待抓取深度鏈接的目標(biāo)頁面的地址,后續(xù)可以根據(jù)該目標(biāo)頁面的地址獲取該目標(biāo)頁面的內(nèi)容。深度鏈接是指繞過被鏈接網(wǎng)站首頁鏈接到分頁的鏈接方式,可以簡單的理解為網(wǎng)頁上的超鏈接。比如,可以是直接指向視頻源的鏈接。出于安全方面的考慮,往往會對深度鏈接進行加工處理,比如,為深度鏈接添加一個簽名信息,只有校驗簽名信息成功才可以訪問到深度鏈接指向的內(nèi)容,而簽名信息需要依靠javascript計算得到,所以深度鏈接不能通過傳統(tǒng)的網(wǎng)頁爬蟲來抓取。
步驟104,根據(jù)目標(biāo)頁面的地址下載目標(biāo)頁面并獲取適用于目標(biāo)頁面的配置文件。
在本實施例中,由于不同的網(wǎng)頁對深度鏈接進行加工處理的方式不同,所以為了能夠獲取到深度鏈接,需要針對不同網(wǎng)頁配備適用于該網(wǎng)頁的配置規(guī)則,將配置規(guī)則存放到相應(yīng)的配置文件中。具體的,預(yù)先將適用于網(wǎng)頁的配置文件和該網(wǎng)頁的地址進行對應(yīng)存儲,那么當(dāng)獲取到目標(biāo)網(wǎng)頁的地址后,首先根據(jù)目標(biāo)網(wǎng)頁的地址將目標(biāo)頁面中的內(nèi)容下載下來,同時根據(jù)該目標(biāo)網(wǎng)頁的地址獲取適用于該目標(biāo)網(wǎng)頁的配置文件,其中,目標(biāo)頁面的內(nèi)容包括以html(hypertextmarkuplanguage,超文本標(biāo)記語言)和javascript代碼形式存在的內(nèi)容。
步驟106,根據(jù)配置文件中的配置規(guī)則從目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)以及提取解析目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量。
在本實施例中,與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)是指目標(biāo)深度鏈接經(jīng)過處理后的數(shù)據(jù),比如,可以是帶有簽名信息的目標(biāo)深度鏈接數(shù)據(jù)、可以是目標(biāo)深度鏈接經(jīng)過加密之后呈現(xiàn)的數(shù)據(jù)。只有對該目標(biāo)數(shù)據(jù)進行相應(yīng)的解析后才能獲取到目標(biāo)深度鏈接。所以為了能夠獲取到目標(biāo)深度鏈接除了提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù),還需要提取解析該目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量。配置文件中包括提取目標(biāo)數(shù)據(jù)的提取規(guī)則,也包括提取解析該目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量的規(guī)則。具體的,根據(jù)配置文件中提取目標(biāo)數(shù)據(jù)的規(guī)則從目標(biāo)網(wǎng)頁中提取目標(biāo)數(shù)據(jù),根據(jù)配置文件中設(shè)置的提取函數(shù)和變量的正則表達(dá)式提取解析目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量。針對不同的網(wǎng)頁提取函數(shù)和變量的方式不同。舉個例子,如果解析目標(biāo)數(shù)據(jù)所需要的函數(shù)有兩個,a和b,變量也有兩個,x和y。假設(shè)a和b之間是有依賴關(guān)系的,比如,a依賴于b,且a也依賴于變量x和y。此時,配置文件中只需要配置提取函數(shù)a的規(guī)則,提取到函數(shù)a后,通過語法分析可以得到函數(shù)a的依賴關(guān)系,即分析出函數(shù)a依賴于函數(shù)b、變量x和y,那么根據(jù)該依賴關(guān)系就可以提取到函數(shù)b,變量x和y。如果a和b之間沒有依賴關(guān)系,即兩者是獨立的,那么就需要在配置文件中分別配置提取函數(shù)a、函數(shù)b的提取規(guī)則,然后再分別獲取兩者依賴的變量x和y。也就是說,如果通過依賴關(guān)系可以間接提取到的函數(shù)和變量就不需要提前在配置文件中設(shè)置配置規(guī)則,如果不能通過依賴關(guān)系提取的函數(shù)和變量,就必須提前在配置文件中配置提取該函數(shù)和變量的規(guī)則。
步驟108,根據(jù)提取出的目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接。
在本實施例中,根據(jù)配置規(guī)則提取到與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)、以及解析該目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量后,就可以根據(jù)該提取到的目標(biāo)數(shù)據(jù)、函數(shù)和變量來獲取目標(biāo)深度鏈接。需要說明的是,提取到的函數(shù)和變量是以javascript代碼的形式存在的。具體的,獲取到目標(biāo)數(shù)據(jù)、函數(shù)和變量后,還需要提取配置文件中預(yù)先存儲的觸發(fā)代碼,該觸發(fā)代碼用于初始化運行環(huán)境,給變量賦值以及調(diào)用提取到函數(shù)。所以,首先,獲取配置文件中的觸發(fā)代碼,然后將獲取到的觸發(fā)代碼、解析目標(biāo)數(shù)據(jù)的函數(shù)和變量進行組合得到組合代碼,然后通過調(diào)用javascript運行引擎運行該組合代碼,根據(jù)運行的結(jié)果解析目標(biāo)數(shù)據(jù)得到目標(biāo)深度鏈接。
在本實施例中,通過獲取目標(biāo)頁面的地址,根據(jù)目標(biāo)頁面的地址下載目標(biāo)頁面并獲取適用于目標(biāo)頁面的配置文件,根據(jù)配置文件中的配置規(guī)則從目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)以及提取解析該目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量,根據(jù)提取出的目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接。上述深度鏈接獲取方法通過預(yù)先設(shè)置針對不同頁面的配置文件,然后根據(jù)配置文件來提取需要用到的目標(biāo)數(shù)據(jù)、以及解析該目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量就可以獲取目標(biāo)深度鏈接,該方法不需要運行完整的瀏覽器環(huán)境,只需要根據(jù)配置規(guī)則提取相關(guān)數(shù)據(jù)即可,所以用很小的開銷就可以快速提取網(wǎng)頁中的深度鏈接,因此,不但降低了抓取深度鏈接的成本,而且提高了獲取的效率。進一步的,當(dāng)網(wǎng)頁結(jié)構(gòu)改變的時候仍可以采用該方法,即該方法具有一定的兼容性。
如圖2所示,在一個實施例中,根據(jù)提取出的目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接的步驟包括:
步驟108a,獲取配置文件中的觸發(fā)代碼。
在本實施例中,觸發(fā)代碼用于初始化運行環(huán)境,給變量賦值以及調(diào)用對應(yīng)的函數(shù)。為了調(diào)用提取到的函數(shù)和變量,需要在配置文件中提前設(shè)置對應(yīng)的觸發(fā)代碼,即需要預(yù)先存儲能夠調(diào)用提取到的函數(shù)和變量的觸發(fā)代碼。需要說明的是,提取到的函數(shù)和變量是以javascript代碼的形式存在的,所以可以通過設(shè)置的觸發(fā)代碼來調(diào)用。
步驟108b,將觸發(fā)代碼、解析目標(biāo)數(shù)據(jù)的函數(shù)和變量進行組合得到組合代碼。
在本實施例中,獲取到配置文件中的觸發(fā)代碼后,將獲取到的觸發(fā)代碼和提取的解析目標(biāo)數(shù)據(jù)的函數(shù)和變量進行組合,由于提取到的函數(shù)和變量是以javascript代碼形式存在的,所以直接可以將觸發(fā)代碼和函數(shù)、變量的代碼進行組合得到組合代碼,這樣就得到了一個可以運行的組合代碼。
步驟108c,調(diào)用運行引擎運行組合代碼,根據(jù)運行的結(jié)果解析目標(biāo)數(shù)據(jù)得到目標(biāo)深度鏈接。
在本實施例中,調(diào)用javascript運行引擎運行得到的組合代碼,然后根據(jù)運行的結(jié)果就可以對目標(biāo)數(shù)據(jù)進行解析得到目標(biāo)深度鏈接。具體的,組合代碼中的觸發(fā)代碼就相當(dāng)于是可以調(diào)用其他函數(shù)的主函數(shù),根據(jù)預(yù)先設(shè)置的調(diào)用順序分別調(diào)用對應(yīng)的函數(shù)來得到運行結(jié)果,然后根據(jù)運行結(jié)果解析目標(biāo)數(shù)據(jù)得到目標(biāo)深度鏈接。舉例說明,假設(shè)深度鏈接是一個帶有簽名的url,,那么就需要根據(jù)獲取到的函數(shù)和變量來計算得到對應(yīng)的簽名信息,然后根據(jù)得到的簽名信息就可以生成對應(yīng)的簽名,得到有效的帶有簽名的url。
如圖3所示,在一個實施例中,根據(jù)配置文件中的配置規(guī)則從目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)以及提取解析目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量的步驟106包括:
步驟106a,根據(jù)配置文件中預(yù)設(shè)的字段從目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)。
具體的,配置文件中預(yù)先分別配置了提取目標(biāo)數(shù)據(jù)的規(guī)則,以及提取解析目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量的規(guī)則。其中,目標(biāo)數(shù)據(jù)具有特定的字段特征,所以根據(jù)配置文件中預(yù)設(shè)的字段就可以從目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)。比如,目標(biāo)數(shù)據(jù)具有“http/”這樣的字段特征,那么就可以根據(jù)“http/”這樣的字段將對應(yīng)的目標(biāo)數(shù)據(jù)提取出來。
步驟106b,根據(jù)配置文件中的正則表達(dá)式從目標(biāo)頁面中提取解析目標(biāo)數(shù)據(jù)所需要的第一函數(shù)。
在本實施例中,配置文件中提取函數(shù)和變量的規(guī)則是以正則表達(dá)式的形式進行設(shè)置的,也就是說,通過預(yù)設(shè)設(shè)置的正則表達(dá)式從目標(biāo)頁面中匹配符合該正則表達(dá)式的函數(shù),直接根據(jù)正則表達(dá)式匹配到的函數(shù)稱為第一函數(shù)。其中,正則表達(dá)式是指使用單個字符串來描述,匹配一系列符合某個句法規(guī)則的字符串。具體的,解析目標(biāo)數(shù)據(jù)往往可能需要多個函數(shù),有些函數(shù)是通過配置文件中預(yù)設(shè)的正則表達(dá)式直接得到的,直接得到的函數(shù)稱為第一函數(shù),而有些則需要根據(jù)第一函數(shù)的依賴關(guān)系來間接得到。
步驟106c,通過語法分析獲取第一函數(shù)的依賴關(guān)系。
在本實施例中,獲取到第一函數(shù)后,通過對第一函數(shù)進行語法分析可以獲取該第一函數(shù)的依賴關(guān)系,即對獲取到的第一函數(shù)的代碼進行分析可以分析得到該第一函數(shù)依賴于哪些函數(shù)以及依賴于哪些變量。
步驟106d,根據(jù)依賴關(guān)系提取第一函數(shù)依賴的第二函數(shù)和變量;
在本實施例中,獲取到第一函數(shù)的依賴關(guān)系后,即分析得到第一函數(shù)所依賴的函數(shù)及變量后,為了便于區(qū)分,將第一函數(shù)依賴的函數(shù)稱為第二函數(shù)。需要說明的是,這里的第一函數(shù)是指根據(jù)正則表達(dá)式從目標(biāo)頁面中直接提取的函數(shù),第二函數(shù)是指根據(jù)第一函數(shù)的依賴關(guān)系間接的從目標(biāo)頁面中提取的函數(shù),不管是第一函數(shù)和第二函數(shù)都代表的是一類函數(shù),這里并沒有限制提取函數(shù)的數(shù)量。舉個例子,根據(jù)配置文件中的正則表達(dá)式提取出的第一函數(shù)可以有多個,比如,提取的第一函數(shù)有a和b,繼而分別分析a和b的依賴關(guān)系,假設(shè)a依賴于函數(shù)c和d,b依賴于函數(shù)e和f,那么c、d、e、f都是第二函數(shù)。后續(xù)根據(jù)提取出的目標(biāo)數(shù)據(jù)、第一函數(shù)、第二函數(shù)和變量獲取目標(biāo)深度鏈接。
在一個實施例中,根據(jù)提取出的目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接的步驟108包括:根據(jù)提取出的目標(biāo)數(shù)據(jù)、第一函數(shù)、第二函數(shù)和變量獲取目標(biāo)深度鏈接。
在本實施例中,不管是第一函數(shù)還是第二函數(shù)都是解析目標(biāo)數(shù)據(jù)所需要的函數(shù),根據(jù)提取的目標(biāo)數(shù)據(jù)、第一函數(shù)、第二函數(shù)和變量獲取目標(biāo)深度鏈接。具體的,通過將從配置文件中獲取的觸發(fā)代碼、第一函數(shù)、第二函數(shù)和變量進行組合成新的組合代碼,然后調(diào)用運行引擎來運行該組合代碼,根據(jù)運行結(jié)果來對目標(biāo)數(shù)據(jù)進行解析就可以獲取到目標(biāo)深度鏈接。
在一個實施例中,根據(jù)依賴關(guān)系提取第一函數(shù)依賴的第二函數(shù)和變量的步驟包括:根據(jù)依賴關(guān)系從目標(biāo)頁面的源代碼中以及從與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼中獲取第一函數(shù)依賴的第二函數(shù)和變量。
在本實施例中,獲取到第一函數(shù)的依賴關(guān)系后,根據(jù)該依賴關(guān)系去從目標(biāo)頁面的源代碼中以及從目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼中獲取第一函數(shù)依賴的第二函數(shù)和變量。其中,第一函數(shù)、第二函數(shù)和變量都是以代碼的形式存在的。由于第一函數(shù)依賴的第二函數(shù)可能存在于目標(biāo)頁面中,也可能存在在于目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面中,也有可能有些存在在目標(biāo)頁面,另一些存在在外部頁面,所以獲取第二函數(shù)時,不僅需要從目標(biāo)頁面的源代碼中提取,也需要從與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面中提取。
在一個實施例中,在根據(jù)依賴關(guān)系提取第一函數(shù)依賴的第二函數(shù)和變量的步驟之前還包括:檢測緩存內(nèi)是否存在與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼;若不存在,則獲取與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼,將獲取到的外部頁面的源代碼存入緩存內(nèi)。
在本實施例中,為了能夠更快的提取到第一函數(shù)依賴的第二函數(shù)和變量,需要將與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼提前存入緩存內(nèi),這樣后續(xù)可以直接從緩存內(nèi)的外部頁面的源代碼提取第一函數(shù)依賴的第二函數(shù)和變量,便于提高獲取到速度。由于之前緩存中可能已經(jīng)存在與目標(biāo)深度鏈接相關(guān)的外部頁面的源代碼,所以首先需要檢測緩存內(nèi)是否存在,如果存在就不需要重新獲取直接用就可以了,如果沒有,則獲取與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼,將獲取到的外部頁面的源代碼存入緩存內(nèi)。
如圖4所示,在一個實施例中,提出了一種深度鏈接獲取裝置,該裝置包括:
地址獲取模塊402,用于獲取目標(biāo)頁面的地址。
下載模塊403,用于根據(jù)所述目標(biāo)頁面的地址下載所述目標(biāo)頁面。
配置文件獲取模塊404,用于根據(jù)目標(biāo)頁面的地址獲取適用于目標(biāo)頁面的配置文件。
提取模塊406,用于根據(jù)配置文件中的配置規(guī)則從目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)以及提取解析目標(biāo)數(shù)據(jù)所需要的函數(shù)和變量。
深度鏈接獲取模塊408,用于根據(jù)提取出的目標(biāo)數(shù)據(jù)、函數(shù)和變量獲取目標(biāo)深度鏈接。
如圖5所示,在一個實施例中,深度鏈接獲取模塊408包括:
觸發(fā)代碼獲取模塊408a,用于獲取配置文件中的觸發(fā)代碼。
組合模塊408b,用于將觸發(fā)代碼、解析目標(biāo)數(shù)據(jù)的函數(shù)和變量進行組合得到組合代碼。
調(diào)用模塊408c,用于調(diào)用運行引擎運行組合代碼,根據(jù)運行的結(jié)果解析目標(biāo)數(shù)據(jù)得到目標(biāo)深度鏈接。
如圖6所示,在一個實施例中,提取模塊406包括:
目標(biāo)數(shù)據(jù)提取模塊406a,用于根據(jù)配置文件中預(yù)設(shè)的字段從目標(biāo)頁面中提取與目標(biāo)深度鏈接相關(guān)的目標(biāo)數(shù)據(jù)。
第一函數(shù)提取模塊406b,用于根據(jù)配置文件中預(yù)設(shè)的正則表達(dá)式從目標(biāo)頁面中提取解析目標(biāo)數(shù)據(jù)所需要的第一函數(shù)。
分析模塊406c,用于通過語法分析獲取第一函數(shù)的依賴關(guān)系。
第二函數(shù)提取模塊406d,用于根據(jù)依賴關(guān)系提取第一函數(shù)依賴的第二函數(shù)和變量。
深度鏈接獲取模塊408還用于根據(jù)提取出的目標(biāo)數(shù)據(jù)、第一函數(shù)、第二函數(shù)和變量獲取目標(biāo)深度鏈接。
在一個實施例中,第二函數(shù)提取模塊還用于根據(jù)依賴關(guān)系從目標(biāo)頁面的源代碼中以及從與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼中獲取第一函數(shù)依賴的第二函數(shù)和變量。
如圖7所示,在一個實施例中,上述深度鏈接獲取裝置還包括:
檢測模塊410,用于檢測緩存內(nèi)是否存在與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼。
存入模塊412,用于若緩存內(nèi)不存在外部頁面的源代碼則獲取與目標(biāo)深度鏈接相關(guān)聯(lián)的外部頁面的源代碼,將獲取到的外部頁面的源代碼存入緩存內(nèi)。
以上所述實施例的各技術(shù)特征可以進行任意的組合,為使描述簡潔,未對上述實施例中的各個技術(shù)特征所有可能的組合都進行描述,然而,只要這些技術(shù)特征的組合不存在矛盾,都應(yīng)當(dāng)認(rèn)為是本說明書記載的范圍。
以上所述實施例僅表達(dá)了本發(fā)明的幾種實施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進,這些都屬于本發(fā)明的保護范圍。因此,本發(fā)明專利的保護范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。