วันพฤหัสบดีที่ ๒๖ กรกฎาคม พ.ศ. ๒๕๕๐

HACK#41 อย่าได้ลองสิ่งนี้

เครื่องมือใช้งาน Google ที่ผิดข้อตกลงการให้บริการของ Google

แม้ว่า Google API จะทำอะไรต่อมิอะไรได้หลากหลาย แต่ก็ยังมีคนกลุ่มหนึ่ง (รวมทั้งผู้เขียนด้วย) ที่คิดว่ามันน่าจะทำได้มากกว่านั้น มีบางคนได้สร้างโปรแกรมที่เข้าถึง Google ก่อนที่จะมี Google API เสียอีก

โดยที่เราเสนอในที่นี้นั้นก็เพราะสองเหตุผลคือ เหตุผลแรกคือเพื่อให้แนวคิดแก่คุณว่าซอฟท์แวร์ประเภทใดที่คุณไม่ควรใช้ถ้าหากว่าไม่อยากจะถูกแบนจาก Google และเหตุผลที่สองคือเพื่อสร้างแรงบันดาลใจแก่คุณ ซึ่งซอฟท์แวร์เหล่านี้ไม่ได้เขียนขึ้นมาเพราะว่าต้องการแหกกฎTerms of Service ของ Google แต่อย่างใด แต่ว่าถูกเขียนขึ้นมาเพราะว่าต้องการให้งานที่ทำลุล่วงไปเท่านั้นเอง เขาเหล่านั้นเป็นนักสร้างสรรค์ มุ่งผลในทางปฏิบัติ และควรค่าแก่การพิจารณาเป็นอย่างยิ่ง

  • Tip: ข้อตกลงในการให้บริการของ Google (Terms of Service : TOS) นั้นคือห้ามการคิวรีโดยอัตโนมัติจากฐานข้อมูล Google ยกเว้นการคิวรีผ่าน Google API การสืบค้นอย่างอัตโนมัตินั้นเป็นข้อห้ามที่ถือว่าเป็นเรื่องใหญ่ และ Google ก็จริงจังมากด้วย Google เคยห้ามการ access จาก IP Address ทั้งบล็อกมาแล้ว ดังนั้นจึงควรระวังในข้อนี้ให้มาก
อย่าได้ลองสิ่งเหล่านี้
ข้างล่างนี้เป็นรายการของเครื่องมือที่ไม่ควรใช้ เว้นแต่ว่าอยากจะโดนแบนโดย Google เท่านั้น

Gnews2RSS (http://www.voidstar.com/gnews2rss.php?q=newsxnum=15)

เครื่องมือนี้จะเปลี่ยน Google News ให้อยู่ในรูปแบบของศูนย์รวมข่าวให้แก่สมาชิกได้

WebPosition Gold (http://www.webposition.com/)

ทำหน้าที่หลากหลาย ตั้งแต่การออกแบบหน้าเว็บสำหรับการสืบค้นที่ใช้งานง่าย หรือช่วยในการกรอก URL โดยอัตโนมัติ กระทั่งถึงวิเคราะห์การเข้าถึงหน้าเว็บเพจจากเครื่องมือการสืบค้นต่างๆ แต่ที่โชคไม่ดีก็คือ คุณสมบัติในการตรวจสอบอันดับเว็บ (rank-checking) ของมันขัดกับ Terms of Service ของ Google อย่างไรก็ตาม โปรแกรมนี้ทำอะไรได้หลายอย่าง แต่ว่าคุณควรจะใช้เฉพาะงานตรวจสอบตำแหน่ง (position-checking) เท่านั้นก็พอ

AgentWebRanking (http://www.agentwebranking.com/)

สามารถตรวจสอบอันดับเว็บของคุณใน Search Engine หลักๆนับสิบทั่วโลก และ Search Engine ที่ว่านั้นก็มี Google รวมอยู่ด้วย อย่างไรก็ตาม โปรแกรมนี้ผิด Terms of Service ของ Google ในส่วนของการใช้งาน Google API

โปรแกรมอื่นที่น่าสนใจ
เมื่อมองหาโปรแกรมสำหรับ Search Engine ทั้งหลายที่อยู่ในข่ายข้างต้น ให้จับตามองสิ่งเหล่านี้ให้ดี

  • ให้บริการตรวจสอบอันดับใน Google โดยไม่ต้องใช้ developer key แต่อย่างใด
  • ให้บริการสืบค้นอัตโนมัติ และดึงข้อมูลที่ Google API ไม่ครอบคลุมถึง เช่น Google News และ Google Catalogs เป็นต้น
  • Frame, Metasearch หรือการใช้เนื้อหาของ Google ที่ไม่มีข้อตกลงการใช้งานอย่างชัดแจ้ง

HACK#48 การ scrape Google Catalogs

Scrape และ บันทึกผลของการสืบค้น Google Catalogs ให้อยู่ในรูปของไฟล์ comma-delimited

ถึงแม้คริสต์มาสจะมีแค่ปีละครั้ง แต่แค็ตตาล็อกสำหรับการชอบปิ้งนั้นมีให้สนุกได้ตลอดปี และ สำหรับ Google Catalogs เองนั้น ก็ทำอะไรๆให้มันง่ายกว่าที่เคย

การที่คุณใช้เวลาในบ่ายวันหนึ่งของฤดูหนาว เพื่อที่จะหาผ้าคลุมไหล่ให้คุณป้าของคุณ ก็ไม่ได้หมายความว่า คุณจะค้นหาซ้ำอีกครั้งเพื่อให้ได้ผลลัพธ์เหมือนครั้งก่อนที่ได้เห็นสินค้าที่น่าสนใจได้

เพราะว่า Google API นั้นไม่สนับสนุนการสืบค้น Google Catalogs ดังนั้นการแฮกข้อนี้จึงต้องดึงผลจากการสืบค้น Google Catalogs มาจากโค้ด HTML แทน โดยการแฮกนี้จะเก็บข้อมูลต่างๆดังนี้ คือ หัวเรื่องของแค็ตตาล็อก, วันที่เรียกดู, หน้าที่เท่าใด, และลิงก์ที่เชื่อมโยงไปยังรูปภาพ โดยผลของการแฮกจะอยู่ในรูปของไฟล์ CSV ซึ่งพร้อมสำหรับการนำเข้าไปยังฐานข้อมูล หรือโปรแกรม spreadsheet .ในภายหลัง

เนื่องจาก Terms of Service ของ Google นั้น ห้ามการเข้าถึง Google โดยอัตโนมัติ เว้นแต่จะผ่านทาง Google API ดังนั้นการแฮกนี้จะไม่ได้เชื่อมต่อกับ Google โดยตรง แต่ทำงานกับหน้าเว็บที่เป็นผลของการสืบค้นจาก Google Catalogs ที่เราค้นมาเอง แล้วเซฟเก็บเอาไว้ก่อนแล้วด้วยคำสั่ง File -> Save As ของเบราเซอร์

ดังเช่นการแฮก Google News (Hack #47) คุณอาจปรับแต่งการแฮกให้ได้ผลลัพธ์ที่มีลำดับ หรือมีข้อมูลตามต้องการได้ และด้วยการเติม &num=100 ต่อท้าย URL ในการสืบค้น คุณก็จะได้ผลลัพธ์จำนวน 100 รายการ แทนที่จะได้เพียงรายการแรกรายการเดียว

โค้ดตัวอย่าง

#!/usr/bin/perl

# catalogs2csv.pl

# Google Catalogs Results exported to CSV suitable for import into Excel

# Usage: perl catalogs2csv.pl < catalogs.html > catalogs.csv

print qq{"title","link","date","page"\n};

my($results) = join '', <>;

while ( $results =~ m!<td>(.+?) <font size=-1>(.+?) - Pa

ge (\w+?) -.+?<a href="(/catalogs.+?)"><img src=.+?></a> !migs ) {

my($title, $date, $page, $url) = ($1||'',$2||'',$3||'',$4||'');

$title =~ s!"!""!g; # double escape " marks

my $output = qq{"$title","$url","$date","$page"\n};

$output =~ s! ! !g; # clean spaces

print $output;

}

การใช้งานสคริปต์

รันสคริปต์ที่ command line โดยระบุไฟล์ HTML ที่บันทึกผลของการสืบค้น Google Catalogs ไว้ และระบุชื่อไฟล์ชนิด CSV ที่คุณต้องการสร้างขึ้นมา หรือไฟล์ที่คุณต้องการเพิ่มข้อมูลเข้าไปต่อท้าย (append) ข้อมูลที่มีอยุ่เดิม เช่น ในที่นี้ให้อินพุตมาจากไฟล์ catalogs.html และ เอาต์พุตเป็น catalogs.csv

$ perl catalogs2csv.pl <> catalogs.csv

หากตัดเครื่องหมาย > และไฟล์ catalogs.csv ออก ผลลัพธ์ก็จะแสดงที่หน้าจอแทน

ผลลัพธ์ของการแฮก

ดูเหมือนว่าคุณและคุณป้าจะโชคดี เพราะมีผ้าคลุมไหล่ชั้นเยี่ยมหลายชิ้นให้เลือกใน Google Catalogs

"title","link","date","page"

"Isabella","http://catalogs.google.com/catalogs?num=100

&hl=en&amp;amp;amp;amp;lr=&ie=UTF-8&issue=13655&catpage=cover","Fall 2002","3"

"Sovietski Collection","http://catalogs.google.com/catalogs?num=100

&hl=en&amp;amp;amp;amp;lr=&ie=UTF-8&issue=9447&catpage=cover","Summer 2002","37"

"Rego","http://catalogs.google.com/catalogs?num=100&hl=en

&lr=&ie=UTF-8&issue=12484&catpage=cover","2002","21"

"Crazy Crow Trading Post","http://catalogs.google.com/catalogs?num=100

&hl=en&amp;amp;amp;amp;lr=&ie=UTF-8&issue=12346&catpage=cover","2002","39"

"Winter Silks - Sale","http://catalogs.google.com/catalogs?num=100

&hl=en&amp;amp;amp;amp;lr=&ie=UTF-8&issue=10002&catpage=cover","Summer 2002","11"

...

"Previews","http://catalogs.google.com/catalogs?num=100

&hl=en&amp;amp;amp;amp;lr=&ie=UTF-8&issue=14468&catpage=cover","Oct 2002","381"

(ในแต่ละรายการจะแสดงในบรรทัดของตัวเอง แต่ในที่นี้ในแต่ละรายการต้องมีการขึ้นบรรทัดใหม่ เพื่อความสะดวกในการตีพิมพ์)

Hacking the Hack

รูปแบบของผลลัพธ์ที่ได้ อาจปรับเปลี่ยนตามที่คุณพอใจ โดยดูรายละเอียดเพิ่มเติมได้ที่ Hack # 47

HACK#47 การ scrape Google News

การ scrape Google News นั้นก็เพื่อที่จะได้ข่าวล่าสุดจากศูนย์รวมข่าวนับพันแห่ง

เนื่องจาก Google News นั้นได้รวมรวมข้อมูลมากมายจากแหล่งรวมข่าวนับพันแห่ง (Hack #32) ดังนั้นจึงเป็นแหล่งสืบค้นสำหรับนักวิจัยได้อย่างวิเศษ อย่างไรก็ตาม คุณไม่อาจเข้าถึง Google News ผ่านทาง Google API ได้ ดังนั้นคุณจึงต้อง scrape Google News ผ่านโค้ด HTML ของหน้าเว็บที่เป็นผลลัพธ์ที่ได้จาก Google News ซึ่งในแฮกนี้ก็ทำตามนั้น แล้วรวบรวมผลให้อยู่ในรูปไฟล์ comma-delimited อันเหมาะสำหรับการถ่ายโอนไปยังไฟล์สเปรดชีตหรือฐานข้อมูล โดยในแต่ละข่าวก็จะแยกส่วนของ Title, URL, แหล่งที่มา (เช่น สำนักข่าว), วันที่ตีพิมพ์หรืออายุของข่าว และ รายละเอียดโดยสรุปออกมา

เนื่องจากข้อตกลงในการให้บริการนั้นห้ามการเข้าถึง Google อย่างอัตโนมัติโดยไม่ผ่าน Google API ดังนั้นการแฮกในหัวข้อนี้จึงไม่ได้เชื่อมต่อกับ Google โดยตรง แต่เป็นการทำงานบนหน้าเว็บของผลลัพธ์ที่คุณบันทึกมาจากการสืบค้น Google News ที่คุณเป็นคนดำเนินการเอง และบันทึกเป็นไฟล์ HTML โดยใช้คำสั่ง File -> Save As ของเว็บเบราเซอร์

ทั้งนี้ควรตรวจสอบให้ดีว่าผลลัพธ์นั้นเรียงตามวันที่ไม่ใช้เรียงตามความสัมพันธ์ เพราะถ้าผลลัพธ์เรียงตามความสัมพันธ์ข้อมูลบางส่วนจะหายไป อันเป็นผลมาจากเรื่องที่คล้ายกันจะถูกรวมไว้ด้วยกัน การเลือกเรียงข้อมูลตามวันนั้น ทำได้โดยการเลือกลิงก์ “Sort by Date” ในหน้าเว็บแสดงผลของการสืบค้น หรือโดยการเติม &scoring =d ในตอนท้ายของ URL และอย่าลืมที่จะเติม &num= 100 เพื่อที่จะได้ผลลัพธ์จำนวนมากพอ ดังตัวอย่างในภาพที่ 4–2 แสดงผลของการคิวรีหา monk detective โดยคาดการณ์ไว้ว่าจะพบข้อมูลเกี่ยวกับโชว์ชื่อดังเกี่ยวกับนักสืบอารมณ์ดีเรื่อง “Monk”

โค้ดตัวอย่าง

#!/usr/bin/perl

# news2csv.pl

# Google News Results exported to CSV suitable for import into Excel

# Usage: perl news2csv.pl < news.html > news.csv

print qq{"title","link","source","date or age", "description"\n};

my %unescape = ('<'=>'<', '>'=>'>', '&'=>'&',

'"'=>'"', ' '=>' ');

my $unescape_re = join '|' => keys %unescape;

my($results) = (join '', <>) =~ m!(.*?)!mis;

$results =~ s/($unescape_re)/$unescape{$1}/migs; # unescape HTML

$results =~ s![\n\r]! !migs; # drop spurious newlines

while ( $results =~ m!(.+?)(.+?) - (.+?)(.+?)!migs ) {

my($url, $title, $source, $date_age, $description) =

($1||'',$2||'',$3||'',$4||'', $5||'');

$title =~ s!"!""!g; # double escape " marks

$description =~ s!"!""!g;

my $output =

qq{"$title","$url","$source","$date_age","$description"\n};

$output =~ s!!!g; # drop all HTML tags

print $output;

}

การใช้งานสคริปต์

รันสคริปต์ที่ command line โดยระบุชื่อไฟล์ HTML ที่เป็นผลจากการสืบค้น Google News และชื่อไฟล์ CSV ที่คุณต้องการสร้าง หรือที่คุณต้องการเพิ่มข้อมูลเข้าไปต่อท้าย (append) ตัวอย่างเช่น การใช้ไฟล์ news.html เป็นอินพุต และไฟล์ news.csv เป็นเอาต์พุต ให้ระบุดังนี้

$ perl new2cvs.pl <> news csv

ถ้าตัดเครื่องหมาย > และไฟล์ news.csv ออก ผลของการรันสคริปต์นี้จะแสดงขึ้นมาบนหน้าจอแทน


(หน้า 127)

ผลของการแฮก

ข้างล่างนี้เป็นส่วนหนึ่งของผลการสืบค้นจำนวน 54 รายการที่ได้มาจากการสืบค้น Google News โดยใช้คำว่า monk detective และใช้ HTML อันเป็นผลของการสืบค้นจากที่แสดงไว้ในภาพที่ 4-2

"title","link","source","date or age", "description"

"ON TV : That Was Then is already gone",

"http://www.nwanews.com/adg/story_style.php?storyid=9127",

"Arkansas Democrat Gazette, AR",

"12 hours ago",

" ... The daffy detective series began life on cable<92>s USA Network,

where it does well ... USA will air the season finale,"" Mr. Monk ... "

"`Miami' and WB shows are hot; UPN is not; and `Push, Nevada' is, ... ",

"http://www.bayarea.com/mld/bayarea/entertainment/television/...",

"Piedmonter, CA",

"14 Oct 2002",

" ... Remember the note I had that ``Monk'' -- the refreshingly quirky

USA detective dramarepeated on ABC -- would air Thursdays ... "

...

"Indie Film Fest hits New Haven",

"http://www.yaledailynews.com/article.asp?AID=19740",

"Yale Daily News",

"20 Sep 2002",

" ... The Tower of Babble,"" directed by Beau Bauman '99, and

""Made-Up,"" which was directed by Tony Shalhoub DRA '80, who

also stars in the USA detective show ""Monk."". ... "

(ในแต่ละรายการจะแสดงในบรรทัดของตัวเอง แต่ในที่นี้ในแต่ละรายการต้องมีการขึ้นบรรทัดใหม่ เพื่อความสะดวกในการตีพิมพ์)

Hacking the Hack

โดยส่วนใหญ่ของโปรแกรม คุณแทบจะไม่ต้องแก้ไขอะไร เพราะว่ามันได้ถูกเขียนอย่างเป็นเหตุเป็นผลเข้ากับรูปแบบของ Google News แล้ว แต่หากว่าคุณเกิดไม่ชอบใจกับการจัดระเบียบข้อมูล ที่ได้จากผลของการสืบค้นแล้วล่ะก็ คุณอาจจะเปลี่ยนแปลงมันได้ โดยทั้งนี้อย่าได้ลืมใส่สัญลักษณ์คอมมาระหว่างแต่ละหัวข้อด้วย เช่น

my $output =

qq{"$title","$url","$source","$date_age","$description"\n};

แต่คุณต้องการเพียงแค่ URL และ title เท่านั้น อย่างอื่นไม่ต้องการ ก็ควรจะเขียนโค้ดดังนี้

my $output =

qq{"$url","$title"\n};

โดย \n นั้นหมายถึง บรรทัดใหม่ และเครื่องหมาย $ นั้นบอกว่า $url และ $title คือ ชื่อของตัวแปร โดยให้แสดงไว้ด้วยกัน

และแน่นอนว่า เอาต์พุตที่คุณได้ตอนนี้จะไม่เข้ากันกับหัวข้อที่อยู่ด้านบนของไฟล์ CVS เพราะว่าโดย default จะเป็น

print qq{"title","link","source","date or age", "description"\n};

ดังนั้น จากตอนต้นก็ให้เปลี่ยนโค้ดให้เข้ากัน ดังนี้

Print qq { “$url” , “$title”\ n };

HACK#44 การ scrape ผลลัพธ์การสืบค้นของ Google

ทำให้ผลลัพธ์ของ Google อยู่ในรูปของไฟล์ comma-delimited

ในเมื่อคุณสามารถใช้ Google API ในการหาผลลัพธ์การสืบค้น และเก็บไว้ในรูปใดก็ได้ตามใจชอบ แล้วเหตุใดคุณจึงคิดที่จะทำงานทีละขั้นโดยการสืบค้นด้วย Google บันทึกผลลัพธ์แล้ว scrape ด้วยโปรแกรม Perl อยู่อีก แต่เรื่องของเรื่องก็คือคุณอาจจะทำไม่ได้ หรือไม่อยากจะทำอะไรอย่างที่ Google API ทำได้ เพราะคุณอาจเพียงแค่อยากได้ผลการสืบค้น แล้วก็วางลงในไฟล์ spreadsheet แล้วก็ทำอย่างอื่นต่อไป

นั่นคือสิ่งที่เราทำใน Hack #49 โดยที่คุณสามารถบันทึกผลของการสืบค้นลงในไฟล์ แล้วก็ผ่านกระบวนการทำให้อยู่ในรูปไฟล์ text และ comma-delimited ด้วยสคริปต์ภาษา Perl แบบง่ายๆ

Tip: อย่าลืมที่จะตั้งค่า preferences (Hack #1) ให้แสดงผลลัพธ์ได้ 100 รายการต่อหน้า เพื่อที่จะได้ประโยชน์สูงสุดจากแฮกในหัวข้อนี้

โค้ดตัวอย่าง


#!/usr/bin/perl
# google2csv.pl # Google Web Search Results exported to CSV suitable
# for import into Excel
# Usage: perl google2csv.pl < results.html > results.csv

print qq{"title","url","size","domain suffix"\n};

my($results) = (join '', <>) =~
m!<div>(.*?)</div>!mis;

while ( $results =~
m!<p><a href="?(.+?)"?>(.+?)</a>.+?\s+-\s+(\d+k)?!mgis
) {
my($url,$title, $size) = ($1||'',$2||'',$3||'');
my($suffix) = $url =~ m!\.(\w+)/!;
$title =~ s!"!""!g; # double escape " marks
$title =~ s!<.+?>!!g; # drop all HTML tags print
qq{"$title","$url","$size","$suffix"\n};
}


การใช้งานสคริปต์

รันสคริปต์ที่ command line โดยระบุชื่อไฟล์ HTML และชื่อไฟล์ CSV ที่ต้องการสร้าง หรือไฟล์ที่คุณต้องการเพิ่มผลลัพธ์เข้าไปต่อท้าย (append) ตัวอย่างเช่น การใช้ไฟล์ results.html เป็นอินพุต และ results.csv เป็นเอาท์พุต ให้ทำดังนี้

$ perl google2csv.pl <> results.csv

แต่ถ้าหากคุณไม่ระบุ > และ results.csv แล้ว ผลลัพธ์จะแสดงที่หน้าจอแทน

$ perl google2csv.pl <>

ผลลัพธ์

ข้างล่างเป็นผลของการใช้งานสคริปต์ โดยเป็นผลลัพธ์จากการสืบค้นว่า “Mac OS X”

$ perl google2csv.pl <>

"title","url","size","domain suffix"

"Apple - Mac OS X","http://www.apple.com/macosx/","","com"

"Apple - Software - Mac OS X Server","http://www.apple.com/server/",

"29k","com"

"Mac OS X Development","http://developer.apple.com/macosx/","28k","com"

"Mac OS X Hints - Get the most from X!","http://www.macosxhints.com/",

"","com"

"Mac OS X Apps - The Source For Mac OS X Software",

"http://www.macosxapps.com/","39k","com"

"VersionTracker.com - free Macintosh software downloads for Mac

OS ... ","http://www.versiontracker.com/macosx/","101k","com"

"O'Reilly Mac OS X Conference",

"http://conferences.oreillynet.com/macosx2002/","25k","com"

"MacNN | OS X","http://osx.macnn.com/","94k","com"

"???? - Mac OS X","http://www.apple.co.jp/macosx/","43k","jp"

"Apple - Support - Mac OS X",

"http://www.info.apple.com/usen/macosx/","36k","com"

คุณจะเห็นว่าโปรแกรมเก็บข้อมูลสี่อย่างลงในไฟล์ CSV อันได้แก่ Title, URL, Size (ถ้ามี) และ ชนิดของโดเมน แต่ส่วนของ snippet (ข้อความที่อธิบายเนื้อหาคร่าวๆของหน้าเว็บเพจ) ซึ่งปกติจะแสดงรวมอยู่ด้วยในผลของการสืบค้นของ Google นั้นถูกตัดออกไป เพราะว่ามันยากที่จะอ่านได้เมื่ออยู่ใน spreadsheet

คุณอาจสงสัยนิดหน่อยว่า ทำไมจึงต้องรวมขนาดของเว็บเพจและประเภทของโดเมนเข้ามาด้วย เหตุผลก็คือ เพื่อการศึกษาวิจัย เป็นต้นว่า คุณต้องการผลลัพธ์ที่คุณจะอ้างอิงได้ภายหลังนั้น มันง่ายที่จะจำแนกเป็นกลุ่มตามประเภทของโดเมน เพราะว่า ผลลัพธ์ที่ได้จากโดเมนประเภท .edu นั้นก็มักจะต่างจากประเภท .org และก็มักจะต่างจากประเภท .com นั่นเอง ไม่ต้องพูดถึงข้อแตกต่างจากผลลัพธ์ที่แยกกลุ่มตามประเทศ เช่น .uk กับ .jp เป็นต้น และถ้าหากว่าคุณต้องการสร้างลิงก์เพื่อการเข้าถึงในภายหลัง ก็จะสะดวกกว่าหากสามารถแยกกลุ่มที่ไม่ใช่เพื่อการพาณิชย์ เช่น .edu หรือ .org ออกมาไว้ต่างหาก

HACK#46 การดึงผลลัพธ์ของ Google Groups ไปใช้

ดึงผลลัพธ์ของการสืบค้น Google Groups ให้อยู่ในรูปของไฟล์ comma-delimited

มันไม่ยากเย็นอะไรนักที่จะพูดถึงอินเทอร์เน็ต แล้วบอกว่านี่คือเว็บเพจ นั่นคือคอมพิวเตอร์ หรือโน่นคือระบบเครือข่าย แต่ถ้าหากมองลึกเข้าไปกว่านั้น ก็จะเห็นหัวใจหลักของอินเทอร์เน็ตคือส่วนของการแลกเปลี่ยนความคิดเห็น (discussion) ทั้งหมดนั่นเอง เป็นต้นว่า กลุ่มเมล์ (mailing list), กลุ่มสนทนาออนไลน์ (online forum), และแม้กระทั่งเว็บไซต์อันเป็นที่ๆใครๆทำออกมาในรูปของไฟล์ HTML แล้วเฝ้ารอให้ผู้คนแวะเวียนเข้ามาแลกเปลี่ยนแนวคิดแล้วจึงเริ่มติดต่อกัน หรือซื้อสินค้าและบริการต่อกัน

ไม่มีที่ใดที่แนวคิดผ่านการสนทนาทางอินเทอร์เน็ต จะแสดงออกได้ชัดเจนมากไปกว่า Usenet newgroups ต่างๆ ทั้งนี้ที่ Google Groups เองนั้นได้เก็บข้อความกว่า 700 ล้านข้อความจากผู้ที่ใช้งาน Usenet จำนวนมากเป็นเวลาหลายปี ถ้าหากว่าคุณสืบค้นโดยให้ความสำคัญกับวันเวลาที่เกิดเหตุการณ์กับเรื่องที่จะค้นหาแล้วล่ะก็ การสืบค้นด้วย Google Groups จะช่วยได้มากเลยทีเดียว

เนื่องจาก Google Groups ไม่อาจสืบค้นได้ด้วย Google API เวอร์ชันปัจจุบัน และคุณก็ไม่อาจสร้างเครื่องมือค้นหา (query tool) ใน Google Groups อย่างอัตโนมัติโดยไม่ผิดกฎของการให้บริการหรือ Terms of Service ของ Google ได้แต่อย่างใด อย่างไรก็ตาม คุณก็สามารถ scrape ได้จากส่วนของ HTML ของหน้าที่คุณเข้าเยี่ยมชมและได้เซฟเก็บไว้ในเครื่องของคุณแล้วได้

หน้าที่บันทึกไว้

สิ่งแรกที่คุณต้องทำคือ การสืบค้นใน Google Groups โดยเนื้อหาใน Hack #30 จะมีเคล็ดลับในการสืบค้นแหล่งเก็บข้อมูลอธิบายไว้อยู่

วิธีที่แนะนำคือ ให้เรียงหน้าที่คุณจะ scrape ตามลำดับวันที่ ด้วยวิธีนี้ หากว่าคุณอยากจะ scrape เป็นจำนวนหน้าที่มากกว่านี้ คุณก็สามารถมองเห็นและตรวจเช็คได้ง่ายว่า เมื่อใดที่ผลของการสืบค้นเปลี่ยนแปลง เป็นต้นว่า ถ้าหากว่าคุณพยายามที่จะติดตามการใช้ Perl ในการสร้างโปรแกรม Google API คำสั่งเพื่อการคิวรีอาจเป็นดังนี้

perl group:google.public.web-apis

ในด้านขวาสุดของผลลัพธ์จากการสืบค้น จะเป็นตัวเลือกในการเรียงไม่ว่าจะเป็นโดยความสัมพันธ์ของข้อมูลหรือโดยวันที่ ซึ่งหากเรียงโดยวันที่ ผลลัพธ์ของคุณควรจะดูเหมือน ภาพที่ 4-1

บันทึกหน้าเว็บดังกล่าวไว้ในเครื่องของคุณ และตั้งชื่อให้จำได้ง่ายๆ เป็นต้นว่า groups.html

ข้อควรระวังในการ Scrape

มีหลายสิ่งเหมือนกันที่จะต้องระลึกไว้ เมื่อต้อง scrape หน้าเว็บใดๆไม่ว่าจะเป็น Google หรือไม่ก็ตาม

การ scrape นั้นเปราะบางยิ่ง เนื่องจากตัว scraper นั้นต้องอิงอยู่กับรูปแบบของหน้าเว็บในขณะนั้น ๆ ฉะนั้นถ้ามีอะไรก็ตาม แม้เพียงเล็กน้อยเปลี่ยนแปลงไป อาจส่งผลให้สิ่งอื่นพังตามไปด้วยหมด

การ scrape หน้าเว็บใดๆนั้นทำได้มากมายหลายวิธี นี่เพียงเป็นวิธีหนึ่งเท่านั้น ฉะนั้นควรลองวิธีอื่นๆดูด้วย

โค้ดตัวอย่าง

# groups2csv.pl
# Google Groups results exported to CSV suitable for import into Excel
# Usage: perl groups2csv.pl < groups.html > groups.csv

# The CSV Header
print qq{"title","url","group","date","author","number of articles"\n};

# The base URL for Google Groups
my $url = "http://groups.google.com";

# Rake in those results
my($results) = (join '', <>);

# Perform a regular expression match to glean individual results
while ( $results =~ m!<p><a href="?(.+?)"?>(.+?)</a><font size=-1(.+?)<br>
<font color=green><a href=.+?>(.+?)</a>\s+-\s+(.+?)\s+by\s+(.+?)\s+-.+?\((\d+) articles!mgis ) {
my($path, $title, $snippet, $group, $date, $author, $articles) =
($1||'',$2||'',$3||'',$4||'',$5||'',$6||'',$7||'');
$title =~ s!"!""!g; # double escape " marks
$title =~ s!<.+?>!!g; # drop all HTML tags
print qq{"$title","$url$path","$group","$date","$author","$articles"\n};
}

การใช้งานแฮก

เรียกสคริปต์ที่ command line โดยระบุชื่อไฟล์ที่บันทึกหน้าเว็บที่แสดงผลการสืบค้นของ Google Groups ไว้ และชื่อไฟล์ CSV ที่ต้องการเก็บข้อมูลที่ได้ หรือไฟล์ที่ต้องการนำข้อมูลที่ได้ไปต่อท้าย (append) ตัวอย่างเช่น หากใช้ groups.html เป็นอินพุต และ groups.cvs เป็นเอาต์พุต คำสั่งก็จะเป็น

$ perl groups2csv.pl <> groups.csv

แต่ถ้าหากคุณตัด > และ groups.csv ออกแล้ว ผลลัพธ์ที่ได้ก็จะแสดงที่หน้าจอแทน

และถ้าหากใช้ >> สองตัว ก่อนหน้าชื่อไฟล์ CVS จะเป็นการเพิ่มผลลัพธ์ปัจจุบันเข้าไปต่อท้ายข้อมูลที่มีอยู่แล้วในไฟล์ดังกล่าว หรือหากยังไม่มีการสร้างไฟล์ดังกล่าว ก็เป็นการสร้างไฟล์นั้นขึ้นมาใหม่โดยอัตโนมัติ ซึ่งวิธีนี้จะมีประโยชน์ในการรวมผลลัพธ์จากมากกว่าหนึ่งแห่งเข้าด้วยกัน เช่น

$ perl groups2csv.pl <> results.csv

$ perl groups2csv.pl <>> results.csv

ผลลัพธ์จากการแฮก

ผลของการ scrape ผลลัพธ์ของการสืบค้นด้วยคำว่า perl จาก group:google.public.web-apis ทำให้ได้ผลเป็นเรื่องต่างๆที่เป็นการสนทนาถึงภาษา Perl ในฟอรัม Google API

$ perl groups2csv.pl <> groups.csv

"title","url","group","date","author","number of articles"

"Re: Perl Problem?",

"http://groups.google.com/groups?q=perl+group:google.public.

web-apis&hl=en&amp;amp;amp;lr=&ie=UTF-8&output=search&selm=5533bb12.0208230215.

365a093d%40po sting.google.com&rnum=1",

"google.public.web-apis","Aug. 23, 2002","S Anand","2"

"Proxy usage from Perl script",

"http://groups.google.com/groups?q=perl+group:goo

gle.public.web-apis&hl=en&amp;amp;amp;lr=&ie=UTF-8&output=search&selm=575db61f.

0206290446.1d fe4ea7%40posting.google.com&rnum=2",

"google.public.web-apis","Jun. 29, 2002","Varun","3"

...

"The Google Velocity",

"http://groups.google.com/groups?q=perl+group:google.public.web-apis&hl

=en&lr=&ie=UTF-8&output=search&selm=18a1ac72.0204221336.47fdee71%

40posting.google.com&rnum=29",

"google.public.web-apis","Apr. 22, 2002","John Graham-Cumming","2"

HACK#45 การ Scrape Google AdWords

การ Scrape ส่วน AdWords จากผลลัพธ์การสืบค้นของ Google ที่บันทึกไว้แล้ว ให้อยู่ในรูปที่เหมาะในการนำเข้าสู่ไฟล์ spreadsheet หรือฐานข้อมูลต่อไป

Google AdWord นั้นเป็นเครื่องหมายการค้าของ Google ที่หมายถึง ข้อความโฆษณาที่แสดงไว้ที่ด้านขวาของผลการสืบค้นปกติ ซึ่งโฆษณาดังกล่าวนำเสนอบนพื้นฐานของการคิดราคาต่อจำนวนคลิก (cost-per-click) โดย Google ให้ผู้ที่ลงโฆษณาเป็นผู้ตั้งเพดานของเงินที่ต้องการใช้ในการโฆษณาเอง ด้วยระบบนี้ทำให้แต่ละครั้งที่คุณทำการสืบค้น แม้จะด้วยคำสืบค้นเดิมๆ ก็ไม่จำเป็นที่คุณจะเห็นโฆษณาชิ้นเดิมซ้ำอีก

ถ้าหากว่าคุณสนใจที่จะลงโฆษณาชนิด AdWords คุณอาจจะต้องการรวบรวม และเก็บโฆษณาที่แสดงออกมาเมื่อคุณสืบค้นด้วยคำที่คุณสนใจเอาไว้ ซึ่ง Google AdWords นั้น ไม่ได้รับการสนับสนุนจาก Google API ดังนั้นคุณจะ scrape ผลลัพธ์ของการสืบค้นอย่างอัตโนมัติไม่ได้ และก็แน่นอนที่คุณจะ scrape อย่างอัตโนมัติโดยไม่ใช้ Google API ไม่ได้เช่นกัน เพราะว่าขัดต่อ Terms of Service ของ Google

การแฮกในหัวข้อนี้จะช่วยให้คุณ scrape ส่วนของ AdWords จากผลลัพธ์การสืบค้นที่คุณบันทึกเอาไว้ก่อนแล้ว จากนั้นก็ส่งออกไปยังไฟล์ CSV (comma-separated value) ซึ่งจากนั้นคุณค่อยนำเข้าสู่ไฟล์ Excel หรือ spreadsheet อื่นๆตามใจชอบ

Tip: การแฮกนี้ต้องการโมดูลHTML:: TokeParser (http://search.cpan.org/search?query=htmL%3A%3Atokeparserxmode=all) ของ Perl ร่วมด้วย คุณจำเป็นตต้องติดตั้งโมดูลดังกล่าวก่อนที่จะใช้งานแฮกนี้

โค้ดตัวอย่าง

#!/usr/bin/perl

# usage: perl adwords.pl results.html

use strict;

use HTML::TokeParser;

die "I need at least one file: $!\n"

unless @ARGV;

my @Ads;

for my $file (@ARGV){

# skip if the file doesn't exist

# you could add more file testing here.

# errors go to STDERR so they won't

# pollute our csv file

unless (-e $file) {

warn "What??: $file -- $! \n-- skipping --\n";

next;

}

# now parse the file

my $p = HTML::TokeParser->new($file);

# $p is a kind of iterator and everything

# in the given file is a token. We are going to

# iterate through them all but we might throw them away

# if they aren't what we are looking for.

# run this: perldoc HTML::TokeParser

while(my $token = $p->get_token) {

# look for a start token whose name is 'td'

# and has an attribute named 'id' and that

# attribute's value is 'taw' followed by one

# or more digits.

next unless $token->[0] eq 'S'

and $token->[1] eq 'td'

and $token->[2]{id} =~ /taw\d+/;

# $ad is a hash ref that will hold our

# data for this ad.

my $ad;

# if we are here we found the td tag. It also has

# the url we want

# we strip off the 'go to' stuff

($ad->{url}) = $token->[2]{onmouseover} =~ /go to ([^']+)'/;

# now go directly to the next anchor tag

my $link = $p->get_tag('a');

# grab the href attribute and clean it up

$ad->{href} = $link->[1]{href};

$ad->{href} =~ s|/url\?q=||;

# the adwords are the text upto the closing tag

$ad->{adwords} = $p->get_trimmed_text('/a');

# Now look at every token looking for text.

# Unless the text matches 'Interest:' it is

# description text so we add it to the description.

# If it is the 'Interest:' token then

# we want to move to the next img token

# and grab the 'width' attribute's value

while( my $token = $p->get_token ) {

# this will skip all the
and tags

next unless $token->[0] eq 'T';

unless($token->[1] =~ /Interest:/) {

$ad->{desc} .= ' ' . $token->[1];

next;

}

my $img = $p->get_tag('img');

$ad->{interest} = $img->[1]{width};

last; # we are done

}

# the url is also in this description but

# we don't need it. We already found it.

$ad->{desc} =~ s/$ad->{url}.*//;

# change two or more whitespace characters into one space.

$ad->{desc} =~ s/\s{2,}/ /g;

# there is nothing else to look for so

# we add this ad to our list of ads.

push(@Ads,$ad);

}

}

print quoted( qw( AdWords HREF Description URL Interest ) );

for my $ad (@Ads) {

print quoted( @$ad{qw( adwords href desc url interest )} );

}

# we want a csv (comma separated values)

# so excel will open it without asking

# any questions. So we have to print quote marks

sub quoted {

return join( ",", map { "'$_'" } @_ )."\n";

}

กลไกการทำงาน

เรียกสคริปต์ที่ command line โดยระบุชื่อไฟล์ที่บันทึกหน้าเว็บที่แสดงผลการสืบค้นของ Google ไว้ และชื่อไฟล์ CSV ที่ต้องการเก็บ ดังนี้

% perl adword input.html > output.csv

input.html นั้นเป็นไฟล์ที่เก็บผลการสืบค้นไว้ และ output.csv เป็นไฟล์ประเภท comma-delimited ซึ่งคุณต้องการบันทึกผลจากการแฮกครั้งนี้เอาไว้ ทั้งนี้คุณสามารถใช้ไฟล์นำเข้าได้หลายไฟล์ได้ด้วย โดยเรียงต่อๆกันไปตามหลังคำสั่งบน command line ดังตัวอย่าง

% perl adword input.html input2.html > output.csv

ผลของการแฮก

ผลลัพธ์ที่ได้จะอยู่ในรูปของไฟล์ comma-delimited ดังนี้

"AdWords","HREF","Description","URL","Interest"

"Free Blogging Site","http://www.1sound.com/ix",

" The ultimate blog spot Start your journal now ","www.1sound.com/ix","40"

"New Webaga Blog","http://www.webaga.com/blog.php",

" Fully customizable. Fairly inexpensive. ","www.webaga.com","24"

"Blog this","http://edebates.e-thepeople.org/a-national/article/10245/view&",

" Will online diarists rule the Net strewn with failed dotcoms? ",

"e-thePeople.org","26"

"Ford - Ford Cars","http://quickquote.forddirect.com/FordDirect.jsp",

" Build a Ford online here and get a price quote from your local dealer! ",

"www.forddirect.com","40"

"See Ford Dealer's Invoice","http://buyingadvice.com/search/",

" Save $1,400 in hidden dealership profits on your next new car. ",

"buyingadvice.com","28"

"New Ford Dealer Prices","http://www.pricequotes.com/",

" Compare Low Price Quotes on a New Ford from Local Dealers and Save! ",

"www.pricequotes.com","25"

(ในแต่ละรายการจะแสดงในบรรทัดของตัวเอง แต่ในที่นี้ในแต่ละรายการต้องมีการขึ้นบรรทัดใหม่ เพื่อความสะดวกในการตีพิมพ์)

คุณจะเห็นว่าผลของการแฮกจะแสดงผลในรูปของสิ่งต่างๆเหล่านี้ได้แก่ headline ของ AdWords, ลิงก์ที่จะนำไปยังเว็บเพจที่โฆษณา, รายละเอียด (description) ของโฆษณา, URL ของตัวโฆษณาเอง และสุดท้ายคือ “Interest Bar” ซึ่งเป็นค่าของความน่าสนใจที่แสดงไว้บนโฆษณานั้นๆ ซึ่งค่าความน่าสนใจนี้จะสัมพันธ์กับจำนวนครั้งของการถูกคลิกเข้าไปดู บอกได้ว่าโฆษณานั้นเป็นที่สนใจมากเท่าใด

Hacking the Hack

คุณอาจจะไม่ถูกใจกับแฮกที่เสนอข้างต้น โดยอาจจะเห็นว่ามีการนำเสนอข้อมูลมากเกินไป ขณะที่คุณอาจจะต้องการข้อมูลที่กระชับกว่านี้ หรือต้องการให้เรียงลำดับข้อมูลต่างออกไปก็ได้

ถ้าเป็นเช่นที่ว่า โค้ดที่ต้องมีการเปลี่ยนแปลงนั้นมีอยู่บางส่วน คือ

my @headers = qw( AdWords HREF Description URL Interest );

print '"',join('","',@headers),'"',"\n";

for my $ad (@Ads) {

print '"', join('","',

$ad->{adwords},

$ad->{href},

$ad->{desc},

$ad->{url},

$ad->{interest}),'"',"\n";

โดยอันดับแรกคุณต้องเปลี่ยนส่วนด้านล่าง เริ่มที่ print “”, join ซึ่งอย่างที่คุณเห็น แต่ละบรรทัดจะสัมพันธ์สอดรับกับส่วนของข้อมูลที่จะเขียนออกมาสู่ไฟล์ comma-delimited คุณเริ่มได้ง่ายๆ ด้วยการเรียงลำดับข้อมูลตามใจชอบ หรือจะตัดบางหัวข้อออกไปก็ได้

เป็นต้นว่า คุณอาจจะต้องการให้มี title ของ AdWords, URL, และรายละเอียด (description) ตามลำดับ โค้ดที่แก้แล้วก็จะเป็นดังนี้

print '"',join('","',@headers),'"',"\n";

for my $ad (@Ads) {

print '"', join('","',

$ad->{adwords},

$ad->{url},

$ad->{desc}),'"',"\n";

หลังจากที่คุณได้เปลี่ยนส่วนข้างต้นแล้ว ต่อไปคือส่วนของ “header line” ซึ่งจะคอยบอกไฟล์ Excel ว่าแต่ละฟิลด์นั้นเป็นอะไร ส่วนนี้จะอยู่ด้านบนของโค้ด คือ

My @headers = qw( AdWords HREF Description URL Interest);

จากนั้นคุณก็ต้องเปลี่ยนคำที่อยู่ในวงเล็บ ให้สัมพันธ์กับข้อมูลที่จะแสดงในไฟล์ CSV ซึ่งอย่างในกรณีข้างต้นที่ผู้เขียนต้องการเก็บแค่ข้อมูล title ของ AdWords, URL ของมัน และ description ของโฆษณาเท่านั้น ดังนั้นบรรทัดที่แก้ไขแล้วจะเป็นดังนี้

My @headers = qw( AdWords URL Description);

ดูเพิ่มเติม

ที่ Hack #99 การใช้ประโยชน์สูงสุดจาก AdWords

HACK#43 สร้าง URL สำหรับ Google Directory

การแฮกให้หัวข้อนี้ใช้ข้อมูลจาก Open Directory Project (Dmoz) เพื่อสร้าง Google Directory

Google Directory (http://directory.google.com/) ตั้งอยู่บนพื้นฐานของ Open Directory Project (หรือ ODP หรือ DMOZ, http://www.dmoz.org/) อันเป็นดัชนีหลักของ Google ซึ่งผลที่ได้ก็คือ การแสดงผลการสืบค้นที่เป็นไดเรกทอรีแบบลำดับชั้น (hierarchy) ที่เหมือนกับ Yahoo! พร้อมกับเติมความความสามารถเพิ่มเข้าไปด้วยอัลกอริทึมในแบบของ Google เอง

ODP นั้นเปิดฐานข้อมูลการทำรายการทั้งหมดให้แก่สาธารณะ โดยหากคุณอยากจะมีเป็นของตัวเอง ก็ต้องทำใจที่จะดาวน์โหลดข้อมูลจำนวน 205 เมกะไบท์ (นี่ผ่านการบีบอัดแล้วนะ) ซึ่งคุณคงไม่สนใจในรายละเอียดของทุกรายการที่แสดงไว้ทั้งหมดเป็นแน่ แต่อาจจะสนใจกลุ่มกลุ่มใดกลุ่มหนึ่ง หรือคุณอาจจะต้องการเฝ้าดูรายการใหม่ๆที่เพิ่มเข้าไปในบางกลุ่มก็เป็นได้

โชคไม่ดีสักเท่าไหร่ที่ ODP ไม่สนับสนุนการสืบค้นด้วยคีย์เวิร์ดที่ไซต์ต่างๆเพิ่มเข้าไป (แต่ที่ Yahoo! สนับสนุน) ดังนั้นแทนที่มองหาจะเว็บไซต์ที่ถูกเพิ่มเข้ามาใหม่ๆ วิธีที่ดีที่สุดก็คือที่จะได้ข้อมูลของเว็บไซต์ใหม่ๆจาก ODP ก็คือดูจาก category ต่างๆแทน

เนื่องจาก Google Directory นั้นสร้างไดเรกทอรีของตัวเองโดยมีฐานอยู่บน ODP ฉะนั้นคุณอาจใช้การจัดกลุ่มแบบลำดับชั้นของ ODP ในการสร้าง URL เพื่อบันทึกลงใน Google Directory ได้ โดยการแฮกนี้จะสำรวจกลุ่มแบบ category ของ ODP ด้วยคีย์เวิร์ดที่คุณระบุ จากนั้นก็จะสร้าง URL เพื่อบันทึกลงใน Google Directory และตรวจสอบว่าใช้งานได้จริง

คุณจะต้องดาวน์โหลดข้อมูล category จาก ODP เพื่อทำให้การแฮกในหัวข้อนี้ทำงาน โดยไฟล์ที่มีข้อมูลข้างต้นนั้นอยู่ในรูปที่ถูกบีบอัดอยู่ที่ http://dmoz.org/rdf.html โดยไฟล์ที่ต้องการนั้นอยู่ที่ http://dmoz.org/rdf/structure.rdf.u8.gz ก่อนที่จะใช้ให้ uncompress ไฟล์ดังกล่าวก่อนด้วยโปรแกรม decompress ที่มีอยู่ ซึ่งในระบบ Unix จะมีลักษณะดังนี้

% gunzip structure.rdf.u8.gz

แต่คุณต้องรู้ด้วยว่าข้อมูลโครงสร้าง category นั้นมีขนาดมากกว่า 35 เมกะไบต์ ถ้าหากคุณเพียงแค่อยากทดลองกับโครงสร้างของข้อมูลดังกล่าว ก็มีที่สรุปย่อไว้ให้แล้วที่ http://dmoz.org/rdf/structure.example.txt ซึ่งเป็นข้อมูลในรูป text ธรรมดา ไม่ต้องมีการ uncompress แต่อย่างใด

โค้ดตัวอย่าง

#!/usr/bin/perl

# google_dir.pl

# Uses ODP category information to build URLs into the Google Directory.

# Usage: perl google_dir.pl "keywords" <>

use strict;

use LWP::Simple;

# Turn off output buffering

$|++;

my $directory_url = "http://directory.google.com";

$ARGV

or die qq{usage: perl google_dir.pl "{query}" <>

# Grab those command-line specified keywords and build a regular expression

my $keywords = shift @ARGV;

$keywords =~ s!\s+!\|!g;

# A place to store topics

my %topics;

# Loop through the DMOZ category file, printing matching results

while (<>) {

/"(Top\/.*$keywords.*)"/i and !$topics{$1}++

and print "$directory_url/$1\n";

}

การใช้งานแฮก

รันสคริปต์จาก command line ตามด้วยคำถามและไฟล์ดังตัวอย่างข้างล่างนี้

% perl googledir.pl “keywords” <>

ถ้าหากว่าคุณใช้กลุ่ม structure.example.txt ก็ให้ใช้

% perl googledir.pl “keywords” <>

ผลลัพธ์

หากว่าคุณใช้คำ mosaic เป็นคีย์เวิร์ดในการสืบค้น ผลที่ได้จะเป็นดังนี้

% perl googledir.pl "mosaic" <>

http://directory.google.com/Top/Arts/Crafts/Mosaics

http://directory.google.com/Top/Arts/Crafts/Mosaics/Glass

http://directory.google.com/Top/Arts/Crafts/Mosaics/Ceramic_and_Broken_China

http://directory.google.com/Top/Arts/Crafts/Mosaics/Associations_and_Directories

http://directory.google.com/Top/Arts/Crafts/Mosaics/Stone

http://directory.google.com/Top/Shopping/Crafts/Mosaics

http://directory.google.com/Top/Shopping/Crafts/Supplies/Mosaics

Hacking the Hack

การแฮกในหัวข้อนี้อาจะไม่ค่อยมีอะไรให้แฮกเท่าไร เพราะว่าได้ถูกออกแบบให้รับข้อมูลจาก ODP สร้าง Google URL และตรวจสอบ URL เหล่านั้นเท่านั้น ซึ่งจะใช้งานได้ดีหรือไม่ก็ขึ้นอยู่กับคีย์เวิร์ดที่ใช้ในการสืบค้น

การเลือกคีย์เวิร์ดควรจะเลือกคำที่ใช้กันแพร่หลายทั่วไป เป็นต้นว่า หากคุณสนใจรัฐใดรัฐหนึ่งในอเมริกา ก็ควรที่จะเลือกใช้ชื่อของรัฐและเมืองหลักเป็นคีย์เวิร์ด ไม่ควรเลือกใช้ชื่อเมืองเล็กๆหรือใช้ชื่อผู้ว่าการรัฐ และในทำนองเดียวกัน กรณีต้องการหาข้อมูลของบริษัทบางแห่งก็ให้เลือกใช้ชื่อของบริษัทแทนที่จะใช้ชื่อของผู้บริหาร โดยหลักแล้วก็คือให้เลือกใช้คีย์เวิร์ดที่คุณจะหาพบใน Encyclopedia ให้ยึดหลักเอาง่ายๆว่าใน Encyclopedia นั้นการจะพบชื่อบริษัทนั้นง่ายกว่าการที่จะพบชื่อผู้บริหารมาก