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

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

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

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

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