Webbot programming
จาก Wiki2
Some people configure computers to make them work as designed. I persuade computers into doing what they need to do.
เนื้อหา |
Terms
Web Crawler, Web robots, Webbot, Botnet, Web spiders, ants (Automatic indexers bots),Knowbot, web scutters, screen scrapers ฯลฯ คือโปรแกรมคอมพิวเตอร์ที่ท่องไปตามเว็บต่างๆเพื่อรวบรวมข้อมูลที่ต้องการ Google ก็ใช้ Webbot เพื่อรวบรวมข้อมูลจากเว็บต่างมาทำเป็น Index ให้เราค้นหาได้อย่างรวดเร็ว
คำนำ
- ความสนใจแรกของผมคือเล่น Internet เปิดเว็บ และใช้บริการ Online ต่างๆไปเรื่อยๆ เป็นผู้ใช้ Internet ที่สนใจมันอย่างจริงจัง
- ความสนใจต่อมาคือเริ่มสงสัยว่าเว็บไซร์ต่างๆทำมาได้อย่างไร จึงเป็นที่มาของการเรียนทำเว็บ
- เมื่อทำเว็บมากๆจึงรู้ว่าเว็บมีสองประเภท คือเว็บที่เป็นเนื้อหา กับเว็บที่เป็น Application เหมือนกับโปรแกรมคอมพิวเตอร์ที่เราใช้ในเครื่องทั่วไป แต่ Web Application ใช้ Browser เป็น User Interface และไม่ต้องเสียเวลาติดตั้งในเครื่องเราให้เปลือง Harddisk เว็บ Application มีลักษณะเป็น Client-Server ตัวโปรแกรมและข้อมูลอยู่ที่ Server มี Browser ทำงานอยู่ในฝั่ง Client หรือผู้ใช้
- เริ่มเรียนเขียนโปรแกรมบนเว็บด้วย ภาษา Basic.Net แต่ต่อมาก็เปลี่ยนเป็น PHP เพราะ PHP ไม่ซับซ้อนและหา Web Hosting ได้ง่าย มีตัวอย่างให้เรียนหรือ Copy ไปใช้ได้เลย
- วันนี้ผมอยากทำเว็บแต่ไม่อยากเสียเวลาดูแลเว็บ จะให้คอมพิวเตอร์ทำเว็บแทนผม โดยไปรวบรวมข้อมูลจากเว็บต่างๆมา Update ข้อมูลในเว็บให้ผม
- ผมอยากทำเว็บเกี่ยวกับหุ้นและการลงทุน ซึ่งต้องรวบรวมข้อมูลราคาตลาด การซื้อขาย ผลตอบแทน เพื่อช่วยผู้ใช้การตัดสินใจเลือกซื้อหุ้นที่ให้ผลตอบแทนสูงในความเสี่ยงที่ยอมรับได้ แต่ข้อมูลเกี่ยวกับหุ้นเหล่านั้นเปลี่ยนแปลงทุกวัน และอยู่กระจัดกระจายตามเว็บต่างๆ ซึ่งหากต้องรวบรวมด้วยมือจะเสียเวลาและเหนื่อยมาก ผมจึงสนใจ Webbot เพื่อให้ Webbot ไปหาข้อมูลเหล่านั้นมา Update เว็บของผมโดยอัตโนมัติ
- สิ่งทีจดในหน้านี้เป็นการสรุปเรื่องที่เรียนรู้เกี่ยวกับ Webbot เพื่อไม่ให้ลืม และอาจจะเป็นประโยชน์กับผู้อื่นบ้าง
เนื้อหา
- ทำไมต้องทำ Webbot
- Webbot ที่จะเขียนจะใช้ภาษา PHP โดยศึกษาจากเว็บไซร์ต่างๆ และ หนังสือชื่อ Webbots, Spiders, and Screen Scrapers เขียนโดย Michael Schrenk ซึ่งหา Download ได้ฟรีจากใน Internet หรือจะซื้อเพื่อเป็นกำลังใจผู้เขียน ซึ่งหนังสือนี้จะสอนหลายอย่างเกี่ยวกับ Webbot
สิ่งที่ต้องระวัง
- การเขียน Webbot ก็เหมือนกับ Hacker ซึ่งเป็นที่รังเกียจของเจ้าของเว็บต่างๆ เพราะเว็บต่างๆถูกสร้างมาเพื่อให้คนดู เจ้าของเว็บจะได้โฆษณาบ้าง หรือประชาสัมพันธ์อะไรบ้าง หรือได้ Credit จากการนำเสนอข้อมูลต่างๆ เจ้าของเว็บต่างๆไม่ได้สร้างเว็บไว้ให้เว็บอื่นๆมานำใช้ข้อมูลของเขาไปใช้ มีบางเว็บซึ่งเปิดให้เว็บอื่นๆนำข้อมูลไปใช้ ซึ่งเว็บเหล่านั้นจะสร้าง Web Service ซึ่งเหมือน API เพื่อให้เว็บอื่นมาเรียกใช้ข้อมูลและบริการจากเว็บของเขา ซึ่งอาจมีค่าธรรมเนียบบ้าง เว็บโดยทั่วไปจึงมีมาตราการต่างๆเพื่อป้องกัน Webbot และไม่ยินดีต้อนรับ Webbot
- เว็บต่างๆจะมี File ชื่อ robots.txt เก็บไว้ที่ Root Directory ของเว็บนั้นๆ เช่น http://www.google.co.th/robots.txt เพื่อกำหนดว่า directory ไหนบ้างที่ห้ามเข้า หรือเข้าไปแล้วก็ไม่ได้ข้อมูลอะไร ซึ่งควรจะต้องเคารพ
- ผู้เขียน Webbot จึงต้องเคารพเจ้าของเว็บที่เราไปเอาข้อมูลเขามาใช้ โดยให้เครดิตที่มาของข้อมูล ระวังไม่ให้ไปสร้าง Workload ให้กับเจ้าของเว็บ เช่นเข้าไปเช็คเว็บเขาบ่อยเกินไป หรือเขียนโปรแกรมไม่ดี เกิด Loop ซึ่งเหมือนการโจมตีเว็บของเขา หรือไป Post สิ่งต่างๆในเว็บเขา เช่น Back Link หรือโฆษณา หากคุณไม่ระวังและทำความเดือนร้อนให้เจ้าของเว็บ เขาอาจ Block Account หรือ IP ของคุณ หรือได้รับโทษทางอาญาเป็นของแถม
- ผมต้องการทำเว็บที่ต้องการข้อมูลความเคลื่อนไหวของตลาดหุ้น หากไม่ใช้ Webbot ก็จำเป็นต้องเข้าเว็บเหล่านั้นเพื่อรวบรวมข้อมูล ซึ่งต้องเพิ่ม Workload และ Bandwidth ของเว็บเหล่านั้นอยู่แล้ว ซึ่งอาจจะมากกว่า Webbot ซึ่งทำงานเร็วกว่า และเฉพาะเจาะจงกว่า ผมจะระวังไม่ให้ Webbot ของผมสร้างความเสียหายกับเว็บที่เกี่ยวข้อง และผมจะให้เครดิตเว็บเหล่านั้นเป็นการตอบแทนนะครับ และข้อมูลที่ผมรวบรวมไว้ก็อาจเป็นประโยชน์กับเว็บอื่นที่จะมาเอาไปใช้ต่อจากผม โดยไม่ต้องไปรบกวนเว็บที่เกี่ยวข้องเป็นการลด Workload ของเว็บที่เกี่ยวข้อง และการกระทำนี้เพื่อประโยชน์ต่อผู้ใช้ทั่วไปจึงหวังว่าจะได้การให้อภัยจากเว็บที่เกี่ยวข้องด้วยนะครับ
- Webbot บางตัวก็ได้รับการต้อนรับเป็นอย่างดีจากเจ้าของเว็บทุกแห่ง เช่น Webbot จาก Google เนื่องจาก Google มาเพื่อเอาข้อมูลไปทำ Index สำหรับ Search Engine ซึ่งให้ประโยชน์กับเจ้าของเว็บ ผมเองก็กำลังหาทางทำ Webbot ที่เป็นประโยชน์กับเจ้าของเว็บต่างๆเช่นกัน นอกจากจะไปรวบรวมข้อมูลจากเว็บของเขาผมหวังจะทำอะไรเป็นการตอบแทนด้วย เช่นอาจจะใส่ Link ไว้ในข้อมูล เพื่อให้ผู้ใช้ได้ไปดูข้อมูลนั้น ที่เว็บที่ผมไปเอาข้อมูลมา
เตรียมความพร้อม
ความรู้ความสามารถ
- มีประสพการณ์ในการเขียน Web และ Web form
- ซึ่งหมายว่าคุณควรมีความรู้เรื่อง HTML, CSS, Javascript บ้าง
- มีความรู้เกี่ยวกับการเขียนโปรแกรมด้วย PHP และหากจะให้ดีสามารถติดต่อฐานข้อมูลด้วยก็ดีจะได้ไว้เก็บข้อมูลที่รวบรวมมาได้
ระบบ
- การเขียน Webbot คือการเขียนโปรแกรมในเครื่องคอมพิวเตอร์ของเรา เพื่อทำงานกับเว็บใน Internet หรือ Intranet คุณควรมีคอมพิวเตอร์ที่ติดตั้ง PHP และติดต่อกับ Internet ได้ ในช่วงแรกคุณอาจไม่ต้องมี Internet Connection ก็ได้ โดยจำลองเครื่องคอมพิวเตอร์ของคุณเป็น Web Server เพื่อทดลองก่อนก็ได้
- สำหรับผมมีทั้งคอมพิวเตอร์ที่ติดตั้ง PHP และ Web server และมี Internet connection นอกจากนั้นผมยังได้เช่า Web Hosting ไว้ด้วย เป็นแบบ Shared Host ปีละ 500 บาท ผมจึงสามารถเขียนโปรแกรม Webbot ให้ทำงานจากเครื่องผมเอง หรือเขียนโปรแกรมให้ทำงานจาก Web Hosting ที่ผมเช่าไว้ก็ได้
- มีหนังสือ และ Program Lib มาไว้ใช้ดูในเว็บ http://www.schrenk.com/nostarch/webbots/
ขั้นตอนที่ต้องทำ
การรวบรวมข้อมูลหุ้นจากเว็บต่างๆ เริ่มจาก
- ดูดหน้าเว็บที่เกี่ยวข้องลงมาก่อน
- จากนั้นคัดเลือกเฉพาะข้อมูลที่ต้องการ
- แต่หากเว็บที่เราจะไปเอาข้อมูลต้องการ Log in เราก็ต้องทำ Form Submission เพื่อ Login
- เมื่อได้ข้อมูลมาแล้วก็ต้องจัดเก็บลงฐานข้อมูล เพื่อนำไปแสดงในเว็บของเรา
การ Download Web pages
- ก่อนจะดูดข้อมูลจากเว็บ เช่น ราคาหุ้น เราต้องเอา เว็บ Page ที่มีราคาหุ้นลงมาก่อน ซึ่งทำได้สองวิธีคือใช้
- PHP ล้วนๆ
- PHP/CURL
- การ Run Program PHP ทำได้สองวิธีคือใช้ Web Browser หรือใช้ Command Shells ซึ่งการใช้ Command Shells จะทำงานได้ดีกว่าตรงที่ ข้อมูลที่ได้มาจะแสดงให้เห็นโดยไม่ Render เหมือน Web Browser
PHP ล้วนๆ
- วิธีที่ 1
# Define the file you want to download
$target = "http://www.schrenk.com/nostarch/webbots/hello_world.html";
$file_handle = fopen($target, "r");
# Fetch the file
while (!feof($file_handle))
echo fgets($file_handle, 4096);
fclose($file_handle);
- วิธีที่ 2 ให้ผลลัพธ์ เป็น Array
<?
// Download the target file
$target = "http://www.schrenk.com/nostarch/webbots/hello_world.html";
$downloaded_page_array = file($target);
// Echo contents of file
for($xx=0; $xx<count($downloaded_page_array); $xx++)
echo $downloaded_page_array[$xx];
หรือ
echo "<xmp>";
print_r( $downloaded_page_array); หรือ var_export($downloaded_page_array);
echo "</xmp>";
?>
- วิธีที่ 3
<?php
$page = join( '', file('http://www.noklek.com'));
echo "<xmp>"; // ป้องกัน Browser Render ข้อมูล
echo $page;
echo "</xmp>";
?>
- วิธีที่ 4
$url = "http://www.howtogeek.com";
$str = file_get_contents($url);
echo $str;
PHP/cURL
- cURL เป็น Open Source PHP Library ที่ใช้ทำ Webbot เขียนโดย Daniel Stenberg ชาว Swedish รองรับ Protocols หลากหลาย ซึ่งนอกจากจะใช้ Download Web pages แล้วยังทำ Authentication, Submit Form ฯลฯ
- เราจึงควรใช้ cURL แต่เนื่องจาก cURL มีขั้นตอนในการเรียกใช้ หลายขั้นตอน เพื่อความสะดวก จึงมีการเขียน Function ครอบไว้เพื่อความสะดวกในการเรียกใช้ ซึ่งหนังสือเล่มนี้เขียนมาให้ สามารถ Download Library ได้ที่ http://www.schrenk.com/nostarch/webbots/DSP_download.php
- เวลาเขียนโปรแกรมก็ include Library ไว้ด้วย สำหรับการ download Web page ก็ include LIB_http
- และควรแก้ LIB_http.php เพื่อกำหนดชื่อ Webbot และที่เก็บ Cookies
define("WEBBOT_NAME", "Test Webbot"); # How your webbot will appear in server logs
define("CURL_TIMEOUT", 25); # Time (seconds) to wait for network response
define("COOKIE_FILE", "c:\cookie.txt"); # Location of cookie file
- LIB_http มีหลาย Functions ให้เลือกใช้ ดังต่อไปปนี้
http_get($target, $ref) # Simple get request (w/o header) http_get_withheader($target, $ref) # Simple get request (w/ header) http_get_form($target, $ref, $data_array) # Form (method ="GET", w/o header) http_get_form_withheader($target, $ref, $data_array) # Form (method ="GET", w/ header) http_post_form($target, $ref, $data_array) # Form (method ="POST", w/o header) http_post_withheader($target, $ref, $data_array) # Form (method ="POST", w/header) http_header($target, $ref) # Only returns header
- ตัวอย่างการ Downlaod Web Page พร้อมทั้ง Header
# Include http library
include("LIB_http.php");
# Define the target and referer web pages
$target = "http://www.schrenk.com/publications.php";
$ref = "http://www.schrenk.com";
# Request the header
$return_array = http_get_withheader($target, $ref);
# Display the header
echo "FILE CONTENTS \n";
var_dump($return_array['FILE']);
echo "ERRORS \n";
var_dump($return_array['ERROR']);
echo "STATUS \n";
var_dump($return_array['STATUS']);
- ตัวอย่างการ Downlaod Web Page พร้อมแบบไม่ใช้ LIB_http
<?php
function get_url_contents($url){
$crl = curl_init();
$timeout = 5;
curl_setopt ($crl, CURLOPT_URL,$url);
curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
$ret = curl_exec($crl);
curl_close($crl);
return $ret;
}
echo "<xmp>";
echo get_url_contents("http://www.beingpro.com/jl/");
echo "</xmp>";
?>
การ Parsing หรือการแยกเอาเฉพาะข้อมูลที่ต้องการ
- เวลาเรา Download Web Page ลงมาก็จะมี HTML Tag ต่างๆ ติดลงมาด้วย การแยกเอาแต่ข้อมูลที่ต้องการออกมาโดยอาศัย HTML Tag อาจมีปัญหาหาก เว็บเขียน HTML แบบผิดๆ เช่นมี Open Tag แต่ไม่มี Close Tag เป็นต้น จึงต้องอาศัย HTMLTidy แปล File ให้มี HTML ที่ถูกต้อง แต่ก็แก้ได้ไม่หมดทุกอย่าง
- การทำ Parsing จะใช้ Function ใน LIB_parse.php
Splitting a String at a Delimiter: split_string()
include("LIB_parse.php");
$string = "The quick brown fox";
# Parse what's before the delimiter, including the delimiter
$parsed_text = split_string($string, "quick", BEFORE, INCL);
// $parsed_text = "The quick"
# Parse what's after the delimiter, but don't include the delimiter
$parsed_text = split_string($string, "quick", AFTER, EXCL);
// $parsed_text = "brown fox"
Parsing Text Between Delimiters: return_between()
# Include libraries
include("LIB_parse.php");
include("LIB_http.php");
# Download a web page
$web_page = http_get($target="http://www.nostarch.com", $referer="");
# Parse the title of the web page, inclusive of the title tags
$title_incl = return_between($web_page['FILE'], "<title>", "</title>", INCL);
# Parse the title of the web page, exclusive of the title tags
$title_excl = return_between($web_page['FILE'], "<title>", "</title>", EXCL);
# Display the parsed text
echo "title_incl = ".$title_incl;
echo "\n";
echo "title_excl = ".$title_excl;
Parsing a Data Set into an Array: parse_array()
include("LIB_parse.php"); # Include parse library
include("LIB_http.php"); # Include cURL library
$web_page = http_get($target="http://www.fbi.gov", $referer="");
$meta_tag_array = parse_array($web_page['FILE'], "<meta", ">");
for($xx=0; $xx<count($meta_tag_array); $xx++)
echo $meta_tag_array[$xx]."\n";
Parsing Attribute Values: get_attribute()
include("LIB_parse.php"); # include parse library
include("LIB_http.php"); # include curl library
// Download the web page
$web_page = http_get($target="http://www.schrenk.com", $referer="");
// Parse the image tags
$meta_tag_array = parse_array($web_page['FILE'], "<img", ">");
// Echo the image source attribute from each image tag
for($xx=0; $xx<count($meta_tag_array); $xx++)
{
$name = get_attribute($meta_tag_array[$xx], $attribute="src");
echo $name ."\n";
}
Removing Unwanted Text: remove()
$uncommented_page = remove($web_page, "<!--", "-->"); $links_removed = remove($web_page, "<a", "</a>"); $images_removed = remove($web_page, "<img", " >"); $javascript_removed = remove($web_page, "<script", "</script>");
Useful PHP Functions
- The stristr() function is handy if you want to detect whether or not a specific word is mentioned in a web page. For example, if you want to know if a web page mentions dogs, you can execute the script shown in Listing 4-11.
if(stristr($web_page, "dogs"))
echo "This is a web page that mentions dogs.";
else
echo "This web page does not mention dogs";
- The PHP built-in function str_replace() puts a new string in place of all occurrences of a substring within a string, as shown in Listing 4-12.
$org_string = "I wish I had a Cat.";
$result_string = str_replace("Cat", "Dog", $org_string);
# $result_string contains "I wish I had a Dog."
การกรอกข้อมูลในเว็บ Form Submission
หรือเรียกว่า Form emulation
การจัดการกับข้อมูลที่ได้มา
Others Tip
- <xmp> ช่วยไม่ให้ Browser Render page
- CAPTCHA คือรูปภาพที่แสดงตัวหนังสือ ซึ่งใช้ป้องกันพวก Webbot ไม่ให้เข้าถึงข้อมูล หรือใช้งานเว็บ โดยคนที่ต้องการเข้าถึงข้อมูลหรือใช้บริการนั้นจะต้องกรอกให้ถูก เพื่อพิศูจน์ว่าตัวเองไม่ใช่ Webbot
เพื่ออำนวยความสะดวกให้พวก Webbot จึงมีเว็บที่จ้างคนอ่าน CAPTCHA และส่งกลับให้พวก Webbot เพื่อรับเงินค่าจ้าง ดูรายละเอียด
http://www.zdnet.com/blog/security/inside-indias-captcha-solving-economy/1835
Settrade
- เว็บไซร์ของ Settread จะใช้ Javascript ดึงข้อมูลใส่ใน Frame อย่างหน้านี้ จะเห็นว่ามีข้อมูลของ Set100 อยู่ตอนล่างของหน้า หากเอา URL ไปดึงข้อมูลจะไม่ได้ข้อมูล เพราะข้อมูลจริงๆอยู่ใน Frame ที่ได้จาก URL อื่น การดึงข้อมูลต้องหา URL จากการคลิกขวาที่ข้อมูลและเลือก This Frame>Open Frame in new windows จะได้ URL ดังนี้ http://www.settrade.com/C13_MarketSummarySET.jsp?command=SET100 จากนั้น Download Web page ด้วยวิธีข้างต้น
- ตัวอย่าง Import from Settread.com
<html>
<head>
<title>Sample Download</title>
</head>
<body>
<?php
# Define the file you want to download
$target = "http://www.settrade.com/C13_MarketSummarySET.jsp?command=SET100";
$file_handle = fopen($target, "r");
# Fetch the file
while (!feof($file_handle))
echo fgets($file_handle, 4096);
fclose($file_handle);
?>
</body>
</html>
