クローラー/スクレイピング Advent Calendar 2014ã®5æ¥ç®ã§ãããã¨ã全部俺Advent Calendarãéå¬ä¸ã§ãã
ãWebãããã¼ã¿ãåãããã«ã¹ã¯ã¬ã¤ãã³ã°ããéã¯ãRubyã使ããã¨ãå¤ãã§ããçç±ã¨ãã¦ã¯ãNokogiriãæ軽ã§ç°¡åã ããã®ä¸ç¹ã§ããRubyによるクローラー開発技法ã§ãéæã«ç´¹ä»ãã¦ãã¾ããéæã¨ããã¬ãã«ã§ã¯ãªããæãå¤ãåãå¤ãNokogiriã§ãã¼ã¿åã£ã¦ããã ããããããã¨æ¹å¤ãåããã®ã§ã¯ã¨ãæ¸å¿µããã¬ãã«ããããã¾ãããNokogiriã¯æ軽ã§ä¾¿å©ãªã®ã§ãã¡ãã£ã¨ä½¿ãæ¹ãè¦ãã¦ããã ãã§æ¥½ã§ããã±ã¼ã¹ãä¸æ¯ããã¾ããã¨ãããã¨ã§ãNokogiriå ¥éç·¨ã§ãã
Nokogiriã®ä½¿ãæ¹
ãNokogiriã¯ãRubyã§å®è£ ãããHTML/XMLã®æ§æ解æå¨ï¼ãã¼ãµã¼ï¼ã§ããRubyã®ä¸ã§ã¯ãããã¡ã¯ãã»ã¹ã¿ã³ãã¼ãã¨è¨ã£ã¦ãå·®ãæ¯ãããªãã§ããããXPathãCSSã»ã¬ã¯ã¿ãå©ç¨ãã¦ãç®çã®è¦ç´ ãç¹å®ãæãåºãã¾ãããã®ãã¼ã¿ãæãåºããã¨ãã¹ã¯ã¬ã¤ãã³ã°ã¨å¼ã³ã¾ããScrapeï¼åãï¼ã¨ããæå³ã§ããã
ãä¸è¨ã®ä¾ã¯ãnokogiriã®å ¬å¼ãµã¤ãããããã¼ã¸ä¸ã®ãªã³ã¯ãå ¨é¨åå¾ãã¦ããä¾ã§ãã
scrape.rb
require 'nokogiri' require 'open-uri' doc = Nokogiri.HTML(open("http://nokogiri.org/")) doc.css('a').each do |element| puts element[:href] end
ãå®è¡ããã¨æ¬¡ã®ããã«ãªãã¾ãã
$ ruby scrape.rb / http://rdoc.info/github/sparklemotion/nokogiri https://github.com/sparklemotion/nokogiri /tutorials/installing_nokogiri.html /tutorials/ /tutorials/getting_help.html /tutorials/installing_nokogiri.html /tutorials/parsing_an_html_xml_document.html /tutorials/searching_a_xml_html_document.html /tutorials/modifying_an_html_xml_document.html /tutorials/ensuring_well_formed_markup.html /tutorials/getting_help.html /tutorials/more_resources.html //github.com/sparklemotion/nokogiri.org-tutorials //octopress.org/ //github.com/coogie/oscailte
ã½ã¼ã¹ã®è§£èª¬
ãrequireã§ãnokogiriã®ä»ã«open-uriã¨ããã¢ã¸ã¥ã¼ã«ãå¼ã³åºãã¦ãã¾ããnokogiriã¯ããã¾ã§ããã¹ãã®æç« ãããã¼ã¿ãæãåºãã ããªã®ã§ãWebããhttpéä¿¡ã§ãã¼ã¿ãåå¾ãããã¨ã¯ã§ãã¾ãããããã§ãopen-uriãå©ç¨ãã¾ããopen-uriã¯openãæ¡å¼µãããã¡ã¤ã«ã¨åããããªå½¢ã§URLãæ±ããã¨ãåºæ¥ã¾ãã
ããã®ç¿å¾ããHTMLæç« ããNokogiri.HTMLã§éãã¦ãNokogiriã®ããã¥ã¡ã³ãå½¢å¼ã«å¤æãããªãã¸ã§ã¯ããä½æãã¦ãã¾ãããã®ãªãã¸ã§ã¯ãã¯HTMLãã¼ã¿ãå
å
ãã¦ããã®ã§ãNokogiriã®ã¡ã½ãããå©ç¨ãã¦æ§ã
ãªåãæ¹ã§ãã¼ã¿ãåå¾ãããã¨ãã§ãã¾ãã
doc.css('a').each do |element| puts element[:href] end
ããã®ä¾ã§ã¯ãCSSã»ã¬ã¯ã¿ãå©ç¨ãã¦aã¿ã°ã®ãã®ãå ¨é¨æãåºãã¦ãã¾ãããããé 次elementã¨ããå¤æ°ã«æ ¼ç´ãã¦ãã¾ããããã¦ãelementã®ä¸ãããhrefå±æ§ã®å¤ãåãåºãã¦è¡¨ç¤ºãã¦ãã¾ããNokogiriã«ã¯å¤æ°ã®ã¡ã½ãããã¨ã¤ãªã¢ã¹ãããã¾ãããåºæ¬çã«ã¯å ¨ã¦ããã¨åããã¨ããã¦ãã¾ãã
- åå¾ããåãå£ã決å®ï¼xpath,cssã»ã¬ã¯ã¿çï¼
- åå¾ãã対象ã決å®ï¼ãã¹ãidãã¯ã©ã¹æå®çï¼
- åå¾ãããã¼ã¿ã«å¯¾ããæä½
æ¤ç´¢è²ã
ãidæå®ã¨classæå®ãä¸ä½ããã®ã¿ã°æå®ãªã©ããã使ãã®ã§ã¯ãªãã§ããããï¼
#classæå®ã§h2ã¿ã°ãæ¤ç´¢ puts doc.xpath("//h2[@class='title']") #idæå®ã§divã¿ã°ãæ¤ç´¢ puts doc.xpath("//div[@id='copyright']") #ã«ã¹ã¿ã ã®å±æ§å¤ã§divã¿ã°ãæ¤ç´¢ puts doc.xpath("//div[@data-component-term='tweet']") #idæå®ã§å ¨ã¦ã®ã¿ã°ãæ¤ç´¢ puts doc.xpath("//*[@id='copyright']") #çµè¾¼æ¤ç´¢ puts doc.xpath("//div[@id='copyright']//ul") #ä¸ä½ããã®ã¿ã°æå® puts doc.xpath("//html/body/article/p[34]")
ãããªãç°¡åãªèª¬æã§ããããNokogriã使ã£ãã¹ã¯ã¬ã¤ãã³ã°ã®å
¥éç·¨ã§ãã以åãå
é¨ã®æ§é å«ãã¦もう少し詳しく説明したエントリーãæ¸ããã®ã§ãèå³ãããã°ãã¡ãã®æ¹ãèªãã§ã¿ã¦ãã ãããè²ã
ãªè¨èªã§ã¹ã¯ã¬ã¤ãã³ã°ãã¾ããããNokogiriã¯ããªã使ããããé¨é¡ã ã¨æãã¾ããããã§ã¯ãè¿·æãæããªãç¯å²ã§æ¥½ããã§ãã ããï¼ï¼
ããã¨å®£ä¼ã«ãªãã¾ãããã¯ãã¼ã©ã¼ï¼ã¹ã¯ã¬ã¤ãã³ã°ã®ä½ãæ¹ããã£ã¦ã解説ããRubyによるクローラー開発技法ã¨ããæ¬ãæ¸ãã¦ãã¾ããåå¿è
ãä¸ç´è
åãã§ãã®ã§ãèå³ãããã°æ¯éã覧ãã ããã
See Also:
RubyでWebスクレイピングの話をしてきました。第1回Webスクレイピング勉強会@東京
Ruby製の構文解析ツール、Nokogiriの使い方 with Xpath
あらためてRuby製のクローラー、"anemone"を調べてみた
オープンソースのRubyのWebクローラー"Anemone"を使ってみる
Rubyã«ããã¯ãã¼ã©ã¼éçºææ³ å·¡åã»è§£ææ©è½ã®å®è£ ã¨21ã®éç¨ä¾
- ä½è : ãã³ãã¡,ä½ã æ¨æé
- åºç社/ã¡ã¼ã«ã¼: SBã¯ãªã¨ã¤ãã£ã
- çºå£²æ¥: 2014/08/25
- ã¡ãã£ã¢: 大åæ¬
- ãã®ååãå«ãããã° (2件) ãè¦ã