HACK#49 การ scrape Google Phonebook

สร้างไฟล์ชนิด comma-delimited จากรายการหมายเลขโทรศัพท์ที่คืนผลมาจากการสืบค้นด้วย Google Phonebook
การที่ Google API ไม่สนับสนุนการใช้งาน Google Phonebook (Hack # 17) ก็ไม่ได้หมายความว่าเราจะใช้งานข้อมูลดังกล่าวไม่ได้
สคริปต์ภาษา Perl ง่ายๆ นี้จะดึงผลลัพธ์จากหน้า Google Phonebook และสร้างไฟล์ในรูปของ comma-delimited ซึ่งเหมาะสำหรับการดึงเข้าไปใช้ใน Excel หรือในฐานข้อมูลทั่วๆไป โดยสคริปต์นี้ไม่ได้ใช้ Google API เพราะตัว API นั้น ไม่สนับสนุนการสืบค้นหมายเลขโทรศัพท์ แต่คุณจะต้องสืบค้นเอาเองผ่านเบราเซอร์ และเก็บข้อมูลเข้าไว้ในฮาร์ดไดรฟ์ในรูปของไฟล์ HTML โดยเพียงแต่ชี้สคริปต์ที่ไฟล์ HTML ตัวสคริปต์ก็จะทำงานได้แล้ว ทีนี้ผลลัพธ์ของการสืบค้นตัวไหนล่ะ ที่คุณควรจะบันทึกไว้? คุณมีทางเลือกอยู่สองทางขึ้นกับลักษณะทางภาษาที่คุณเลือกใช้
  • ถ้า หากว่าคุณใช้ตามแบบซินแท็กซ์ phonebook: ให้เก็บหน้าที่สองของผลลัพธ์ โดยคลิกที่ลิงก์ “More business listing …” หรือ “More residential listing…” ที่อยู่บนผลลัพธ์หน้าแรก
  • ถ้าหากว่าคุณใช้ตามแบบซินแท็กซ์ bphonebook: หรือ rphonebook: ก็เก็บบันทึกที่หน้าแรกของผลลัพธ์ได้เลย ที่นี้ขึ้นกับว่าผลลัพธ์นั้นมีกี่หน้า คุณก็อาจต้องเรียกใช้โปรแกรมจำนวนเท่านั้นครั้ง
เนื่อง จากโปรแกรมนี้เป็นโปรแกรมง่ายๆ คุณอาจจะอดใจไม่ไหวที่จะเอาโค้ดนี้ไปใช้กับโปรแกรมที่ดึงผลลัพธ์การสืบค้น จาก Google โดยอัตโนมัติทั้งกระบวนการ แต่คุณก็ควรจะรู้แล้วว่าการเข้าถึง Google โดยอัตโนมัติโดยไม่ผ่าน Google API นั้นขัดต่อ Terms of Service ของ Google
โค้ดตัวอย่าง
#!/usr/bin/perl
# phonebook2csv
# Google Phonebook results in CSV suitable for import into Excel
# Usage: perl phonebook2csv.pl < results.html > results.csv
# CSV header
print qq{"name","phone number","address"\n};
my @listings = split /
/, join '', <>;
foreach (@listings[1..($#listings-1)]) {
s!\n!!g; # drop spurious newlines
s!<.+?>!!g; # drop all HTML tags
s!"!""!g; # double escape " marks
print '"' . join('","', (split /\s+-\s+/)[0..2]) . "\"\n";
}
การใช้งานโปรแกรม
ให้ รันสคริปต์ที่ command line โดยระบุไฟล์ HTML ที่เป็นผลลัพธ์ของการสืบค้นสมุดโทรศัพท์ และระบุชื่อไฟล์ CSV ที่คุณต้องการสร้าง หรือต้องการใส่ข้อมูลเข้าไปต่อท้าย (append) ตัวอย่างเช่น หากใช้ results.html เป็นอินพุต และใช้ results.csv เป็นเอาท์พุต จะเป็นดังนี้
$ perl honebook2csv.pl <> results.csv
หากตัดเครื่อง > และไฟล์ results.csv ออกไป ผลลัพธ์ก็จะแสดงบนหน้าจอแทน
$ perl phonebook2csv.pl <> results.csv
"name","phone number","address"
"John Doe","(555) 555-5555","Wandering, TX 98765"
"Jane Doe","(555) 555-5555","Horsing Around, MT 90909"
"John and Jane Doe","(555) 555-5555","Somewhere, CA 92929"
"John Q. Doe","(555) 555-5555","Freezing, NE 91919"
"Jane J. Doe","(555) 555-5555","1 Sunnyside Street, "Tanning, FL 90210""
"John Doe, Jr.","(555) 555-5555","Beverly Hills, CA 90210"
"John Doe","(555) 555-5555","1 Lost St., Yonkers, NY 91234"
"John Doe","(555) 555-5555","1 Doe Street, Doe, OR 99999"
"John Doe","(555) 555-5555","Beverly Hills, CA 90210"
การ ใช้สัญลักษณ์ >> ก่อนชื่อไฟล์ CSV จะส่งผลลัพธ์ไปยังไฟล์ CSV ดังกล่าว หรือถ้าหากไฟล์นั้นยังไม่มี ก็จะสร้างไฟล์ชื่อนั้นขึ้นมาให้โดยอัตโนมัติ วิธีนี้จะสะดวกในการรวบรวมผลลัพธ์จากหน้าเว็บเพจหลายๆหน้าที่บันทึกไว้
$ perl phonebook2csv.pl < st="on">1.html > results.csv
$ perl phonebook2csv.pl <>> results.csv

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

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

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

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