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!
(.+?)
(.+?)\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;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;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"

โพสต์ยอดนิยมจากบล็อกนี้

I miss you all กับ I miss all of you ต่างกันอย่างไร

ปัญหาและเฉลยวิชาธรรม นักธรรมชั้นตรี สอบในสนามหลวง วันอังคาร ที่ ๒๙ กันยายน พ.ศ.๒๕๕๒

ปัญหาและเฉลยวิชาอนุพุทธประวัติ นักธรรมชั้นโท สอบในสนามหลวง วันอาทิตย์ ที่ ๒๐ พฤศจิกายน พ.ศ. ๒๕๔๘