以下に、開示する抽出装置、抽出方法及び抽出プログラムの実施例について、図面に基づいて詳細に説明する。なお、本実施例により開示する発明が限定されるものではない。各実施例は、処理内容を矛盾させない範囲で適宜組み合わせることが可能である。
[実施例2に係る抽出装置の構成]
実施例2に係る抽出装置200について示す。図5は、実施例2に係る抽出装置の構成の一例を示すブロック図である。図5に示す例では、抽出装置200は、Webページデータ記憶部211と、XSLデータ記憶部212と、XSL選択ルールデータ記憶部213と、抽出済データ記憶部214と、構造変化データ記憶部215とを有する。また、抽出装置200は、データ抽出部300と、ルール作成部400と、構造変化検出部500とを有する。
Webページデータ記憶部211は、データ抽出部300と、ルール作成部400と、構造変化検出部500と接続される。Webページデータ記憶部211は、例えば、RAM(Random Access Memory)や、フラッシュメモリ(Flash Memory)などの半導体メモリ素子、又は、ハードディスクや光ディスクなどの記憶装置が該当する。
Webページデータ記憶部211は、ツリー構造を有するWebページと、WebページのURLとを対応付けて記憶する。図6は、実施例2におけるWebページデータ記憶部により記憶された情報の一例を示す図である。図6に示す例では、Webページデータ記憶部211は、Webページを一意に識別する「WebページID」と、Webページの「URL」と、Webページの「ページソース」とを含むレコードを記憶する。
図6に示す例では、Webページデータ記憶部211は、WebページID「1」とURL「http://aaa.com/item_detail?code=a001」とページソース「<html><head...〜</htm>」とを含むレコードを記憶する。すなわち、Webページデータ記憶部211は、WebページID「1」により識別されるWebページのURLが「http://aaa.com/item_detail?code=a001」であることを示すレコードであって、Webページのページソースが「<html><head ...〜</htm>」であることを示すレコードを記憶する。
なお、Webページデータ記憶部211に記憶されるレコードは、例えば、抽出装置200の管理者によって格納され、抽出装置200が適宜自動的にクロールすることで得られたレコードが抽出装置200自身によって格納される。
XSLデータ記憶部212は、データ抽出部300、ルール作成部400及び構造変化検出部500と接続される。XSLデータ記憶部212は、例えば、RAMや、フラッシュメモリなどの半導体メモリ素子、又は、ハードディスクや光ディスクなどの記憶装置が該当する。
XSLデータ記憶部212は、Webページからデータを抽出するための抽出ルールを記憶する。また、XSLデータ記憶部212は、抽出ルールとして、Webページのツリー構造により一意に決定されるルールを複数含む抽出ルール群を記憶する。
図7は、実施例2におけるXSLデータ記憶部により記憶された情報の一例を示す図である。図7に示す例では、XSLデータ記憶部212は、XSLを用いた抽出ルールを一意に識別する「XSLID」と、XSLを用いた抽出ルールとなる「XSLコード」とを含むレコードを記憶する。
図7に示す例では、XSLデータ記憶部212は、XSLID「1」と、XSLコード「<?xml version=“1.0”encoding=“UTF-8”?><xsl:stylesheet...〜</xsl:stylesheet>」とを含むレコードを記憶する。また、XSLデータ記憶部212は、同様に、他のXSLIDについても、XSLコードを記憶する。なお、図7に示す例では、説明の便宜上、XSLコードの一部を「...」と記載して省略した。なお、XSLデータ記憶部212に記憶されるレコードは、例えば、後述するルール作成部400によって格納され、抽出装置200の管理者によって格納される。
ここで、XSLコードの一例について更に詳細に説明する。図8は、実施例2におけるXSLデータの一例を示す図である。図8に示す例では、Webページのツリー構造により一意に決定されるルールを複数含むXSLコードを例に示すが、本発明はこれに限定されるものではなく、1つのルールを含むXSLコードであっても良い。
図8の601〜604は、WebページのXML構造を特定するルールであり、611〜613は、WebページのXML構造により一意に決定されるルールを示す。図8に示す例では、601は、「/html/body/table/tr/td」が3つあるXML構造を特定するルールである。602は、「/html/body/table/tr/td」が2つあるXML構造を特定するルールである。603は、「/html/head/title」が「colors」であるXML構造を特定するルールである。604は、「/html/head/title」が「animals」であるXML構造を特定するルールである。611は、3つ目の「/html/body/table/tr/td」からデータを抽出することを示すルールである。612は、2つ目の「/html/body/table/tr/td」からデータを抽出することを示すルールである。613は、1つ目の「/html/body/table/tr/td」からデータを抽出することを示すルールである。
ここで、図9と図10とを用いて、ページソースの具体的な一例をあげて、図8のXSLコードにより抽出されるデータの一例を示す。図9及び図10は、実施例2におけるページソースの具体的な一例を示す。図8のXSLコードでは、まず、図8の601に示すルールによりWebページが特定されるかについて判定される。ここで、図9のページソースには、「/html/body/table/tr/td」が3つある。この結果、図9のページソースからは、図8の611に示すルールに従って、図9の621に示すように、3つ目の「/html/body/table/tr/td」にある「<td>banana</td>」が抽出される。
また、図10のページソースのように、「/html/body/table/tr/td」が3つある場合には、Webページは、図8の601に示すルールでは特定されず、図8の602に示すルールにより特定される。ここで、図10に示す例では、「/html/head/title」は「animals」となっており、図8の604に示すルールに従って、図10の622に示すように、1つ目の「/html/body/table/tr/td」から「<td>dog</td>」が抽出される。
なお、実施例2では、XSLを用いる抽出ルールを用いる場合を例に説明するが、本発明はこれに限定されるものではなく、任意の抽出ルールを用いて良い。
XSL選択ルールデータ記憶部213は、データ抽出部300、ルール作成部400及び構造変化検出部500と接続される。XSL選択ルールデータ記憶部213は、例えば、RAMや、フラッシュメモリなどの半導体メモリ素子、又は、ハードディスクや光ディスクなどの記憶装置が該当する。
XSL選択ルールデータ記憶部213は、抽出ルールと対応付けて、WebページのURLに基づいて抽出ルールの適用対象となるWebページを特定する特定ルールを記憶する。図11は、実施例2におけるXSL選択ルールデータ記憶部に記憶された情報の一例を示す図である。図11に示す例では、XSL選択ルールデータ記憶部213は、特定ルールを一意に識別する「ルールID」と、URLを用いた特定ルールとなる「URLルール」と、「XSLID」とを含むレコードを記憶する。ここで、XSL選択ルールデータ記憶部213の「XSLID」は、XSLデータ記憶部212の「XSLID」に対応し、特定ルールとなる「URLルール」により特定されるWebページが適用対象となるXSLコードを示す。
図11に示す例では、URLルールとして、正規表現を用いる場合を示したが、本発明はこれに限定されるものではなく、正規表現を用いなくても良い。図11に示す例では、XSL選択ルールデータ記憶部213は、ルールID「1」に対応付けて、URLルール「https?://aaa\.com/item_detail\?code=.*」とXSLID「1」とを含むレコードを記憶する。すなわち、XSL選択ルールデータ記憶部213は、「https://aaa.com/item_detail?code=」と前方一致するURLに紐付けられたWebページと、「http://aaa.com/item_detail?code=」と前方一致するURLに紐付けられたWebページとを特定するURLルールを記憶する。また、XSL選択ルールデータ記憶部213は、XSLID「1」のレコードに含まれるURLルールが、XSLID「1」により識別されるXSLコードによる適用対象となるWebページを特定することを記憶する。
また、図11に示す例では、適用順位をルールIDの大小関係で表す場合を例に示した。すなわち、複数のURLルールにより特定されるWebページについては、ルールIDが小さいURLルールを優先する場合を例に示した。ただし、本発明はこれに限定されるものではなく、ルールIDの大小関係以外の情報を用いて適用順位を決定しても良く、任意の情報を用いて良い。なお、XSL選択ルールデータ記憶部213に記憶されるレコードは、例えば、後述するルール作成部400によって格納され、抽出装置200の管理者によって格納される。
抽出済データ記憶部214は、データ抽出部300と接続される。抽出済データ記憶部214は、例えば、RAMや、フラッシュメモリなどの半導体メモリ素子、又は、ハードディスクや光ディスクなどの記憶装置が該当する。
抽出済データ記憶部214は、データ抽出部300によりWebページから抽出されたデータを記憶する。図12は、実施例2における抽出済データ記憶部に記憶された情報の一例を示す図である。図12に示す例では、抽出済データ記憶部214は、「WebページID」と対応付けて、データ抽出部300により抽出されたデータである「XML出力」を記憶する。ここで、図12のWebページIDは、図6のWebページIDと対応する。また、図12に示す例では、データ抽出部300から出力されたデータがXML形式である場合を示したが、本発明はこれに限定されるものではなく、データ抽出部300から出力されたデータの形式は、テキスト形式であっても良く、任意の形式であって良い。
図12に示す例では、抽出済データ記憶部214は、WebページID「1」と、XML出力「<?xml version=“1.0” encoding=“UTF-8”?><item><code>a001</code>...〜</item>」とを含むレコードを記憶する。すなわち、抽出済データ記憶部214は、WebページID「1」により特定されるWebページから抽出されたデータとして、「<?xml version=“1.0” encoding=“UTF-8”?><item><code>a001</code>...〜</item>」を記憶する。なお、図12に示す例では、記載の便宜上、実際に出力されるデータの一部を「...」を用いて省略して記載した。
構造変化データ記憶部215は、構造変化検出部500と接続される。構造変化データ記憶部215は、例えば、RAMや、フラッシュメモリなどの半導体メモリ素子、又は、ハードディスクや光ディスクなどの記憶装置が該当する。
構造変化データ記憶部215は、構造変化検出部500による処理結果を記憶する。図13は、実施例2における構造変化データ記憶部により記憶された情報の一例を示す図である。図13に示す例では、構造変化データ記憶部215は、「WebページID」と、「XSLID」と、「XSLエラー」と、「新XSLID」とを含むレコードを記憶する。
ここで、構造変化データ記憶部215の「WebページID」は、構造変化検出部500による処理対象となったWebページを示す。構造変化データ記憶部215の「XSLID」は、構造変化データ記憶部215のWebページIDにより示されるWebページに対してURLルールに基づいて選択されたXSLコードを示す。「XSLエラー」は、構造変化検出部500による処理結果を示し、構造変化データ記憶部215の「XSLID」により示されるXSLコードを用いてのXSLT処理によりエラーが起きたか否かを示す。図13に示す例では、XSLエラー「YES」は、エラーが起きたことを示し、XSLエラー「NO」は、エラーが起きなかったことを示す。「新XSLID」は、構造変化検出部500による処理結果を示し、構造変化データ記憶部215の「WebページID」に適用してもエラーが起きないXSLコードを示す。なお、ここで、図13において、XSLID「NULL」は、紐付けられたWebページIDについてXSLコードが何も選択されていないことを示す。また、XSLエラー「NULL」は、エラーの有無についての情報が何も格納されていないことを示す。図13のWebページID「4」に示す例では、XSLコードが何も選択されていない結果、エラーの有無についても何ら情報がなく、XSLエラー「NULL」となっている。
図13に示す例では、構造変化データ記憶部215は、WebページID「2」とXSLID「1」とXSLエラー「YES」と新XSLID「3」とを含むレコードを記憶する。すなわち、構造変化データ記憶部215は、WebページID「2」により示されるWebページに、URLルールに基づいて、XSLID「1」により示されるXSLコードが選択されたことを記憶する。また、構造変化データ記憶部215は、WebページID「2」により示されるWebページに、XSLID「1」により示されるXSLコードが適用するとエラーが起こったことを記憶し、XSLID「3」により示されるXSLコードを適用するとエラーが起こらなかったことを記憶する。
なお、構造変化データ記憶部215に記憶されたレコードは、構造変化検出部500により格納される。また、図13を用いて、構造変化検出部500による処理結果の一例を示したが、本発明はこれに限定されるものではなく、構造変化検出部500による処理結果は任意で良く、図13に示す処理結果の形式に限定されるものではない。
[データ抽出部]
図5の説明に戻り、データ抽出部300について説明する。データ抽出部300は、Webページデータ記憶部211、XSLデータ記憶部212及びXSL選択ルールデータ記憶部213と接続される。データ抽出部300は、各種の処理手順などを規定したプログラムを記憶する内部メモリを有し、種々の処理を制御する。データ抽出部300は、例えば、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)、CPU(Central Processing Unit)、MPU(Micro Processing Unit)などの電子回路が該当する。
図14は、実施例2におけるデータ抽出部について示すブロック図である。図14では、説明の便宜上、Webページデータ記憶部211と、XSLデータ記憶部212と、XSL選択ルールデータ記憶部213と、抽出済データ記憶部214とを併せて示した。図14に示す例では、データ抽出部300は、XSL選択データメモリ311と、XSL選択部321と、XSLT処理部322とを有する。
XSL選択データメモリ311は、例えば、RAMやフラッシュメモリなどの半導体メモリ素子が該当する。XSL選択データメモリ311は、XSL選択部321による処理結果を記憶する。具体的には、XSL選択データメモリ311は、抽出対象となるWebページについて、URLルールに基づいてXSL選択部321により選択されたXSLコードを記憶する。
図15は、実施例2におけるXSL選択データメモリに記憶された情報の一例を示す図である。図15に示す例では、XSL選択データメモリ311は、WebページIDに対応付けて、XSLコードを記憶する。ここで、XSL選択データメモリ311のWebページIDは、抽出対象となるWebページを示し、XSL選択データメモリ311のXSLコードは、XSLデータ記憶部212に記憶されたXSLコードのうち、XSL選択部321により選択されたXSLコードを示す。
図15に示す例では、XSL選択データメモリ311は、WebページID「1」とXSLコード「<?xml version=“1.0” encoding=“UTF-8”?><xsl:stylesheet ...〜</xsl:stylesheet>」とを含むレコードを記憶する。すなわち、XSL選択データメモリ311は、WebページID「1」により示されるWebページについて、XSL選択部321によりXSLコード「<?xml version=“1.0” encoding=“UTF-8”?><xsl:stylesheet ...〜</xsl:stylesheet>」が選択されたことを記憶する。
XSL選択部321は、抽出対象となるWebページが入力されると、入力されたWebページに紐付けられたURLが特定される特定ルールをXSL選択ルールデータ記憶部213から選択する。そして、XSL選択部321は、選択した特定ルールに対応付けられた抽出ルールをXSLデータ記憶部212から選択する。
例えば、抽出対象となるWebページのURLが「https://aaa.com/item_detail?code=〜」である場合を用いて説明する。この場合、抽出対象となるWebページのURLはURLルール「https?://aaa\.com/item_detail\?code=.*」により特定され、XSL選択部321は、URLルール「https?://aaa\.com/item_detail\?code=.*」をXSL選択ルールデータ記憶部213から選択する。そして、XSL選択部321は、選択したURLルール「https?://aaa\.com/item_detail\?code=.*」に対応付けられたXSLID「1」をXSL選択ルールデータ記憶部213から取得する。そして、XSL選択部321は、XSLID「1」に対応付けられたXSLコード「<?xml version=“1.0” encoding=“UTF-8”?><xsl:stylesheet ...〜</xsl:stylesheet>」をXSLデータ記憶部212から選択する。
また、例えば、XSL選択部321は、抽出対象となるWebページのWebページIDと選択したXSLコードとを含むレコードを、XSL選択データメモリ311に格納する。より詳細な一例をあげて説明すると、XSL選択部321は、WebページID「1」とXSLコード「<?xml version=“1.0” encoding=“UTF-8”?><xsl:stylesheet ...〜</xsl:stylesheet>」とを含むレコードを格納する。なお、XSL選択部321による処理の詳細な流れの一例については、フローチャートを用いて後述するため、ここでは説明を省略する。
XSLT処理部322は、XSL選択部321により選択された抽出ルールに基づいて抽出処理を実行することで、抽出対象のWebページからデータを抽出する。また、XSL選択部321により抽出ルール群が選択された場合には、XSLT処理部322は、抽出対象となるWebページのツリー構造を識別し、識別したツリー構造に対応するツリー構造対応抽出ルールを抽出ルール群から選択する。そして、XSLT処理部322は、選択したツリー構造対応抽出ルールに基づいて抽出処理を実行することで、抽出対象のWebページからデータを抽出する。
具体的には、XSLT処理部322は、XSL選択データメモリ311からレコードを読み出し、読み出したレコードに含まれるWebページIDに対応付けられたWebページのページソースをWebページデータ記憶部211から読み出す。そして、XSLT処理部322は、読み出したWebページのページソースに対して、読み出したレコードに含まれるXSLコードを用いてXSLT処理を実行することで、Webページからデータを抽出する。例えば、XSLT処理部322は、XSLT処理を実行することで、XSLTコードに含まれるXpathにより指定される箇所からデータを抽出する。
例えば、XSLT処理部322は、WebページID「1」に対応付けられたページソース「<html><head ...〜</htm>」に対して、XSLコード「<?xml version=“1.0” encoding=“UTF-8”?><xsl:stylesheet ...〜</xsl:stylesheet>」を用いてXSLT処理を実行する。
なお、XSLT処理は、JISX4169などの標準に適合したXSLT処理であれば任意の手法を用いて実行して良い。また、ルールとしてXpathを複数含む抽出ルール群である場合には、XSLT処理を実行する過程において、抽出対象となるWebページのページソースに基づいて、処理に用いられるXpathが一意に決定され、一意に決定されたXpathにより指定される箇所にあるデータが抽出される。
また、XSLT処理部322は、処理結果を抽出済データ記憶部214に格納する。例えば、XSLT処理部322は、WebページID「1」により示されるWebページに対してXSLT処理を実行することで得られたXML出力「<?xml version=“1.0” encoding=“UTF-8”?><item><code>a001</code>...〜</item>」と、WebページID「1」とを含むレコードを格納する。なお、XSLT処理部322による処理の詳細な流れの一例については、フローチャートを用いて後述するため、ここでは説明を省略する。
[ルール作成部]
図5の説明に戻り、ルール作成部400について説明する。ルール作成部400は、Webページデータ記憶部211、XSLデータ記憶部212及びXSL選択ルールデータ記憶部213と接続される。ルール作成部400は、各種の処理手順などを規定したプログラムを記憶する内部メモリを有し、種々の処理を制御する。ルール作成部400は、例えば、ASIC、FPGA、CPU、MPUなどの電子回路が該当する。
ルール作成部400は、Webページデータ記憶部211に記憶されたWebページ各々のツリー構造を比較することで、ツリー構造が類似するWebページ群を取得し、取得したWebページ群に含まれるWebページ各々のツリー構造に共通する部分からデータを抽出する抽出ルールを作成する。また、ルール作成部400は、抽出ルールが作成されたWebページ群に含まれるWebページ各々に対応付けられたURLをWebページデータ記憶部211から取得し、取得したURL各々に基づいて特定ルールを作成する。そそして、ルール作成部400は、抽出ルールと特定ルールとを対応付けて格納する。
ここで、ルール作成部400によるルール作成対象のWebページは、Webページデータ記憶部211に予め記憶されている場合に限定されるものではなく、適宜自動的にクロールしたものを用いても良く、追加収集したものを用いても良い。また、ルールを作成するためのWebページ群と、ルールに基づいた抽出処理対象となるWebページ群とは、同一であっても良く、同一とはならなくても良い。例えば、収集したWebページ群の一部のみを用いてルールを作成し、作成したルールを用いて、残りのWebページ群又は収集した全Webページ群に対して、抽出処理を実施しても良い。
図16は、実施例2におけるルール作成部の構成の一例を示すブロック図である。図16では、説明の便宜上、Webページデータ記憶部211と、XSLデータ記憶部212と、XSL選択ルールデータ記憶部213とを併せて示した。図16に示す例では、ルール作成部400は、DOM(Document Object Model)ツリーデータメモリ411と、部分木ハッシュデータメモリ412と、共通ツリーデータメモリ413と、ツリー変換部421と、部分木ハッシュ生成部422と、共通ツリー抽出部423と、XSL生成部424とを有する。
DOMツリーデータメモリ411は、例えば、RAMやフラッシュメモリなどの半導体メモリ素子が該当する。DOMツリーデータメモリ411は、WebページデータのDOMツリーデータを記憶する。すなわち、Webページのツリー構造に含まれるノード各々についての情報を記憶する。DOMツリーデータメモリ411は、ツリー変換部421によりDOMツリーデータが格納され、部分木ハッシュ生成部422により用いられる。
図17は、実施例2におけるDOMツリーデータメモリに記憶された情報の一例を示す図である。図17に示す例では、DOMツリーデータメモリ411は、「WebページID」と、「ノードID」と、「親ノードID」と、「要素名」と、「要素位置」と、「Xpath」とを含むレコードを記憶する。
ここで、DOMツリーデータメモリ411の「WebページID」は、Webページデータ記憶部211のWebページIDと同一であり、WebページID「2」を含むレコードは、Webページデータ記憶部211のWebページID「2」に対応付けられたページソースについてのDOMツリーデータであることを示す。
「ノードID」は、Webページのツリー構造に含まれるノードを識別する。具体的には、「ノードID」は、DOMツリーデータメモリ411に記憶されたWebページIDが同じレコードの中で、レコードを一意に特定するための情報である。例えば「1」から始まる連番などを用いて良く、任意の情報を用いて良い。ただし、ノードがルートノードである場合には、親ノードIDを「0」とする。「親ノードID」は、ノードIDにより識別されるノードの親ノードを識別する。「要素名」は、ノードの要素名を識別する。「要素位置」は、要素名で識別される要素が親ノードIDにより識別される親ノード配下にて何回目に登場したものかを示す。「Xpath」は、ノードIDにより識別されるノードの位置を示す。
図17に示す例では、DOMツリーデータメモリ411は、WebページID「2」と、ノードID「3」と、親ノードID「2」と、要素名「title」と、要素位置「1」と、Xpath「/html[1]/head[1]/title[1]」とを含むレコードを記憶する。
ここで、図18を用いて、Xpathにより示されるページソース内の位置について簡単に示す。図18は、実施例2におけるページソースの一例を示す図である。図18に示すページソースの一例は、WebページID「2」に対応付けられたWebページのページソースである。図18の631は、Xpath「/html[1]/head[1]/title[1]」により示される位置であり、図18の632は、Xpath「/html[1]/body[1]/table[1]/tr[1]/td[2]」により示される位置である。
部分木ハッシュデータメモリ412は、例えば、RAMやフラッシュメモリなどの半導体メモリ素子が該当する。部分木ハッシュデータメモリ412は、DOMツリーデータメモリ411に記憶されたレコード各々について算出されるハッシュ値と、ノードのサイズを示す「部分木サイズ」とを記憶する。
図19は、実施例2における部分木ハッシュデータメモリに記憶された情報の一例を示す図である。図19に示す例では、部分木ハッシュデータメモリ412は、「WebページID」と「ノードID」と「Xpath」と「ハッシュ値」と「部分木サイズ」とを含むレコードを記憶する。図19の「WebページID」と「ノードID」と「Xpath」とは、DOMツリーデータメモリ411の「WebページID」と「ノードID」と「Xpath」とに対応する。部分木ハッシュデータメモリ412は、部分木ハッシュ生成部422によってレコードが格納され、共通ツリー抽出部423とXSL生成部424とにより用いられる。
図19に示す例では、部分木ハッシュデータメモリ412は、WebページID「2」とノード「1」とXpath「/html[1]」とハッシュ値「4AAQSkZJRgAB...」と部分木サイズ「178」とを含むレコードを記憶する。すなわち、部分木ハッシュデータメモリ412は、WebページID「2」とノード「1」について算出されたハッシュ値が「4AAQSkZJRgAB...」であり、サイズが「178」であることを記憶する。ここで、ノードID「1」のXpathは「/html[1]」であり、ノードID「1」について算出されたハッシュ値は、図18における「<html>」と「<html>」との間にあるタグ各々を入力として算出された値を示す。すなわち、ハッシュ値を算出する際に用いられるデータは、図18に示す例では、「<html>」「<head>」「<title>」などのタグであって、「<title>」にあるデータ「sample」や「<td>」にあるデータ「fruits」などについては用いられない。
また、ノード「1」について算出された部分木サイズは、図18における「<html>」と「<html>」との間にあるデータのサイズの合計を示す。また、同様に、ノードID「2」のXpathは「/html[1]/head[1]」であり、ノードID「2」について算出されたハッシュ値は、図18における「/html[1]/head[1]」と「/html[1]/head[1]」との間にあるタグ各々を入力として算出された値を示す。
共通ツリーデータメモリ413は、例えば、RAMやフラッシュメモリなどの半導体メモリ素子が該当する。共通ツリーデータメモリ413は、ハッシュ値と部分木ハッシュ値と「行数」と「累積サイズ」とを含むレコードを記憶する。ハッシュ値と部分木ハッシュ値とは、部分木ハッシュデータメモリ412のハッシュ値と部分木ハッシュ値と同一である。「行数」は、同一のハッシュ値を有するレコードの数を示す。「累積サイズ」は、行数と部分木サイズとを乗算した値を示す。共通ツリーデータメモリ413は、共通ツリー抽出部423によりレコードが格納され、XSL生成部424によりレコードが用いられる。
図20は、実施例2における共通ツリーデータメモリに記憶された情報の一例を示す図である。図20に示す例では、共通ツリーデータメモリ413は、ハッシュ値「4AAQSkZJRgAB...」と部分木サイズ「178」と行数「1」と累積サイズ「178」とを含むレコードを記憶する。すなわち、ハッシュ値「4AAQSkZJRgAB...」を含むレコードが部分木ハッシュデータメモリ412には「1」あり、累積サイズが「178」であることを記憶する。
また、図20に示す例では、共通ツリーデータメモリ413は、ハッシュ値「QEAYABgAAD2w...」と部分木サイズ「2」と行数「58」と累積サイズ「116」とを含むレコードを記憶する。すなわち、ハッシュ値「QEAYABgAAD2w...」を含むレコードが部分木ハッシュデータメモリ412には「58」あり、累積サイズが「116」であることを記憶する。
ここで、行数が「1」以上になる場合について簡単に付言する。ハッシュ値は、算出対象となるデータが異なる場合には、異なる値となる。「行数」が「1」以上の値を取るということは、同一のハッシュ値が算出されたノードが複数あるということになり、ハッシュ値の算出対象となったタグの組み合わせが同一となるレコードが複数あったことを示す。言い換えると、タグの下位構造が同一となるレコードが複数あることを示す。
ツリー変換部421は、Webページデータ記憶部211に記憶されたレコードを取得し、取得したレコードに含まれるページソースに対してパース処理を実行することで、ページソースをDOMツリーデータに変換する。そして、ツリー変換部421は、変換したDOMツリーデータをDOMツリーデータメモリ411に格納する。
ここで、ツリー変換部421によるパース処理は、「TR X 0065:2002」などの標準に適合したパース処理であれば任意の手法を用いて良い。なお、ツリー変換部421による処理の詳細な流れの一例については、フローチャートを用いて後述するため、ここでは説明を省略する。
部分木ハッシュ生成部422は、DOMツリーデータメモリ411に記憶されたレコードを取得し、取得したレコードに含まれるノードについて、ハッシュ値と部分木サイズとを算出する。そして、部分木ハッシュ生成部422は、算出したハッシュ値と部分木サイズとを含むレコードを部分木ハッシュデータメモリ412に格納する。また、その際、部分木ハッシュ生成部422は、取得したレコードに含まれるWebページIDとノードIDとXpathとを併せて格納する。なお、部分木ハッシュ生成部422による処理の詳細な流れの一例については、フローチャートを用いて後述するため、ここでは説明を省略する。
共通ツリー抽出部423は、部分木ハッシュデータメモリ412に格納されたレコードのうち、ハッシュ値が同一となるレコードをまとめた上で、共通ツリーデータメモリ413に格納する。共通ツリー抽出部423による処理の詳細な流れの一例については、フローチャートを用いて後述するため、ここでは説明を省略する。
XSL生成部424は、Webページのツリー構造を比較することで、ツリー構造が類似するWebページ群を取得し、取得したWebページ群に含まれるWebページ各々のツリー構造に共通する部分からデータを抽出する抽出ルールを作成する。具体的には、XSL生成部424は、Webページのツリー構造を比較することで同一の下位構造を含むツリー構造を有するWebページ群を取得し、取得したWebページ群に含まれるWebページのツリー構造に共通するXpathからデータを抽出する抽出ルールを作成する。
より詳細には、XSL生成部424は、共通ツリーデータメモリ413からレコードを1つ抽出し、抽出したレコードに含まれるハッシュ値と同一のハッシュ値を有するレコードを部分木ハッシュデータメモリ412から取得する。ここで、ハッシュ値が同一となるレコード各々は、下位構造が同一となるノードについてのレコードとなり、XSL生成部424は、同一の下位構造を含むツリー構造を有するWebページ群を取得することになる。
XSL生成部424は、取得したレコードに含まれるXpathのうち最も出現回数が多いXpathからデータを抽出する抽出ルールを作成する。すなわち、最も出現回数が多いXpathを選択することで、他のWebページからデータが抽出される可能性が高いXpathからデータを抽出する抽出ルールを作成する。なお、以下では、最も出現回数が多いXpathを用いる場合を用いて説明するが、本発明はこれに限定されるものではない。例えば、2番目に出願回数が多いXpathを用いても良く、出願回数ではなく出現頻度を用いても良く、任意の手法を用いて良い。
図21は、実施例2におけるXSL生成部によるXSLコード生成について示す図である。例えば、XSL生成部424は、図21に示すテンプレートを用いて、XSLコードを生成する。具体的には、XSL生成部424は、最も出現回数が多いXpathを図21の[MP]に挿入することで、XSLコードを生成する。XSL生成部424は、予めテンプレートが設定されることで、XSLコードを簡単に作成可能となる。ただし、本発明はこれに限定されるものではなく、XSL生成部424は、テンプレートを用いることなく、任意の手法にてXSLコードを生成して良い。
なお、図21に示す例では、1つのルールを含むXSLコードを生成する場合を示した。ただし、上述したように、本発明はこれに限定されるものではなく、複数のルールを含むXSLコードとしても良い。この場合、例えば、XSL生成部424は、取得したWebページ群をツリー構造ごとに更に分類し、分類したツリー構造ごとにXpathを取得する。そして、XSL生成部424は、分類したツリー構造を識別するルールとXpathとを紐付けた上で、複数のXpathを含むXSLコードを生成する。
また、XSL生成部424は、抽出ルールが作成されたWebページ群に含まれるWebページ各々に対応付けられたURLをWebページデータ記憶部211から取得し、取得したURL各々に基づいて特定ルールを作成する。例えば、XSL生成部424は、取得したURLに共通する部分や高頻度にて出現する部分を取得し、取得した部分と一致するURLに紐付けられたWebページを特定する特定ルールを生成する。ここで、XSL生成部424は、取得した部分と正規表現とを組み合わせた特定ルールを生成する。例えば、XSL生成部424は、取得した部分がURLの先頭に出願する場合には、先頭一致を示す正規表現と取得した部分とを組み合わせた特定ルールを生成する。
また、XSL生成部424は、生成した抽出ルールをXSLデータ記憶部212に格納し、生成した抽出ルールと特定ルールとを対応付けてXSL選択ルールデータ記憶部213に格納する。なお、XSL生成部424による処理の詳細な流れの一例については、フローチャートを用いて後述するため、ここでは説明を省略する。
[構造変化検出部]
図5の説明に戻り、構造変化検出部500について説明する。構造変化検出部500は、Webページデータ記憶部211、XSLデータ記憶部212、XSL選択ルールデータ記憶部213及び構造変化データ記憶部215と接続される。構造変化検出部500は、各種の処理手順などを規定したプログラムを記憶する内部メモリを有し、種々の処理を制御する。構造変化検出部500は、例えば、ASIC、FPGA、CPU、MPUなどの電子回路が該当する。
構造変化検出部500は、Webページのツリー構造が過去のWebページのツリー構造と比較して変化したか否かを検出する。具体的には、構造変化検出部500は、Webページデータ記憶部211に既に記憶されているWebページのツリー構造と、新たに取得したツリー構造とを比較することで、Webページのツリー構造に変化があるか否かを検出する。例えば、構造変化検出部500は、XSLT処理を実行した際にエラーが発生するか否かに基づいて、構造変化の有無を検出する。
また、構造変化検出部500は、所定の間隔で定期的に保存済のWebページのURLへアクセスすることでWebページを取得して処理を実行しても良く、Webページを管理するサーバ側から送信を受けることでWebページを取得しても良い。
図22は、実施例2における構造変化検出部の構成の一例を示すブロック図である。図22では、説明の便宜上、Webページデータ記憶部211と、XSLデータ記憶部212と、XSL選択ルールデータ記憶部213と、構造変化データ記憶部215とを併せて示した。図22に示す例では、構造変化検出部500は、XSL選択データメモリ511と、XSL選択部521と、XSLTエラー検出部522とを有する。
ここで、XSL選択データメモリ511とXSL選択部521とは、それぞれ、XSL選択部321とXSL選択データメモリ311と対応するため、説明を省略する。なお、図22に示す例では、XSL選択データメモリ311とXSL選択データメモリ511とを別の部として記載し、XSL選択部521とXSL選択部321とを別の部として記載したが、本発明はこれに限定されるものではなく、XSL選択データメモリ311とXSL選択データメモリ511とを統合し、XSL選択部521とXSL選択部321とを統合しても良い。
XSLTエラー検出部522は、XSL選択データメモリ511に記憶されたレコードを取得し、取得したレコードに含まれるXSLコードを用いて、レコードに含まれるWebページIDにより識別されるWebページに対してXSLT処理を実行する。そして、XSLT処理にエラーが発生すると、その旨を構造変化データ記憶部215に格納する。
また、XSLTエラー検出部522は、エラーが発生した旨を格納したレコードについて、XSLデータ記憶部212に記憶されたXSLコードのうち、適用可能なXSLコードを判別する。そして、XSLTエラー検出部522は、判別したXSLコードのXSLIDを構造変化データ記憶部215に格納する。
すなわち、過去のWebページと比較してツリー構造が変化すると、過去のWebページに適用したXSLコードを用いてもデータが抽出されないことがある。このことを踏まえ、XSLTエラー検出部522は、XSLT処理にてエラーが発生するか否かに基づいて処理を実行し、エラーが起きたWebページについて適用可能なXSLコードを判別して対応付けて構造変化データ記憶部215に対応付けて格納する。XSLTエラー検出部522による処理の詳細な流れの一例については、フローチャートを用いて後述するため、ここでは説明を省略する。
なお、抽出装置200は、例えば、既知のパーソナルコンピュータ、携帯電話、PHS(Personal Handyphone System)端末、移動体通信端末又はPDA(Personal Digital Assistant)などの情報処理装置を利用して実現しても良い。この場合、例えば、PDAなどの情報処理装置に、図5に示した各部に対応する機能を搭載することで実現して良い。
[実施例2に係る抽出装置による処理]
実施例2に係る抽出装置200の各部による処理の詳細な流れの一例について示す。以下では、XSL選択部321、XSLT処理部322、ツリー変換部421、部分木ハッシュ生成部422、共通ツリー抽出部423、XSL生成部424、XSLTエラー検出部522について、順に説明する。
[実施例2におけるXSL選択部による処理]
図23は、実施例2におけるXSL選択部による処理の詳細な流れの一例を示す図である。図23に示すように、XSL選択部321は、処理タイミングとなると、Webページデータを全て処理したかを判定する(ステップS301)。具体的には、Webページデータ記憶部211に記憶されたレコード全てについてXSLコードを選択したかを判定する。ここで、処理していないと判定した場合には(ステップS301否定)、XSL選択部321は、Webページデータから1行取り出し、PLとする(ステップS302)。例えば、XSL選択部321は、WebページID「1」を含むレコードを取得する。
なお、「PL」は変数を示す。以下では、「(変数を示す語句)とする」という表現は、変数への代入を示すものとして説明する。すなわち、ステップS302に示す例では、「Webページデータから1行取り出し、変数PLに代入する」ことを示すものとして説明する。
そして、XSL選択部321は、XSL選択ルールデータ記憶部213のURLルールに、PLのURLとマッチするものがあるか否かを判定する(ステップS303)。すなわち、抽出対象となるWebページのURLが特定ルールにより特定されるか否かを判定する。ここで、XSL選択部321は、PLのURLとマッチするURLルールがないと判定した場合には(ステップS303否定)、ステップS301に戻り、処理を繰り返す。
一方、XSL選択部321は、PLのURLとマッチするURLルールがあると判定した場合には(ステップS303肯定)、マッチしたXML選択ルールデータの中で、ルールIDが最小の行のXSLIDをSRとする(ステップS304)。なお、「SR」は変数を示す。すなわち、XSL選択部321は、複数のURLルールがマッチする場合には、適用順位が高いURLルールを選択する。例えば、XSL選択部321は、WebページID「1」を含むレコードのWebページのURLが、ルールID「1」と「10」との両方により特定される場合には、ルールID「1」を選択し、ルールID「1」を含むレコードに含まれるXSLID「1」を選択し、SRとする。
そして、XSL選択部321は、XSLデータの中でXSLIDがSRに一致する行のXSLコードと、PLのWebページIDとをXSL選択データメモリ311に格納する(ステップS305)。すなわち、例えば、XSL選択部321は、XSLデータ記憶部212に記憶されたXSLコードのうち、XSLID「1」に対応付けられたXSLコード「<?xml version=“1.0” encoding=“UTF-8”?><xsl:stylesheet ...〜</xsl:stylesheet>」を取得する。そして、XSL選択部321は、取得したXSLコード「<?xml version=“1.0” encoding=“UTF-8”?><xsl:stylesheet ...〜</xsl:stylesheet>」とWebページID「1」とを含むレコードをXSL選択データメモリ311に格納する。そして、XSL選択部321は、ステップS301に戻り処理を繰り返す。
また、ステップS301において、Webページデータを全て処理したと判定すると(ステップS301肯定)、処理を終了する。
[実施例2におけるXSLT処理部による処理]
図24は、実施例2におけるXSLT処理部による処理の詳細な流れの一例を示す図である。図24に示すように、XSLT処理部322は、XSL選択データを全て処理したかを判定する(ステップS401)。すなわち、XSL選択データメモリ311に記憶されたレコード全てについてXSLT処理を実行したかを判定する。ここで、処理していないと判定した場合には(ステップS401否定)、XSLT処理部322は、XSL選択データから1行取り出し、XLとする(ステップS402)。なお、「XL」は変数を示す。すなわち、XSLT処理部322は、XSL選択データメモリ311からレコードを1つ取得し、XLとする。例えば、XSLT処理部322は、WebページID「1」を含むレコードを取得する。
そして、XSLT処理部322は、Webページデータの中で、XLのWebページIDとIDが同じ行のページソースをPSとする(ステップS403)。なお、「PS」は変数を示す。すなわち、XSLT処理部322は、取得したレコードに含まれるWebページIDに対応付けられたページソースをWebページデータ記憶部211から取得し、PSとする。例えば、XSLT処理部322は、WebページID「1」に対応付けられたページソース「<html><head ...〜</htm>」をPSとする。
そして、XSLT処理部322は、PSに対してXLのXSLコードが表すXSLT処理を行う(ステップS404)。すなわち、XSLT処理部322は、XSL選択部321により選択された抽出ルールに基づいて抽出処理を実行することで、抽出対象のWebページからデータを抽出する。例えば、XSLT処理部322は、ページソース「<html><head ...〜</htm>」に対して、XSLコード「<?xml version=“1.0” encoding=“UTF-8”?><xsl:stylesheet ...〜</xsl:stylesheet>」を用いてXSLT処理を実行することで、Webページのページソースから「<?xml version=“1.0” encoding=“UTF-8”?><item><code>a001</code>... 〜 </item>」を抽出する。
そして、XSLT処理部322は、XLのWebページIDとXSLT処理の結果を抽出済データに格納する(ステップS405)。すなわち、例えば、XSLT処理部322は、WebページID「1」とXML出力「<?xml version=“1.0” encoding=“UTF-8”?><item><code>a001</code>... 〜 </item>」とを含むレコードを、抽出済データ記憶部214に格納する。そして、XSLT処理部322は、ステップS401に戻り、処理を繰り返す。
また、XSLT処理部322は、XSL選択データメモリ311に記憶されたレコード全てについてXSLT処理を実行したと判定した場合には(ステップS401肯定)、そのまま処理を終了する。
[実施例2におけるツリー変換部による処理]
図25は、実施例2におけるツリー変換部による処理の詳細な流れの一例を示す図である。図25に示すように、ツリー変換部421は、Webページデータを全て処理したか否かを判定する(ステップS501)。すなわち、抽出ルールと特定ルールとを作成する際に用いるWebページデータ記憶部211のレコードを全てについてルール作成部400による処理が行われたか否かを判定する。
ここで、処理していないと判定した場合には(ステップS501否定)、ツリー変換部421は、Webページデータから1行取り出し、PLとする(ステップS502)。なお、「PL」は変数を示す。例えば、ツリー変換部421は、Webページデータ記憶部211から、WebページID「1」を含むレコードを取得し、PLとする。そして、ツリー変換部421は、PLのページソースをDOMパースする(ステップS503)。すなわち、取得したレコードに含まれるページソースに対してパース処理を実行することで、ページソースをDOMツリーに変換する。
そして、ツリー変換部421は、パース結果のDOMツリーから要素ノードを1つ取り出し、DNとし(ステップS504)、PLのWebページID、DNの要素名、DNの兄弟要素内での位置、DNのXPath、DNのノードID、及びDNの親要素のノードIDをDOMツリーデータに出力する(ステップS505)。なお、「DM」は変数を示す。すなわち、例えば、パース処理を実行することで得られたDOMツリーに含まれる要素それぞれについて、WebページIDとノードIDと親ノードIDと要素名と要素位置とXpathとを含むレコードを、DOMツリーデータメモリ411に格納する。
そして、ツリー変換部421は、DOMツリーの要素ノードを全て処理したかを判定し(ステップS506)、全て処理した判定しない場合には(ステップS506否定)、ステップS504に戻り、ステップS504〜S505を繰り返す。一方、ツリー変換部421は、全て処理した判定した場合には(ステップS506肯定)、ステップS501に戻り、処理を繰り返す。また、ツリー変換部421は、ステップS501において、Webページデータを全て処理したと判定した場合には(ステップS501肯定)、処理を終了する。
[実施例2における部分木ハッシュ生成部による処理]
図26は、実施例2における部分木ハッシュ生成部による処理の詳細な流れの一例を示す図である。以下では、ルートノードについてのレコードを取得して部分木ハッシュを算出する場合を例に説明する。部分木ハッシュ生成部422は、以下に示す処理と同様の処理を実行することで、ルートノード以外のレコードについても、部分木ハッシュを算出する。
図26に示すように、部分木ハッシュ生成部422は、処理タイミングとなると(ステップS601肯定)、DOMツリーデータからルートノードを1つ取り出し、RNとする(ステップS602)。なお、「RN」は変数を示す。すなわち、親ノードIDが「0」のレコードを1つ取得し、RNとする。そして、部分木ハッシュ生成部422は、RNにハッシュ化処理を行う(ステップS603)。すなわち、部分木ハッシュ生成部422は、取得した親ノードIDが「0」のレコードについて、ハッシュ値を算出し、部分木ハッシュデータメモリ412にレコードを格納する。なお、ハッシュ値を算出する処理の詳細については、図27を用いて後述する。部分木ハッシュ生成部422が処理を開始する処理タイミングとは、定期的なタイミングであっても良く、DOMツリーデータメモリ411に新たなレコードが格納されたタイミングであっても良く、任意のタイミングであって良い。
そして、部分木ハッシュ生成部422は、DOMツリーデータのルートノードを全て処理したかを判定し(ステップS604)、処理したと判定した場合には(ステップS604肯定)、処理を終了し、処理していないと判定した場合には(ステップS604否定)、ステップS602に戻って処理を繰り返す。
図27は、実施例2における部分木ハッシュ生成部によるハッシュ化処理の詳細な流れの一例を示すフローチャートである。図27に示す一連の処理は、図26におけるステップS603に対応する。なお、以下では、ハッシュ化処理において、部分木ハッシュデータメモリ412にレコードを格納する処理も併せて実行する場合を用いて説明する。
図27に示すように、部分木ハッシュ生成部422は、処理対象のノードをNとし(ステップS701)、文字列変数BにNの要素名を代入する(ステップS702)。なお、「N」「B」は変数を示す。例えば、部分木ハッシュ生成部422は、ノードID「1」を含むレコードをDOMツリーデータメモリ411から取得し、取得したレコードに含まれるノードを処理対象となる「N」とし、取得したレコードに含まれる要素名「html」を文字列変数Bに代入する。
そして、部分木ハッシュ生成部422は、数値変数Sに1を代入する(ステップS703)。なお、「S」は変数を示す。例えば、部分木ハッシュ生成部422は、「S=1」とする。
そして、部分木ハッシュ生成部422は、Nの子ノードを全て処理したかを判定する(ステップS704)。つまり、ノードID「1」の配下にあるノード全てについて、後述するステップS705を実行したか否かを判定する。ここで、処理していないと判定した場合には(ステップS704否定)、部分木ハッシュ生成部422は、DOMツリーデータから、Nの子ノードCNを1つ取り出し、ハッシュ化処理を行う(ステップS705)。なお、「CN」は変数を示す。Nの子ノードCNは、親ノードIDがNのノードIDに一致するレコードであって、かつ、WebページIDがNのノードIDに一致するレコードに含まれるノードを示す。
また、部分木ハッシュ生成部422は、再帰呼び出しにてNの子ノードのハッシュ値を算出する。図17に示す例では、部分木ハッシュ生成部422は、WebページID「2」と親ノードID「1」とを含むレコードを1つ取得し、取得したレコードについてのハッシュ値を算出する。例えば、部分木ハッシュ生成部422は、取得したレコードのノードについて、ハッシュ値「QEAYABgAAD2w...」を算出する。なお、部分木ハッシュ生成部422がNの子ノードを取得するやり方は、所定の順序であれば良く、その順序は任意であって良い。
そして、部分木ハッシュ生成部422は、CNのハッシュ値をBの末尾に加え(ステップS706)、CNの部分木サイズをSに加算する(ステップS707)。例えば、部分木ハッシュ生成部422は、文字列変数B「html」の末尾に、算出したハッシュ値「QEAYABgAAD2w...」を加えることで、文字列変数Bを「htmlQEAYABgAAD2w...」とする。また、例えば、部分木ハッシュ生成部422は、ハッシュ値を算出したCNのサイズが「2」である場合には、数値変数S「1」に「2」を加えることで、「3」とする。
そして、部分木ハッシュ生成部422は、ステップS704に戻り、Nの子ノードを全て処理したかを判定し(ステップS704)、処理したと判定するまで、ステップS705〜S707を繰り返す。つまり、この結果、文字列変数Bは、Nの子ノード各々について算出されたハッシュ値が連結された文字列となる。
一方、部分木ハッシュ生成部422は、Nの子ノードを全て処理したかを判定した場合には(ステップS704肯定)、Bのハッシュ値を計算する(ステップS708)。すなわち、部分木ハッシュ生成部422は、Nの子ノード各々について算出されたハッシュ値が連結された文字列から、ハッシュ値を算出する。なお、ハッシュ値を算出する手法は、CRC32、MD5などの一様性のあるハッシュ値計算手法であれば、任意の方法で良い。
そして、部分木ハッシュ生成部422は、部分木ハッシュデータに、NのWebページID、NのノードID、NのXPath、Bのハッシュ値、及び、部分木サイズSを出力する(ステップS709)。つまり、部分木ハッシュ生成部422は、WebページID「2」とノードID「1」とXpath「/html[1]」とハッシュ値「4AAQSkZJRgAB...」と部分木サイズ「178」とを含むレコードを、部分木ハッシュデータメモリ412に格納する。
[実施例2における共通ツリー抽出部による処理]
図28は、実施例2における共通ツリー抽出部による処理の詳細な流れの一例を示す図である。図28に示すように、共通ツリー抽出部423は、処理タイミングとなると(ステップS801肯定)、部分木ハッシュデータをハッシュ値順にソートする(ステップS802)。すなわち、共通ツリー抽出部423は、部分木ハッシュデータメモリ412に記憶されたレコードを、ハッシュ値順に並べなおす。なお、共通ツリー抽出部423の処理タイミングとは、例えば、定期的なタイミングや、部分木ハッシュデータメモリ412にレコードが格納されたタイミングなどが該当する。
そして、共通ツリー抽出部423は、部分木ハッシュデータを全て処理したかを判定し(ステップS803)、処理していないと判定した場合に(ステップS803否定)、部分木ハッシュデータからハッシュ値を1つ取り出し、Hとする(ステップS804)。なお、「H」は変数を示す。すなわち、例えば、共通ツリー抽出部423は、部分木ハッシュデータメモリ412からレコードを1つ取得し、取得したレコードに含まれるハッシュ値を「H」とする。例えば、共通ツリー抽出部423は、WebページID「2」とノードID「1」とXpath「/html[1]」とハッシュ値「4AAQSkZJRgAB...」と部分木サイズ「178」とを含むレコードを取得し、ハッシュ値「4AAQSkZJRgAB...」を「H」とする。
そして、共通ツリー抽出部423は、部分木ハッシュデータから、ハッシュ値がHである行を抽出する(ステップS805)。すなわち、共通ツリー抽出部423は、ハッシュ値が同一となるレコードを取得する。例えば、共通ツリー抽出部423は、ハッシュ値が「4AAQSkZJRgAB...」となるレコードを取得する。
そして、共通ツリー抽出部423は、抽出した行の1行目の部分木サイズS、抽出した行の行数L、SとLの積となる累積サイズ、及びHを共通ツリーデータに出力する(ステップS806)。すなわち、共通ツリー抽出部423は、取得したレコード数を識別して行数Lとし、最初に抽出したレコードの部分木サイズSと行数Lとを乗算した値を累積サイズとする。そして、共通ツリー抽出部423は、識別した行数Lと、算出した累積サイズと、ハッシュ値Hと、部分木サイズSとを含むレコードを、共通ツリーデータメモリ413に格納する。例えば、共通ツリー抽出部423は、ハッシュ値「4AAQSkZJRgAB...」と部分木サイズS「178」と行数L「1」と累積サイズ「178」とを含むレコードを格納する。
そして、共通ツリー抽出部423は、ステップS803に戻り、部分木ハッシュデータを全て処理していないと判定した場合には(ステップS803否定)、上述したステップS804〜S806を繰り返す。一方、共通ツリー抽出部423は、部分木ハッシュデータを全て処理したと判定した場合には(ステップS803肯定)、処理を終了する。
[実施例2におけるXSL生成部による処理]
図29は、実施例2におけるXSL生成部による処理の詳細な流れの一例を示す図である。図29に示すように、XSL生成部424は、処理タイミングとなると(ステップS901肯定)、共通ツリーデータを累積サイズ順にソートする(ステップS902)。具体的には、XSL生成部424は、共通ツリーデータメモリ413に記憶されたレコードを累計サイズが大きい順に並べる。XSL生成部424の処理タイミングとは、例えば、定期的なタイミングや、共通ツリーデータメモリ413にレコードが格納されたタイミングなどが該当する。
そして、XSL生成部424は、数値変数IDSとIDRにそれぞれ「1」を代入する(ステップS903)。なお、「IDS」と「IDR」とは変数を示す。具体的には、「IDS」は、XSLデータについての変数を示し、「IDR」は、URLルールについての変数を示す。
そして、XSL生成部424は、共通ツリーデータを全て処理したかを判定する(ステップS904)。具体的には、XSL生成部424は、共通ツリーデータメモリ413に記憶されたレコード全てについて後述する処理を行ったかを判定する。ここで、XSL生成部424は、処理を行ったと判定した場合には(ステップS904肯定)、処理を終了する。
一方、XSL生成部424は、処理を行っていないと判定した場合には(ステップS904否定)、共通ツリーデータから行を1つ取り出し、CTとする(ステップS905)。具体的には、XSL生成部424は、共通ツリーデータメモリ413から、累計サイズが大きいレコードから順に1つのレコードを取得し、CTとする。なお、「CT」は変数を示す。例えば、XSL生成部424は、ハッシュ値「4AAQSkZJRgAB...」と部分木サイズ「178」と行数「1」と累計サイズ「178」とを含むレコードを取得し、CTとする。
そして、XSL生成部424は、CTにルール出力処理を行う(ステップS906)。すなわち、XSL生成部424は、抽出ルールを作成し、特定ルールを作成し、抽出ルールをXSLデータ記憶部212に格納し、特定ルールを抽出ルールと紐付けた上でXSL選択ルールデータ記憶部213に格納する。ルール出力処理の詳細な流れの一例については図30を用いて後述する。
そして、XSL生成部424は、数値変数IDSとIDRにそれぞれ1を加算する(ステップS907)。例えば、数値変数IDSとIDRとに「1」加算することで、数値変数IDSとIDRとを「2」とする。そして、XSL生成部424は、ステップS904に戻り、処理を行ったと判定するまでステップS904〜S907を繰り返す。
図30は、実施例2におけるXSL生成部によるルール出力処理の詳細な流れの一例を示す図である。図30に示す一連の流れは、図29におけるステップS906に対応する。
図30に示すように、XSL生成部424は、部分木ハッシュデータから、ハッシュ値がCTのハッシュ値と一致する行を抽出し、SHとする(ステップS1001)。例えば、XSL生成部424は、部分木ハッシュデータメモリ412に記憶されたレコードのうち、ハッシュ値が「4AAQSkZJRgAB...」となるレコードを全て抽出し、「SH」とする。すなわち、XSL生成部424は、Webページのツリー構造を比較することで同一の下位構造を含むツリー構造を有するWebページ群を取得する。言い換えると、XSL生成部424は、Webページのツリー構造を比較することで、ツリー構造が類似するWebページ群を取得する。
そして、XSL生成部424は、SHをXPath順にソートし、最も出現回数が多いXPathをMPとする(ステップS1002)。すなわち、下位構造が同一であったとしても、取得したレコードのノードの位置を示すXpathが同一とは限らないことを踏まえ、他のWebページからデータを抽出できる可能性が高いと考えられる出現回数が他と比較して多いXpathを取得し、MPとする。なお、「MP」は図21に示したXSLコードを生成するためのテンプレートのうちXpathを挿入する箇所を示す。つまり、XSL生成部424は、取得したレコードに含まれるXpathのうち最も出現回数が多いXPathにより指定される箇所からデータを抽出するXSLコードを生成する。
そして、XSL生成部424は、SHに、新規の列「URL」を追加する(ステップS1003)。すなわち、XSL生成部424は、部分木ハッシュデータメモリ412から取得したレコード群に、「URL」についての列を追加する。
そして、XSL生成部424は、SHを全て処理したかを判定する(ステップS1004)。つまり、SH全てについてURLを代入する処理を実行したかを判定する。ここで、処理していないと判定した場合には(ステップS1004否定)、SHから行を1つ取り出し、SHLとする(ステップS1005)。なお、「SHL」は変数を示す。そして、XSL生成部424は、Webページデータの中で、WebページIDがSHLのWebページIDに一致する行のURLをSHLのURLに代入する(ステップS1006)。具体的には、XSL生成部424は、取り出したレコードに含まれるWebページIDに対応付けられたURLをWebページデータ記憶部211から取得し、取得したURLを新たに追加した列「URL」に代入する。そして、XSL生成部424は、SHを全て処理したかを再度判定し、全て処理したと判定するまで、ステップS1005及びS1006の処理を繰り返す。
一方、XSL生成部424は、SHを全て処理したと判定した場合には(ステップS1004肯定)、SHの1行目のURLを文字列変数MUに代入する(ステップS1007)。そして、XSL生成部424は、SHの全ての行のURLにMUが前方一致するかを判定し(ステップS1008)、一致しないと判定した場合には(ステップS1008否定)、MUの末尾の1文字を削除する(ステップS1009)。その後、再度前方一致すると判定するまで、ステップS1009を繰り返す。すなわち、XSL生成部424は、URL各々に共通する前方部分を抽出する。
そして、XSL生成部424は、再度前方一致すると判定した場合には(ステップS1008肯定)、テンプレートTSにMPを埋め込んだXSLコードと、IDSをXSLデータに出力する(ステップS1010)。具体的には、XSL生成部424は、ステップS1002にて生成したXSLコードをXSLデータ記憶部212に格納し、XSLIDとしてIDSを格納する。
そして、XSL生成部424は、MUの末尾に文字列「.*」を結合したURLルールと、IDRと、IDSをXSL選択ルールデータに出力する(ステップS1011)。具体的には、XSL生成部424は、ステップS1008にて生成したURL列と前方一致するURLを特定するURLルールを生成してXSL選択ルールデータ記憶部213に格納し、ルールIDとしてIDRを格納し、XSLIDとしてIDSを格納する。すなわち、XSL生成部424は、URLルールをXSLコードと紐付けて、XSL選択ルールデータ記憶部213に格納する。なお、「.*」は前方一致を示す正規表現である。
なお、図30に示す例では、XSL生成部424が、SH全ての行のURLに一致する前方部分を取得し、取得した前方部分と一致するURLを特定するURLルールを生成する場合を用いて説明した。ただし、本発明はこれに限定されるものではなく、任意のURLルールを生成して良い。すなわち、後方部分と一致するURLを特定するURLルールを生成しても良く、中間部分が一致するURLルールを生成しても良く、任意のURLルールを任意の手法にて生成して良い。
[実施例2におけるXSLTエラー検出部による処理]
図31は、実施例2におけるXSLTエラー検出部による処理の詳細な流れの一例を示す図である。図31に示すように、XSLTエラー検出部522は、Webページデータを全て処理したか否かを判定する(ステップS1101)。例えば、XSLTエラー検出部522は、Webページデータ記憶部211に記憶されたレコード全てについて、構造変化検出部500による処理が行われたか否かについて判定する。
そして、XSLTエラー検出部522は、処理していないと判定した場合には(ステップS1101否定)、Webページデータから1行取り出し、WPとし(ステップS1102)、XSL選択データにWebページIDが、WPのWebページIDと一致する行(XL)があるかを判定する(ステップS1103)。すなわち、XSLTエラー検出部522は、Webページデータ記憶部211から取得したレコードに関するWebページについて、XSLコードが選択済であり、XSL選択データメモリ511に格納済であるかを判定する。なお、「WP」「XL」は変数を示す。
そして、XSLTエラー検出部522は、WPのWebページIDと一致する行(XL)があると判定した場合には(ステップS1103肯定)、WPのページソースに対して、XLのXSLコードが表すXSLT処理を行う(ステップS1104)。具体的には、XSLTエラー検出部522は、XSL選択データメモリ511に記憶されたレコードを取得し、取得したレコードに含まれるXSLコードを用いて、レコードに含まれるWebページIDにより識別されるWebページに対してXSLT処理を実行する。
そして、XSLTエラー検出部522は、XSLT処理の結果エラーが起きたかを判定する(ステップS1105)。ここで、XSLTエラー検出部522は、エラーが起きたと判定した場合には(ステップS1105肯定)、WPに対してXSL検索処理を行う(ステップS1106)。すなわち、XSLTエラー検出部522は、エラーが起きたWebページに対して適用可能なXSLコードを検索する処理を実行する。
また、上述したステップS1103において、WPのWebページIDと一致する行(XL)がないと判定した場合には(ステップS1103否定)、WPに対してXSL検索処理を行う(ステップS1106)。
そして、XSLTエラー検出部522は、WPのWebページID、XLのXSLID、XSLT処理のエラーの有無、XSL検索処理の結果(RXS)を構造変化データに出力する(ステップS1107)。この場合、例えば、XSLTエラー検出部522は、構造変化データ記憶部215に対して、Webページデータ記憶部211から取得したレコードに含まれるWebページIDを「WebページID」として格納し、XSL選択データメモリ511から取得したレコードに含まれるXSLコードのXSLIDを「XSLID」として格納し、エラーが起きたことを示す「YES」を「XSLエラー」として格納し、XSL検索処理結果となるXSLIDを「新XSLID」として格納する。
また、上述したステップS1105において、エラーが起きなかったと判定した場合には(ステップS1105否定)、XSL検索処理を行うことなく、WPのWebページID、XLのXSLID、XSLT処理のエラーの有無、XSL検索処理の結果(RXS)を構造変化データに出力する(ステップS1107)。この場合、例えば、XSLTエラー検出部522は、構造変化データ記憶部215に対して、Webページデータ記憶部211から取得したレコードに含まれるWebページIDを「WebページID」として格納し、XSL選択データメモリ511から取得したレコードに含まれるXSLコードのXSLIDを「XSLID」として格納し、エラーが起きなかったことを示す「NO」を「XSLエラー」として格納する。
図32は、実施例2におけるXSLTエラー検出部によるXSL検索処理の詳細な流れの一例を示すフローチャートである。図32に示す一連の処理は、図31におけるステップS1106に対応する。
図32に示すように、XSLTエラー検出部522は、XSLデータを全て処理したか否かを判定し(ステップS1201)、処理していないと判定した場合に(ステップS1201否定)、XSLデータから1行取り出し、XLとする(ステップS1202)。すなわち、XSLTエラー検出部522は、XSL検索処理を実行する場合には、XSLデータ記憶部212に未取得のレコードがある場合には、レコードを1つ取得する。
そして、XSLTエラー検出部522は、WPのページソースに対してXLのXSLコードが表すXSLT処理を行う(ステップS1203)。そして、XSLTエラー検出部522は、XSLT処理の結果エラーが起きたかを判定し(ステップS1204)、エラーが起きたと判定した場合には(ステップS1204肯定)、ステップS1021に戻り、未取得のレコードをXSLデータ記憶部212から取得してステップS1202〜S1204を繰り返す。
一方、XSLデータ記憶部212は、エラーが起きなかったと判定した場合には(ステップS1204否定)、XSL検索処理の結果(RXS)として、XLのIDを返し(ステップS1205)、処理を終了する。つまり、エラーが起きなかったということは、XSL検索処理の対象となったWebページに適用可能なXSLコードとなり、その後、図31におけるステップ1107において、XSLTエラー検出部522は、構造変化データ記憶部215の新XSLIDとして格納することになる。
一方、XSLTエラー検出部522は、ステップS1201において、全て処理したと判定した場合には(ステップS1201肯定)、つまり、エラーが起きなかったXSLコードが1つもなかった場合には、XSL検索処理の結果(RXS)として、NULLを返す(ステップS1206)。この結果、その後、図31におけるステップ1107において、XSLTエラー検出部522は、構造変化データ記憶部215の新XSLIDにデータを格納しない。
[実施例2の効果]
上述したように、実施例2によれば、抽出装置200は、Webページからデータを抽出するための抽出ルールと、WebページのURLに基づいて抽出ルールの適用対象となるWebページを特定する特定ルールとを対応付けて記憶する。そして、抽出装置200は、抽出対象となるWebページが入力されると、入力されたWebページに紐付けられたURLが特定される特定ルールを選択し、選択した特定ルールに対応付けられた抽出ルールを選択する。そして、抽出装置200は、選択した抽出ルールに基づいて抽出処理を実行することで、抽出対象のWebページからデータを抽出する。この結果、実施例2によれば、Webページから適切にデータを抽出可能である。
また、実施例2によれば、抽出装置200は、ツリー構造を有するWebページと、WebページのURLとを対応付けて記憶する。そして、抽出装置200は、Webページ各々のツリー構造を比較することで、ツリー構造が類似するWebページ群を取得し、取得したWebページ群に含まれるWebページ各々のツリー構造に共通する部分からデータを抽出する抽出ルールを作成する。そして、抽出装置200は、抽出ルールが作成されたWebページ群に含まれるWebページ各々に対応付けられたURLを取得し、取得したURL各々に基づいて特定ルールを作成する。そして、抽出装置200は、抽出ルールと特定ルールとを対応付けて格納する。この結果、ルールを自動的に作成でき、手間を省くことが可能である。
また、実施例2によれば、Webページのツリー構造が過去のWebページのツリー構造と比較して変化したか否かを検出するので、Webページの構造が変化したことを簡単に把握可能である。この結果、例えば、構造が変化した場合に、抽出ルールを再度作成したり、適用するルールを再度選択したりすることで、Webページのツリー構造が変化したとしても適切に抽出可能である。
また、実施例2によれば、XSLデータ記憶部212は、抽出ルールとして、Webページのツリー構造により一意に決定されるルールであるツリー構造対応抽出ルールを複数含む抽出ルール群を記憶する。そして、抽出装置200は、選択した特定ルールに対応付けられた抽出ルール群を選択し、抽出対象となるWebページのツリー構造を識別し、識別したツリー構造に対応するツリー構造対応抽出ルールを抽出ルール群から選択する。そして、抽出装置200は、選択したツリー構造対応抽出ルールに基づいて抽出処理を実行することで、抽出対象のWebページからデータを抽出する。この結果、Webページに適したルールを選択可能である。