ããã¯ãNode.jsã䜿çšããWebã¹ã¯ã¬ã€ãã³ã°ã¹ã¯ãªããã®äœæãšäœ¿çšã«é¢ããã·ãªãŒãºã®3çªç®ã®èšäºã§ãã
- Node.jsã䜿çšããWebã¹ã¯ã¬ã€ãã³ã°
- Node.jsããã³åé¡ã®ãããµã€ãã§ã®Webã¹ã¯ã¬ã€ãã³ã°
- Node.jsã§ã®Webã¹ã¯ã¬ã€ãã³ã°ãšãããä¿è·
- Node.jsã䜿çšããæŽæ°ããŒã¿ã®Webã¹ã¯ã¬ã€ãã³ã°
æåã®èšäºã§ã¯ãããŒãžã®ååŸãšè§£æãååž°çãªãªã³ã¯ã®ã¯ãªãã¯ãã¯ãšãªã®ãã¥ãŒã€ã³ã°ãªã©ãWebã¹ã¯ã¬ã€ãã³ã°ã®åºæ¬çãªåŽé¢ãåãäžããŸããã 2çªç®ã®èšäºã§ã¯ãAjaxãä»ããŠåäœããŠãããµã€ãã®åæããªã¯ãšã¹ããã¥ãŒã®åŸ®èª¿æŽãããã³ãµãŒããŒãšã©ãŒã®åŠçã«ã€ããŠæ€èšããŸããã
2çªç®ã®èšäºã§ãã»ãã·ã§ã³ã®åæåã®ãããã¯ã«è§ŠããŸãããã1ã€ã®è¿œå ãªã¯ãšã¹ããåŠçããŠCookieãä¿åããã®ã«ååãªå Žåã¯éåžžã«åçŽãªã±ãŒã¹ã§ããã
ãã®èšäºã§ã¯ããã°ã€ã³ãšãã¹ã¯ãŒãã®èªèšŒã«ããã»ãã·ã§ã³ã®åæåãšããããã«å¯Ÿããããªãé«åºŠãªä¿è·ã®å æãšãããããè€éãªã±ãŒã¹ãæ±ããŸãã ãã€ãã®ããã«ãå®éã®ïŒãããŠã¹ã¯ã¬ãŒããŒã®éã§éåžžã«äººæ°ã®ããïŒã¿ã¹ã¯ã®äŸã䜿çšããŸãã
ã»ãšãã©ã®å Žåããµã€ãäžã®ãããã«å¯Ÿããä¿è·ã¯ãã¹ã¯ã¬ã€ããŒã«å¯Ÿãããã®ã§ã¯ãªããè©æ¬ºãäžæ£è¡çºãã³ã¡ã³ãã¹ãã ãªã©ã«å¯Ÿãããã®ã§ãã ãã ããããã¯åžžã«ããã®ç¹å®ã®ãµã€ããã¹ã¯ã¬ã€ãã³ã°ããããšã®åæ³æ§ãšå«çã«ã€ããŠèããè¿œå ã®çç±ã§ãã ãã®èšäºã§ã¯ãããšãã°ãææè ãã¹ã¯ã¬ã€ãã³ã°ã«å¯ŸããŠæ®éã§ããããšãããç¥ãããŠãããµã€ããéžæããŸãïŒãã ããç¹å¥ãªAPIã䜿çšããããšã奜ã¿ãŸãïŒã ã·ã³ãã«ãªã«ãŒã«ïŒãµã€ãã«ãªãŒãã³APIãããã°ããã®ææè ã¯ã¹ã¯ã¬ã€ããŒã«æºè¶³ããŸãããµã€ãã倧èŠæš¡ã§èšªåè ãå€ãå ŽåãAPIããã€ãã¹ããã¹ã¯ã¬ã€ãã³ã°ã®è² æ ã¯ç¹ã«æ°ã«ããŸããã
éå»ã®èšäºã®ç®æšã¯ãã¿ã¹ã¯ã®èšå®ããæçµçµæã®ååŸãŸã§ãã¹ã¯ãªãããäœæããã³äœ¿çšããããã»ã¹å šäœã瀺ãããšã§ããã ãã®èšäºã§ã¯ãWebã¹ã¯ã¬ã€ãã³ã°ã®ã»ãšãã©ã®åŽé¢ããã€ãã¹ãã代ããã«1ã€ã®ããªãçãã¿ã¹ã¯ã解決ããããã®ããŸããŸãªã¢ãããŒãã瀺ããŸãã ããŸããŸãªæ¹æ³ãšããŒã«ããããã®é·æãšçæã䞻芳çè©äŸ¡ãã³ãŒãäŸãããã ãã§ãã
åé¡ã®å£°æ
ä»åã¯ã顧客ã¯ååã®å©ããå¿ èŠãšããå¥ã®Webã¹ã¯ã¬ã€ããŒã§ãã 圌ã¯ãæåãªAmazonãµã€ãããïŒé¡§å®¢ã®ããã«ïŒããŒã¿ãååŸããããšèããŠããŸãã 圌ãå¿ èŠãšããããŒã¿ã®äžéšã¯ãèš±å¯ããããŠãŒã¶ãŒã«ã®ã¿æäŸãããŸãã ãã¡ããã顧客ã¯Amazonã«ã¢ã«ãŠã³ããæã£ãŠããŸãããåé¡ã¯ãã®ãµã€ããèªåèªèšŒããä¿è·ãããŠããããšã§ãã ã客æ§ã¯ããã®ä¿è·ã«åæ ŒããNode.jsäžã®ã¢ãžã¥ãŒã«ãå¿ èŠãšããŸãã åœç¶ãããã¯ããªãèªèº«ã®ãªã¹ã¯ã§ããªãã®ã¢ã«ãŠã³ããèªåçã«æ¿èªããããã®ããŒã«ã§ãããä»äººã®ã¢ã«ãŠã³ãããããã³ã°ããããšã§ã¯ãããŸããã
顧客ã¯ãã¿ã¹ã¯ã®èªåã®éšåã®åæããã§ã«å®è¡ããŠããŸãã 圌ã¯ã1ã€ã®ããããŒãš2ã€ã®CookieãhttpèŠæ±ã§èšå®ãããŠããå ŽåïŒãŸãã¯ãããã2ã€ãèš±å¯ã»ãã·ã§ã³ããåé¢ããã®ãé¢åãªå Žåã¯ãã¹ãŠïŒãå¿ èŠãªããŒã¿ãå©çšå¯èœã§ããããšã確èªããŸããã ããããŒã¯åžžã«åãã§ãããCookieã¯èš±å¯ãããAmazonãŠãŒã¶ãŒã®ããŒãžãããã©ãŠã¶ãŒã§ç°¡åã«ååŸã§ããŸãïŒDevToolsãŸãã¯åæ§ã®ããŒã«ã䜿çšïŒã Cookieã¯ããã«é³è åããããšã¯ãªããããäžåºŠå€ãã®æ¿èªæžã¿ãªã¯ãšã¹ããå®è¡ã§ããããã«ãªã£ãããCookieãåãåããŸãã
ããšãã°ã次ã®ã³ãŒãã¯ãæ¿èªãããAmazonãŠãŒã¶ãŒã®ã¿ãã¢ã¯ã»ã¹ã§ããã¡ãŒã«ã¢ãã¬ã¹ãå°å·ããå¿ èŠããããŸãã
var needle = require('needle'); var testURL = 'http://www.amazon.com/gp/profile/A14ZQ17DIPJ6UB/customer_email'; var cookies = { 'session-id': '111-2222222-3333333', // session-id 'ubid-main': '444-5555555-6666666', // ubid-main }; work(cookies); function work(cookies){ var options = { headers: { 'X-Requested-With': 'XMLHttpRequest' }, cookies: cookies }; needle.get(testURL, options, function(err, res){ if (err) throw err; console.log(res.body.data.email); }); }
ãããã£ãŠã顧客ã¯ã¢ã«ãŠã³ããããã°ã€ã³ãšãã¹ã¯ãŒããå ¥åãšããŠåãåããåºåæã«å¿ èŠãªCookieãæäŸããã¢ãžã¥ãŒã«ãå¿ èŠã§ãã ãã®ãããªãã®ïŒ
module.exports = function(email, password, work){ // magic work(cookies); }
顧客ã¯ãã®ã¢ãžã¥ãŒã«ãAmazonç¬èªã®Webã¹ã¯ã¬ã€ãã³ã°ã¹ã¯ãªããã§äœ¿çšããŸãã ç¬èªã®ãã¬ãŒã ã¯ãŒã¯ã«ãã蟌ãã§ã¹ã¯ã¬ã€ãã³ã°ããããšãã§ããŸãã ããã¯ç§ãã¡ã«ãšã£ãŠéèŠã§ã¯ãããŸããã
Amazon Webãµã€ãã®èªèšŒã€ã³ã¿ãŒãã§ã€ã¹ã®åæã«é²ãåã«ã1ã€ã®éèŠãªç¹ã«æ³šæããå¿ èŠããããŸãã å®éããã®ãµã€ãã¯ãéã§åäœããŸãã 圌ã¯åžžã«æ»æè ã«æ»æãããŠãããéåžžã顧客ã®ããã«ãAPIããã€ãã¹ããŠåæ³çãªããŒã¿ãååŸããªãããšã«é¢å¿ããããŸãã åœç¶ã®ããšãªããããã®ãµã€ãã®é²åŸ¡ã¡ã«ããºã ã¯åžžã«æ¹åãããŠããŸãã Amazonã§1åã®POSTãªã¯ãšã¹ãã§èªåèªèšŒãå®è¡ãããæ代ãä»ã§ãèŠããŠããŸãã ããã¯ãNode.jsãç»å Žããããªãåã®ããšã§ããïŒãã®åŸãPerlã§ã¹ã¯ã¬ã€ãããŸããïŒã ãã®åŸããªãã€ã¬ã¯ããé衚瀺ãã©ãŒã ãã£ãŒã«ããã¯ã³ã¿ã€ã ã¢ãã¬ã¹ãªã©ãåŸã ã«è¿œå ãããŸããã ãããã¯ãŒã¯ã§ã¯ãAmazonã§ã®æ¿èªã®äŸïŒPHP Curlãªã©ã䜿çšïŒãåŒãç¶ãèŠã€ããããšãã§ããŸããããã¯ãã»ãŒæ¬¡ã®ã¢ã«ãŽãªãºã ãå®è£ ããŠããŸãã
- ãã°ã€ã³ãã©ãŒã ã®ããããŒãžãžã®ã¯ã³ã¿ã€ã ãªã³ã¯ã®ããããŒãžãååŸããŸãã
- CookieïŒãã®1åéãã®ãªã³ã¯ã«é©ããŠããŸãïŒãä¿åããŸãã
- ããŒãžã解æããå¿ èŠãªãªã³ã¯ãååŸããŸãã
- ãã®ãªã³ã¯ã䜿çšããŠïŒä¿åãããCookieã䜿çšããŠïŒèŠæ±ãè¡ããããŒãžãååŸããŸãã
- ã¯ãããŒãä¿åããŸãïŒãããã¯ãã§ã«ç°ãªã£ãŠããŸããã¯ãïŒã
- ããŒãžã解æãããã°ã€ã³ãã©ãŒã ã®ãã¹ãŠã®é衚瀺ãã£ãŒã«ãã®å€ãååŸããŸãã
- ã¡ãŒã«ãšãã¹ã¯ãŒãã®ãã£ãŒã«ããè¿œå ããŸãã
- ãã©ãŒã ããã®POSTãªã¯ãšã¹ããã·ãã¥ã¬ãŒãããŸãïŒæåŸã«ä¿åãããCookieã䜿çšïŒã
- ã³ãŒã302ãšLocationããããŒã®ã¢ãã¬ã¹ã§å¿çãåãåããŸãã
- Cookieãä¿åããŸãïŒ3çªç®ã®ãªãã·ã§ã³ã¯æ¢ã«ãããŸãïŒ
- Locationããã¢ãã¬ã¹ã®ããŒãžãååŸããŸãïŒããã§ãCookieã䜿çšããŸãïŒ
- æåŸã«ãå¿ èŠãªCookieãååŸããèš±å¯ããããªã¯ãšã¹ãã«äœ¿çšããŸãã
çµéšè±å¯ãªã¹ã¯ã¬ã€ããŒã¯ããã®ã¢ã«ãŽãªãºã ãåçŽã§ããããšã«æ°ä»ããããããŸããã ãã®ãããªã¿ã¹ã¯ãå®è¡ãããšã1æéã®æ¯æãã§2æéåãããšãã§ããŸãããæéãæ··ä¹±ãããããšã¯ã»ãšãã©ãããŸããã
æ®å¿µãªããããã®ã¢ã«ãŽãªãºã ã¯éæšå¥šã§ãã 圌ãæåŸã«åããŠãããèªåèªèšŒã«å¯Ÿããä¿è·ã¯Amazonã§å°ãªããšã2åå€æŽãããŸããã ããã§ã8çªç®ã®ã¹ãããã§ã¯ããã©ãŒã ãéä¿¡ããåã«ãã¹ã¯ãªããã«ãã£ãŠããŒã¿ãå€æŽããããããhttp-trafficã®åçŽãªåæãšãªã¯ãšã¹ãã®å®è¡ã§ã¯åé¡ã¯è§£æ±ºãããŸããã ãããã®å€æŽåŸãAmazonã§ã®èªåèªèšŒã®ãããã¯ã¯ãã¢ããã¥ã¢ãã©ãŒã©ã ããããã®ããªãŒã©ã³ã¹äº€æã«åŸã ã«ç§»è¡ããŠããŸãã
ã¢ããŸã³ã®ä¿è·ããã€ãã©ã®ããã«åã³å€ããããèšãã®ã¯é£ããã§ãããééããªãèµ·ãããšèšãããšãã§ããŸãã ãããã£ãŠããã®ã¿ã¹ã¯ãæ€èšããå Žåãç¹å®ã®äœæ¥ã³ãŒãã¯ã察å¿ããã¢ãããŒããšããŒã«ãç解ããããã䟡å€ããããŸããã
ã¡ãœããã®æŠèŠ
ãã®ãããªåé¡ã解決ããããã®ãã¹ãŠã®æ¹æ³ã¯ã3ã€ã®ã«ããŽãªã«åé¡ã§ããŸãã
- ãã©ãŠã¶ã·ãã¥ã¬ãŒã·ã§ã³ïŒãã©ãã£ãã¯åæããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã¹ã¯ãªãããªã©ã®ããã«ãŒã¡ãœãããåä¿¡ããããŒã¿ã«åºã¥ããŠãªã¯ãšã¹ããå®è¡ããŸãã
- ãã©ãŠã¶ã®èªå䜿çšã ããã«ã¯ãç¹å¥ãªAPIïŒäŸïŒSelenium WDã䜿çšïŒãä»ããå®éã®ãã©ãŠã¶ãŒïŒäŸïŒChromeïŒã«ããã¹ã¯ãªããã®ç®¡çãããã³ãããã¬ã¹ãã©ãŠã¶ãŒïŒäŸïŒPhantomJSïŒã®äœ¿çšãå«ãŸããŸãã
- ãã©ãŠã¶ãæåã§äœ¿çšããŸãã ããã¯å¿ ãããã¹ã¯ã¬ã€ãã³ã°ã®èªååãå®å šã«æåŠããããšãæå³ããããã§ã¯ãããŸããããã©ã€ããªãã¬ãŒã¿ãŒãå®éã®ããŒãžãèŠãŠããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠå®éã®ã¢ã¯ã·ã§ã³ãå®è¡ããããšãæå³ããŸãã
ããã3ã€ã®ãã€ã³ãã®éžæã¯æããã§ã¯ãªããå°ãªããšã䞻芳çã§ãã 3ã€ã®ã«ããŽãªãã¹ãŠã«é·æãšçæãããããããã䜿çšããŠãåé¡ã解決ã§ãããããé çªã«æ€èšããŸãã
ã·ãã¥ã¬ãŒãããããã©ãŠã¶
䌌ããããªããšã以åã®2ã€ã®èšäºã§èª¬æãããŠããŸãã ã¹ã¯ã¬ã€ãã³ã°ããããã«ãæ£ããhttpãªã¯ãšã¹ãããµãŒããŒã«éä¿¡ããŸãã ãæ£ããããã®ã¯ãââã¹ã¯ã¬ã€ãã³ã°ãå®å šã«æåã§è¡ãããå Žåã«ãã©ãŠã¶ãéä¿¡ãããã®ã§ãã åã ã®ãªã¯ãšã¹ãã§éä¿¡ããå 容ãæ£ç¢ºã«èŠã€ããããã«ããã©ãŠã¶ã§ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®ããããŒãåæããããŒãžã®ãœãŒã¹ã調ã¹ãŸãã ãã®èšäºã®ã¿ã¹ã¯ã¯ã1ã€ã®ç¹ãé€ããŠãåã®2ã€ãšåºæ¬çã«éãã¯ãããŸããããã®å ŽåããããŒãžãœãŒã¹ãã®æŠå¿µã¯æ¥ç¶ã¹ã¯ãªãããæå³ããŸãã ãªã¯ãšã¹ãã«ããŒã¿ãè¿œå ããã³ãŒãã®éããã®ããŒã¿ã®éä¿¡å ãªã©ãç解ããå¿ èŠããããŸãã ãµã€ãã¹ã¯ãªããã«é©çšãããéåžžã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã
ãã®ã¢ãããŒãã®äž»ãªå©ç¹ã¯ããã®æ±çšæ§ã§ãã ä¿è·ã人ãšãã©ãŠã¶ã®æšæºçãªçµã¿åããã«ãã£ãŠå®è¡ãããå Žåããã®ééã®ããã®ã¢ã«ãŽãªãºã ã¯ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«ãã£ãŠèŠã€ããããšãã§ããŸãã çè«çã«ã¯ããã®èŠåã«äŸå€ã¯ãããŸããã Webã¹ã¯ã¬ã€ãã³ã°ã®äžçã«ã¯ããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã ãã§è§£æ±ºã§ããã¿ã¹ã¯ããããŸãã
ãã®ã¢ãããŒãã®äž»ãªæ¬ ç¹ã¯ããã®ç¡éã®åŽåã§ãã ããã¯ã粟ç¥çã«åŒ·ã人ãã¡ã«ãšã£ãŠã®æ¹æ³ã§ãããæéã«ç¹ã«å¶éã¯ãããŸããã å®éã«ã¯ã1ã€ã®è€éãªãµã€ãã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«æéããããå Žåãããããã®ããã«ã¹ã¯ãªãããèšè¿°ããŠãæ°åã®ãéåžžã®ããµã€ããã¹ã¯ã¬ã€ãã³ã°ã§ããŸãã çè«çã«ã¯ãã»ãã¥ãªãã£ã¡ãŒã«ãŒã¯ããã«æéãè²»ããããšãã§ãããã®è³æ ŒãåŸãã«ã¯ãçµéšè±å¯ã§æèœã®ããããã«ãŒããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«åŸäºããå¿ èŠããããŸãã ç°¡åã«èšãã°ãç¹å®ã®ã¬ãã«ã®è€éãã§ã¯ã顧客ãã¯ãŒã«ãªããã«ãŒã®ä»£ããã«ã³ããŒïŒããŒã¹ãã®åºå¡ãéãæ¹ãããæçã«ãªããŸãã ãŸãã¯ã泚æãæåŠãããããã®ããŒã¿ãªãã§è¡ããŸãã
ãã¹ãŠã®ã¹ã¯ã¬ãŒããŒãäžè¬ã«ãããã³ã°ã¹ãã«ãæã£ãŠããããã§ã¯ãªããããŒã å ã«ããã«ãŒãæã£ãŠããããã§ããªãããšã«æ³šæããŠãã ããã ãµã€ãäžã®ã¹ã¯ãªãããç解ããå¿ èŠæ§ã«çŽé¢ããŠãã»ãšãã©ã®äººã¯å¥ã®ã«ããŽãªã®ã¡ãœããã®æ³šæãéžæãæåŠããŸãã ããŠããŸãã¯å¥ã®å°é家ãéããŸãã
ãã©ãã£ãã¯ãšHTMLã®åææã«ä¿è·ã¢ã«ãŽãªãºã ã衚瀺ãããªãå Žåã¯ãä»ã®ã¢ãããŒãããå§ãã䟡å€ããããŸãã ã¢ã«ãŽãªãºã ããã€ã§ãçªç¶å€æŽãããå¯èœæ§ãããå ŽåïŒAmazonãªã©ïŒãæåŸã«èæ ®ãããªããŒã¹ãšã³ãžãã¢ãªã³ã°ããå§ãããŸãã ããã«ããªããŒã¹ãšã³ãžãã¢ãªã³ã°ã«ãã£ãŠååŸãããAmazonä¿è·ã³ãŒãããããšãã°Habrã«ã¢ããããŒããããå Žåããã®ã³ãŒããå€ãããšãããã«æžãããšãã§ããããã§ã-ããã¯ããã«çå®ã«ãªããŸãã
ãã®èšäºã§ã¯ãã³ãŒãäŸã§ä»ã®æ¹æ³ã説æããŸãã
ãã©ãŠã¶ã®èªå䜿çš
ãã®ã¢ãããŒãã¯åå¿è ã®ã¹ã¯ã¬ã€ããŒã®éã§éåžžã«äººæ°ãããããµã€ãã®åæã§åé¡ãçºçãããã³ã«ã¢ã¯ã»ã¹ããŸãã å³ããç· ãåãã®å°é家ããã®ã¢ãããŒããæ°ã«å ¥ã£ãŠããŸãã
ãã®ã¢ãããŒãã®äž»ãªå©ç¹ã¯ããµã€ãå ã®ã¹ã¯ãªãããç解ããå¿ èŠããªããããã¹ã¯ãªããä¿è·ãç°¡åã«ééã§ããããšã§ããã¹ã¯ãªããã¯åã«ãã©ãŠã¶ãŒã§å®è¡ãããã³ãŒãã§ã¯ãªãããŠã¹ãšããŒããŒãã䜿çšãããŠãŒã¶ãŒã«ãã£ãŠèµ·åãããå Žåãšåãããã«å®è¡ãããŸãã ã³ãŒãã¯ãè¿ãã®åºå¡ã³ããŒãã¹ã¿ã®æ瀺ã«äŒŒãŠããŸãã å¿ èŠã«å¿ããŠèªã¿ãããç·šéãããããªããŸãã
ãã®ã¢ãããŒãã®äž»ãªæ¬ ç¹ã¯ãã³ã³ãã¥ãŒã¿ãŒã§ä»ã®äººã®ã³ãŒããå®è¡ããããšã§ãã ãã®ã³ãŒãã«ã¯ãããšãã°ããããã¬ã¹ãã©ãŠã¶ãŒæ€åºåšãããŠãŒã¶ãŒã®è¡åã®ã€ã³ããªãžã§ã³ããªåæãŸã§ãããŸããŸãªã¿ã€ãã®èªååã«å¯Ÿããè¿œå ã®ä¿è·ãå«ãŸããå ŽåããããŸãã ãã¡ãããããšãã°ãã¹ã¯ãªãããæ€åºåšã«çœ®ãæãããããã·ãµãŒããŒã䜿çšã§ããŸãããããã«ã¯åããªããŒã¹ãšã³ãžãã¢ãªã³ã°ãå¿ èŠã§ãããäžè¬ã«ãã©ãŠã¶ãŒã«ç ©ããããçç±ã¯äžæã§ãã
ïŒæ³šïŒãŠãŒã¶ãŒã®è¡åãåæããæè¡ã®äŸã¯ã AreYouaHumanã® Webãµã€ãã§èŠãããšãã§ãããããã¬ã¹ãã©ãŠã¶ãŒæ€åºåšã¯ã åªãããã¬ãŒã³ããŒã·ã§ã³ã§èŠã€ããããšãã§ããŸããå幎ã®èšäºã®ã³ã¡ã³ãã«kirill3333ãæ®ãããªã³ã¯ã§ãã
ãã®ã¢ãããŒãã®ãã1ã€ã®æ¬ ç¹ã¯ããã©ãŠã¶ãéåžžã®ã¹ã¯ã¬ã€ããŒã¹ã¯ãªãããããå€ãã®ãªãœãŒã¹ãæ¶è²»ããããšã§ãã æ°åïŒããã«ã¯æ°çŸäžïŒã®ããŒãžãã¹ã¯ã¬ã€ãã³ã°ããå Žåãããã¯æªãèãã§ãã 顧客ã¯ã¢ãžã¥ãŒã«ãæãã§ããããã®ã³ãŒãã¯1åå®è¡ãããå°æ°ã®ãªã¯ãšã¹ãã®ã¿ãéä¿¡ããããããªãœãŒã¹ãå¿é ããå¿ èŠã¯ãããŸããã
Node.JSã®ã¹ã¯ãªãããããã©ãŠã¶ãèªåçã«äœ¿çšããããã®äžè¬çãªããŒã«ã¯æ°å€ããããŸãã ããã§ãäž»ãªãã®ã«ã€ããŠç°¡åã«èª¬æããŸãïŒç¡é§ã«èª°ããå¿ããå Žå-ã³ã¡ã³ãã§æããŠãã ããïŒïŒ
Selenium WDã¯ããã©ãŠã¶ãèªåã§äœ¿çšããããã®æãæåã§äººæ°ã®ããããŒã«ã§ãã è¿œå ã®çŽ¹ä»ã¯å¿ èŠãããŸããã ãªã³ã©ã€ã³ã§å€æ°ã®äŸãšãã³ãããããŸãã å°éçã«ã¹ã¯ã©ãããè¡ãããšãèããŠãã人ã¯èª°ã§ãSelenium WDãè©ŠããŠãã ããã
æ®å¿µãªãããSelenium WDã¯åé¡ã®è§£æ±ºã«ã¯é©ããŠããŸããã ããã䜿çšããã«ã¯ãJavaãSelenium WDèªäœïŒJavaã¢ããªã±ãŒã·ã§ã³ïŒããã©ãŠã¶ãŒããã©ãŠã¶ãŒãã©ã€ããŒãéžæããããã°ã©ãã³ã°èšèªïŒãã®å Žåã¯Node.jsããïŒã«Selenium WDã«ã¢ã¯ã»ã¹ããããã®ã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããŠæ§æããå¿
èŠããããŸãã ããã¯ç°¡åãªæ¹æ³ã§ã¯ãããŸãããNode.jsã§ããã«äœ¿çšã§ããã·ã³ãã«ãªã¢ãžã¥ãŒã«ãå¿
èŠãªããã§ãïŒæ¥µç«¯ãªå Žåã ' npm install
'ãªã©ãå¿
èŠã§ãïŒã
PhantomJSã¯ã WebKitã æèŒãããããã¬ã¹ãã©ãŠã¶ãŒã§ãã å®éã®ãã©ãŠã¶ã§ãµã€ããèµ·åããŸããããŠãŒã¶ãŒããŒãžã¯è¡šç€ºãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ä»£ããã«JavaScriptã®ã¹ã¯ãªããã䜿çšãããŸãã PhantomJSã®ãã©ãŠã¶ãŒã¯éåžžã«ãã£ã±ãã§ãããããSelenium WDã®ãã©ã€ããŒãããããã®æã¯æ£åžžã«æ©èœããŸãã
ã¿ã¹ã¯ã®èŠ³ç¹ããèŠããšãPhantomJSã«ã€ããŠç¥ã£ãŠããã¹ãäž»ãªããšã¯ãNode.jsãšåãJavascriptèšèªã䜿çšããŠããŸãããNode.jsã§ã¯ãªããšããããšã§ãã ããã®ããã«èŠããŸãããããã§ã¯ãããŸããã PhantomJSãçŽæ¥äœ¿çšããã¢ãžã¥ãŒã«ãNode.jsã§äœæããããšã¯ã§ããŸããã PhantomJSäžã§å¥ã®ã¹ã¯ãªãããäœæããå¥ã®ããã»ã¹ãéå§ããŠãã®ããŒã¿ãstdout
çµç±ã§åãåãã©ãããŒã¢ãžã¥ãŒã«ãäœæã§ããŸãã æãåçŽãªå Žåã次ã®ããã«ãªããŸãã
var sys = require('sys'), exec = require('child_process').exec; module.exports = function(callback) { exec('phantomjs script.js', function(err, stdout){ callback(err === null ? stdout : false); }); };
stdout
ãå°ç¡ãã«ããã䟿å©ãªã€ã³ã¿ãŒãã§ãŒã¹ã§äœæ¥ããããã«ãPhantomJSã§æ¢è£œã®ïŒãããŠèª°ããæ
éã«ãã¹ãããïŒã©ãããŒã®1ã€ã䜿çšããã®ã¯çã«ããªã£ãŠããŸãã
SlimerJS-倧ãŸãã«èšã£ãŠãåãPhantomJSã§ãããWebKitã§ã¯ãªãGeckoã§ãã ãã®å ŽåãSlimerJSãPhantomJSããå°ãªãã©ãããŒã§ãµããŒããããããšãéèŠã§ãã
CasperJSã¯ãPhantomJSããã³SlimerJSã®æãæåãªNode.jsã©ãããŒã§ãã CasperJSããã€ããããããåªããŠããçç±PhantomJSã¯ãããšãã°ãã®èšäº ïŒè±èªïŒã§ããæžãããŠããŸãã ãããã ãã®èšäº ïŒè±èªã§ãïŒã§ã¯ãCasperJSã䜿çšããAmazonã§ã®æ¿èªã®äŸãèŠãããšãã§ããŸãã ããã¯å®çšçãªãœãªã¥ãŒã·ã§ã³ã§ãããããã¯æè¯ã®éžæè¢ã§ã¯ãããŸããïŒå°ãªããšãããã®äŸã®ã³ãŒãéãè©äŸ¡ããŠãã ããïŒã CasperJSã®ä»£ããã«ã次ã®ãªã¹ãé ç®ã«æ³šæããããšããå§ãããŸãã
Horseman.jsã¯ãPhantomJSã®éåžžã«åªããã©ãããŒã§ãã ç§ãã¡ã®ãããªã¢ãžã¥ãŒã«ãæžãã®ã«æé©ã§ãã è€éãªã€ã³ã¹ããŒã«ããã³æ§ææé ã¯å¿
èŠãããŸããã ã¢ãžã¥ãŒã«ã§phantomjs-prebuilt
ãšnode-horseman
ãè¿œå ããã ãã§ååã§ãã Horseman.jsã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯éåžžã«ç°¡æœã§ãæè»æ§ããããèªã¿ãããã§ãã Horseman.jsã䜿çšããŠèšè¿°ãããã¢ãžã¥ãŒã«ã®äœæ¥ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
var Horseman = require('node-horseman'); var horseman = new Horseman(); var startURL = 'https://www.amazon.com/gp/css/homepage.html/'; module.exports = function(email, password, work){ horseman .userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36') .open(startURL) .click('#nav-tools>a') .waitForNextPage() .type('form [name=email]', email) .type('form [name=password]', password) .click('#signInSubmit') .waitForNextPage() .cookies() .then((cookies)=>{ work(cookies); }) .close(); }
ãã®ãããªã³ãŒãã¯ãããã¥ã¡ã³ããèŠãªããŠãèªãããšãã§ããŸãã ãããŠããã¯åäœããŸãã
NWã¯ããã1ã€ã®ç®¡ç察象ãã©ãŠã¶ãŒïŒä»¥åã®node-webkitïŒã§ãã Node.jsã®ã¹ã¯ãªããããBlinkãšã³ãžã³ãå¶åŸ¡ã§ããŸãã äž»ãªç®çã¯ãWebãã¯ãããžãŒã䜿çšããŠãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãäœæããããšã§ããããããã¬ã¹ãšããŠæ©èœããããšãã§ããŸãã NWã§ã¯ãæ¬æ Œçãªã¹ã¯ã¬ã€ãã³ã°ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã ããšãã°ã ãã®èšäºã® vmbã®ãããªãã®ã§ãã NWã®ãããªããŒã«ã¯ã顧客ãã³ãã³ãã©ã€ã³ãæããŠãã¿ã³ãŠã£ã³ããŠãå¿ èŠãšããå Žåã«ç¹ã«é©ããŠããŸãã ç§ãã¡ã®å ŽåãNWã¯æè¯ã®éžæã§ã¯ãããŸããã
Electronã¯ãWebããŒã¹ã®ãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ãã1ã€ã®ããŒã«ã§ãã å®éãããã¯NWã®è¥ããŠææãªç«¶äºçžæã§ããããã®å©ããåããŠãåªããææšã§ã¹ã¯ã¬ã€ãã³ã°ã¢ããªã±ãŒã·ã§ã³ãäœæããããšãã§ããŸãã ããã«ãElectronã¯ãããã¬ã¹ãã©ãŠã¶ãŒãšããŠç°¡åã«äœ¿çšã§ããŸãããã¢ãžã¥ãŒã«ã§ã¯ãªããã©ãããŒãä»ããŠã¢ãžã¥ãŒã«ã«æ¥ç¶ããããšããå§ãããŸãã
æªå€¢ã¯Electronã®æãæåãªã©ãããŒã§ãã ååã«ãããããããéåžžã«è¯ãå°è±¡ãäžããŸãã äœäººãã®åå¿è ã¹ã¯ã¬ã€ããŒããElectronã«ã€ããŠãŸã£ããç¥ããã«Nightmareã䜿çšã§ããããã«ã¹ã ãŒãºã«èšèšãããŠããŸãã ã€ã³ã¿ãŒãã§ãŒã¹ã¯Horseman.jsã«éåžžã«äŒŒãŠããŸãïŒã»ãŒåãã§ãïŒã ããã¯ãNightmareã䜿çšããŠèšè¿°ãããã¢ãžã¥ãŒã«ã®äœæ¥ã³ãŒããã©ã®ããã«èŠãããã§ãã
var Nightmare = require('nightmare'); var nightmare = Nightmare() var startURL = 'https://www.amazon.com/gp/css/homepage.html/'; module.exports = function(email, password, work){ nightmare .goto(startURL) .click('#nav-tools>a') .wait('#signInSubmit') .type('form [name=email]', email) .type('form [name=password]', password) .click('#signInSubmit') .wait('#nav-tools') .cookies.get() .end() .then(function (cookies) { work(cookies); }) .catch(function (error) { console.error('Authorization failed:', error); }); }
ååãšããŠããã¹ãŠã¯Horseman.jsã®å Žåãšåãã§ãã å éšã§ã¯ãPhantomJSã®ä»£ããã«Electronã䜿çšãããŠããŸãããç®ã«ã¯èŠããŸããã
Chimeraã¯ãæå°éã®äŸåé¢ä¿ãæã€Node.jsã®éåžžã®ã¢ãžã¥ãŒã«ã§ãïŒå®éã«ã¯request
ã®ã¿ïŒã ããŒãžãããŒããããã®ã³ã³ããã¹ãã§ã¹ã¯ãªãããå®è¡ãããã®çµæãNode.jsã®ã³ã³ããã¹ãã§åŠçã§ããŸãã ããã³ããšã³ãããã¹ã¯ã¬ã€ãã³ã°ã«æ¥ã人ã®äžã«ã¯ããã®ã¢ãžã¥ãŒã«ã®æ奜家ãããŸãããç§ã®æèŠã§ã¯ãããŸãã«ããããã«ã§ãã å°ãªããšãã顧客ãäŒã¿ããã©ãŠã¶ãšã³ãžã³ãæ¥ç¶ãããŠããªãã¢ãžã¥ãŒã«ãå¿
èŠãªå ŽåãChimeraã§ã¯ãªãã次ã®ãªãã·ã§ã³ã䜿çšã§ããŸãã
ZombieJS-ãã®ã¢ãžã¥ãŒã«ã¯ãå€ãã®å ŽåãPhantomJSã®é¡äŒŒç©ãšããŠäœçœ®ä»ããããŠãããNode.jsããçŽæ¥å®è¡ã§ããŸãã ZombieJSã¯ãã©ãŠã¶ãšã³ãžã³ã䜿çšããã request
ã jsdom
ã ws
ãªã©ã®äœ¿ãæ
£ããããŒã«ããã€ãã¹ããŸãã Horseman.jsãšæ¯èŒãããšãZombieJSã³ãŒãã¯æ±ãã«ããããã«èŠããŸãããChimeraã®åŸã«ã¯äŸ¿å©ããšç°¡æœãã®äŸã«ãªã£ãŠããŸãã
var Browser = require('zombie'); var browser = new Browser(); var startURL = 'https://www.amazon.com/gp/css/homepage.html/'; module.exports = function(email, password, work){ browser.visit(startURL, function(){ browser.clickLink('#nav-tools>a', function() { browser.fill('email', email); browser.fill('password', password); browser.pressButton('#signInSubmit', function(){ var cookies = browser.saveCookies().split('\n'); var newCookies = {}; for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i].split(';')[0].split('='); newCookies[cookie[0]] = cookie[1]; } browser.tabs.closeAll(); work(cookies); }); }); }); }
ZombieJSã®æãããªçæã«ã¯ãäžååãªããã¥ã¡ã³ããå«ãŸããŸãã 以åã¯è¯ãã£ãã®ã§ãããéçºè ã¯ãããããã«æªãããŸããã ãªã圌ããããããã®ãã«ã€ããŠé°è¬èª¬ãæ§ç¯ããã€ããã¯ãããŸããããZombieJSã§ç解ã§ãããªã³ã¯ã®äŸãããã€ã瀺ã ãŸã ã äŸãšAPIã§ãã
èå³æ·±ãããšã«ãPhantomJSãElectronãããã³ZombieJSã¯å€ãã®ãµã€ãã§ç°ãªã£ãŠèªèãããŠãããããäžæ¹ã®ããŒã«ãä¿è·ãããä»æ¹ã®ããŒã«ããããã¯ãããŠããŸãã ããã¯ããããã®3ã€ã®ããŒã«ã®ããããã䜿çšããæºåãã§ããŠããé倧ãªçç±ã§ãã ãã¡ããããã®ãããªè€éãªã±ãŒã¹ã¯ãŸãã§ãã ããšãã°ã3ã€ã®ã¹ã¯ãªããã¯ãã¹ãŠAmazonãµã€ãã§æ©èœããŸãã ãŸã...圌ããåããŠããéã
ãã©ãŠã¶ãŒã®æå䜿çš
ãã®ç¹ã¯ã楜ãã¿ã®ããã«ããã«èšèŒãããŠããããã«èŠãããããããŸããããããã§ã¯ãããŸããã ãã®ãããªã¢ãããŒããæ£åœåãããã ãã§ãªããæé©ã§ããå ŽåããããŸãã ããšãã°ã1åèªååããã®ãé£ããã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠãããããã®åŸç°¡åãªæäœãäœåºŠãèªåçã«å®è¡ããå Žåã ããšãã°ãAmazonã«ãã°ã€ã³ããŠããããããç Žæ£ããã®ãåŸ ã¡ãŸãã
ãã®ã¢ãããŒãã®äž»ãªæ¬ ç¹ã¯ãã¹ã¯ãªãããå®è¡ãããã³ã«ã©ã€ããŠãŒã¶ãŒãå¿
èŠã«ãªãããšã§ãã ã€ãŸãã cron
ã¹ã¯ã¬ã€ãã³ã°ãéå§ããããšã¯ã§ããŸãããããŒãžãèŠãŠèª°ããšäœããããå¿
èŠããããŸãã
ãã®ã¢ãããŒãã®äž»ãªå©ç¹ã¯ãããã»ã¹ã®å¯èŠæ§ã§ãã ãŠãŒã¶ãŒã¯ããŒãžã§äœãèµ·ãã£ãŠãããã確èªããäœãåé¡ãçºçããå Žåã«æ°ä»ãã§ãããã ãŸãã¯å€å圌ã¯ãããä¿®æ£ããããšãã§ããŸãã ããšãã°ããµã€ããçªç¶captchaãèŠæ±ãå§ããå ŽåïŒAmazonã®ããã«ãèªåèªèšŒã䜿çšããŠé·ãéç·åŒµãããå ŽåïŒã
ãã©ãŠã¶ãã¹ã¯ãªããã«æåã§è¿œå ããæãç°¡åãªæ¹æ³ã¯ããŠãŒã¶ãŒã«æ瀺ãæžãããšã§ãã ããšãã°ããã©ãŠã¶ãŒããCookieãååŸããŠã¹ã¯ãªããããã¹ãã«é 眮ããæ¹æ³ã説æããã¯ãªã¢ããã¹ãã¯ãåãããã°ã©ã ã§ãããã³ã³ãã¥ãŒã¿ãŒçšã§ã¯ãªãå人çšã§ãã å€ãã®ããã°ã©ããŒã¯ãã®ãããªããã°ã©ã ãããŸãæžãããšãã§ããå€ãã®é¡§å®¢ã¯æéãšãéãç¯çŽããããã«ç°¡åã«åŠ¥åããããšãã§ããŸãã æ®å¿µãªãããã客æ§ã«ã¯ãŠãŒã¶ãŒã®æ瀺ãå¿ èŠãšããªãã¢ãžã¥ãŒã«ãå¿ èŠã§ãã
å¥ã®æ¹æ³ã¯ãç¬èªã®ãã©ãŠã¶ãŒãäœæããããšã§ãããã©ãŠã¶ãŒã¯ãAmazonã§ã®æ¿èªã®ããã«ã®ã¿èµ·åãããéããããŸãã ããšãã°ãElectronã«åºã¥ããŠããŸãã ããã¯ããã»ã©é£ãããããŸããã Nightmareã¹ã¯ãªããã«å°ããªå€æŽãå ãããšãã¹ã¯ãªããã¯åäœããããŒãžã衚瀺ããŸãã ãŠãŒã¶ãŒã¯ãã¹ã¯ãªããããã©ãŒã ãã£ãŒã«ãã«å ¥åããŠéä¿¡ããæ¹æ³ã確èªããŸãã è¿œå ãã©ã¡ãŒã¿ãŒã§Nightmareãåæåããå¿ èŠããããŸãã ãã®ããã«ïŒ
var nightmare = Nightmare({ show: true })
ããšãã°ããµã€ãããã£ããã£ãèŠæ±ãå§ããããšãããããŸãããããã¯ããã»ã©çããããšã§ã¯ãããŸããã ããã«ããŠãŒã¶ãŒã¯é»åãŠã£ã³ããŠã«ãã£ããã£ãçŽæ¥å ¥åã§ãããã¹ãŠãæ©èœããŸãã ã¹ã¯ãªããã®é 延ã ããé·ãèšå®ããå¿ èŠããããŸããããããªããšããŠãŒã¶ãŒãéã«åããªãå ŽåããããŸãã äžè¬ã«ããã©ãŒã ãã£ãŒã«ãã®èªåå ¥åãåé€ããŠããŠãŒã¶ãŒã«æäŸã§ããŸãã ããããã°ãã¹ã¯ãªããã®ããã¹ãã«ãã¹ã¯ãŒããä¿åããªãããšãå¯èœã«ãªããŸãã ããã«ãç°ãªããŠãŒã¶ãŒã«ä»£ãã£ãŠãç°ãªãæç¹ã§ã¹ã¯ã¬ã€ããŒãè¡ãããšãå¯èœã«ãªããŸãã
äžæ¹ãNightmareã¯Captchaãªã¯ãšã¹ããèªèãã Death by Captchaãªã©ã®ãµãŒãã¹ã䜿çšããŠãããæž¡ãããã«æããããšãã§ããŸãããã¿ã¹ã¯ã«ã¯ãã®ãããªèŠä»¶ã¯ãããŸããã
ãããã«
, - . , , , . , , . , , . , ( ), ââ .
, , , . .