Watson Discovery에서 웹 크롤링 (2)
7181 단어 WatsonDiscoverywebcrawler
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.txthttp://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로 가져올 데이터를 더욱 풍부하게 만들 수 있습니다. 뉴스 기사의 경우, 기사의 일자나 고유 표현(인명, 조직명)등도 합쳐서 도입하는 것으로, 보다 고도의 기사의 활용에 연결하는 것도 가능합니다. 이하 링크처에서는 그러한 데모도 소개하고 있으므로 참조해 주십시오.
Reference
이 문제에 관하여(Watson Discovery에서 웹 크롤링 (2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/schiyoda/items/48634ce98eda1572bbab
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
git clone https://github.com/schiyoda/nutch-indexer-discovery.git
$ ./gradlew
$ ./gradlew setupHbase
$ ./start-hbase.sh
conf/nutch-discovery/nutch-site.xml の修正
$ ./gradlew setupNutch
$ ./gradlew buildPlugin
<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>
<property>
<name>jsoup.extractor.property.file</name>
<value>jsoup-extractor.xml</value>
</property>
<property>
<name>http.content.limit</name>
<value>-1</value>
</property>
http://www.asahi.com/news/
https://www.nikkei.com/news/category/
+^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
#+.
# 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
<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>
Nutch 플러그인의 작동 방식을 잘 사용하면 Discovery로 가져올 데이터를 더욱 풍부하게 만들 수 있습니다. 뉴스 기사의 경우, 기사의 일자나 고유 표현(인명, 조직명)등도 합쳐서 도입하는 것으로, 보다 고도의 기사의 활용에 연결하는 것도 가능합니다. 이하 링크처에서는 그러한 데모도 소개하고 있으므로 참조해 주십시오.
Reference
이 문제에 관하여(Watson Discovery에서 웹 크롤링 (2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/schiyoda/items/48634ce98eda1572bbab텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)