Watson Discovery에서 웹 크롤링 (2)

지난번은 Watson Discovery에서 웹 크롤링을 시도하고 뉴스 기사를 Discovery에 넣어 보았습니다. 다만, 뉴스 기사 뿐만이 아니라, 주위의 메뉴등의 텍스트도 들어 버리고 있으므로, 이번은 Web 페이지의 필요한 개소만 잘라내는 방법에 대해서는 생각해 보고 싶습니다.

Apatch Nutch는 플러그인에서 필요한 기능을 확장할 수 있는 메커니즘을 제공합니다. "Discovery에 데이터를 넣는"기능도 indexer를 플러그인으로 확장하고 있습니다. 이번에는 "웹 페이지의 필요한 부분만 잘라내기"기능을 플러그인으로 구현하려고 합니다.

설정 절차



이번에는 기존의 súp-extractor 플러그인이 사용하기 쉬웠기 때문에 이쪽을 사용해 보겠습니다. 이것은 cssSelector에서 웹 페이지 (HTML)의 특정 부분을 추출 할 수있는 플러그인으로 parser의 기능을 확장합니다.

소스 코드 얻기 및 빌드



súp-extractor 플러그인을 포함한 소스 코드를 Github 상에 작성했으므로, 다음과 같이 취득합니다.
git clone https://github.com/schiyoda/nutch-indexer-discovery.git

지난번 과 같이 buildPlugin 까지 진행합니다.
$ ./gradlew
$ ./gradlew setupHbase
$ ./start-hbase.sh
conf/nutch-discovery/nutch-site.xml の修正
$ ./gradlew setupNutch
$ ./gradlew buildPlugin

조금 해설



지난번 사용한 소스 코드와의 차이를 설명합니다. 이번에는 여기 에 있는 soup-extractor 를 사용하기 위해서, nutch 의 build/apache-nutch-2.3.1/src/plugin 폴더에 súp-extractor 를 포함한 다음에 빌드를 하고 있습니다. súp-extractor 를 사용하기 위해서 nutch-site.xml 다음과 같은 설정을 하고 있습니다.

플러그인 (jsoup-extractor) 추가
  <property>
    <name>plugin.includes</name>
    <!-- do **NOT** enable the parse-html plugin, if you want proper HTML parsing. Use something like parse-tika! -->
    <value>protocol-httpclient|urlfilter-regex|parse-(text|tika|js)|jsoup-extractor|index-(basic|anchor)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)|indexer-discovery</value>
  </property>

súp-extractor 구성 파일 지정
  <property>
    <name>jsoup.extractor.property.file</name>
    <value>jsoup-extractor.xml</value>
  </property>

또한 웹 페이지에 따라 Nutch가 검색하는 최대 크기의 기본값에 걸릴 수 있으므로 최대 크기를 무제한(-1)으로 변경합니다.
  <property>
    <name>http.content.limit</name>
    <value>-1</value>
  </property>

크롤링 설정



seed/url.txt, build/apache-nutch-2.3.1/runtime/local/conf/regex-urlfilter.txt, crawl 스크립트는 지난번 과 동일하게 설정합니다.

url.txt
http://www.asahi.com/news/
https://www.nikkei.com/news/category/

regex-urlfilter.txt(발췌)
+^https?://www.asahi.com/news/$
+^https?://www.asahi.com/articles/[0-9a-zA-Z_]+\.html$
+^https?://www.nikkei.com/news/category/$
+^https?://www.nikkei.com/article/[0-9a-zA-Z_]+/$
# accept anything else
#+.

crawl(발췌)
# Generate a new set of URLs to fetch. topN parameter decides how many pages nutch should crawl per depth. If you estimate a website to have 3000 pages then you can specify a depth value of 3 and a topN value of 1000 for a successful crawl of 3000 documents.
echo "Generate urls: "
__bin_nutch generate -topN 100

이번에는 새롭게 p-extractor 플러그인의 구성 파일 build/apache-nutch-2.3.1/runtime/local/conf/jsoup-extractor.xml을 수정합니다. 이 파일을 사용하면 cssSelector에서 HTML에서 추출한 위치를 지정할 수 있습니다.



이번에는 다음과 같이 설정해 보았습니다.

súp-extractor.xml(발췌)
    <documents>
        <document url-pattern=".*//www.asahi.com/articles/.*" >
            <field name="text2">
                <css-selector>div.ArticleText</css-selector>
                <normalizer>simpleNormalizer</normalizer>
            </field>
        </document>
        <document url-pattern=".*//www.nikkei.com/article/.*" >
            <field name="text2">
                <css-selector>div.cmn-article_text</css-selector>
                <normalizer>simpleNormalizer</normalizer>
            </field>
        </document>
    </documents>

Discovery의 Collection 설정



이 설정으로 추출한 뉴스 기사는 "text2"필드에 저장되므로 Discovery의 Configuration에서는 "text2"필드의 엔리치 대상을 "cotegories"와 "concepts"를 선택합니다.



크롤링 수행



crawl 명령을 사용하면 "text2"필드에 필요한 뉴스 기사를 얻을 수 있음을 알 수 있습니다. 또한 "cotegories"나 "concepts"도 추출할 수 있었습니다.





Nutch 플러그인의 작동 방식을 잘 사용하면 Discovery로 가져올 데이터를 더욱 풍부하게 만들 수 있습니다. 뉴스 기사의 경우, 기사의 일자나 고유 표현(인명, 조직명)등도 합쳐서 도입하는 것으로, 보다 고도의 기사의 활용에 연결하는 것도 가능합니다. 이하 링크처에서는 그러한 데모도 소개하고 있으므로 참조해 주십시오.

좋은 웹페이지 즐겨찾기