Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

มาสเตอร์ Mechanize: เทคนิคเว็บสครัปปิ้งขั้นสูง – ภาค 2

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

หัวข้อที่ครอบคลุม

  • หน้าเว็บเดียว vs. การแบ่งหน้า (Pagination)
  • Mechanize
  • Agent (ตัวแทน)
  • Page (หน้าเว็บ)
  • เมธอดของ Nokogiri
  • ลิงก์ (Links)
  • คลิก (Click)
  • ฟอร์ม (Forms)

หน้าเว็บเดียว vs. การแบ่งหน้า

จนถึงตอนนี้ เราใช้เวลาค่อนข้างมากในการทำความเข้าใจวิธีสครัปข้อมูลจากหน้าเว็บเพียงหน้าเดียวโดยใช้ Nokogiri ซึ่งเป็นพื้นฐานที่ดีสำหรับการก้าวไปสู่ขั้นตอนถัดไป: การดึงข้อมูลจากหลายหน้าเว็บ

ปัญหาที่เราพยายามแก้คือการดึงเนื้อหาจากมากกว่า 140 ตอน—ซึ่งมากกว่าที่จะรองรับในหน้าเว็บเดียวได้ เราจึงต้องทำงานกับการแบ่งหน้า (pagination) และต้องหาวิธีติดตามเนื้อหาลงไปในหลุมกระต่าย

นี่คือจุดที่ Nokogiri หยุดทำงาน และอีก Ruby Gem ที่มีประโยชน์ชื่อ Mechanize เข้ามามีบทบาท

Mechanize คืออะไร?

Mechanize เป็นเครื่องมืออันทรงพลังอีกตัวหนึ่งที่มีฟีเจอร์มากมาย Gem นี้ช่วยให้คุณทำให้การโต้ตอบกับเว็บไซต์ที่ต้องการดึงข้อมูลเป็นอัตโนมัติ ในมุมมองหนึ่ง มันคล้ายกับฟังก์ชันบางอย่างที่คุณอาจรู้จักจากการทดสอบด้วย Capybara

อย่าเข้าใจผิด การเล่นกับ Nokogiri บนหน้าเว็บเดียวนั้นเก่งแล้ว แต่สำหรับงานดึงข้อมูลที่ซับซ้อนกว่า เราต้องการ "แรงม้า" มากขึ้น เราสามารถครอลผ่านหน้าเว็บได้ไม่จำกัดจำนวน และโต้ตอบกับองค์ประกอบต่างๆ ได้—เลียนแบบและทำให้พฤติกรรมของมนุษย์เป็นอัตโนมัติ สิ่งนี้ทรงพลังมาก!

Gem นี้ช่วยให้คุณติดตามลิงก์ กรอกฟิลด์ฟอร์ม และส่งข้อมูล—รวมถึงจัดการคุกกี้ด้วย นั่นหมายความว่าคุณยังสามารถเลียนแบบการล็อกอินของผู้ใช้เข้าสู่เซสชันส่วนตัว และดึงข้อมูลจากเว็บไซต์ที่เฉพาะคุณเท่านั้นที่เข้าถึงได้

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

การสร้าง Mechanize Agent

ก่อนที่เราจะเริ่ม Mechanize ใดๆ เราต้องสร้าง Mechanize Agent ก่อน

some_scraper.rb

agent นี้จะถูกใช้เพื่อดึงหน้าเว็บ คล้ายกับสิ่งที่เราทำกับ Nokogiri

some_scraper.rb

สิ่งที่เกิดขึ้นคือ Mechanize agent ดึงหน้า podcast และคุกกี้ของมันมา

การดึงเนื้อหาจากหน้าเว็บ

ตอนนี้เรามีหน้าเว็บที่พร้อมสำหรับการดึงข้อมูลแล้ว ก่อนจะทำต่อ ผมแนะนำให้ดูโครงสร้างภายในโดยใช้เมธอด inspect

some_scraper.rb

ผลลัพธ์จะมีรายละเอียดมาก ลองดูด้วยตัวเองว่า Mechanize::Page object ประกอบด้วยอะไรบ้าง ที่นี่คุณจะเห็นอ็อบเจ็กต์ทั้งหมดของหน้านั้น และเป็นอ็อบเจ็กต์ที่สะดวกมากสำหรับการสไลด์ข้อมูลที่ต้องการดึง

ตัวอย่าง Output

หากต้องการดู HTML ของหน้าเว็บด้วยตัวเอง สามารถใช้เมธอด body หรือ content

some_scraper.rb

ตัวอย่าง Output (HTML)

เนื่องจาก podcast นี้มีองค์ประกอบไม่มากนัก นี่คือ Mechanize::Page ที่ได้จาก github.com ซึ่งมีเนื้อหาหลากหลายมากกว่า ควรดูเพื่อให้เข้าใจ感覺โดยรวม

Output github.com

กลับไปที่ podcast คุณยังสามารถดู encoding, HTTP response code, URI, หรือ response headers ได้

some_scraper.rb

Output

ยังมีรายละเอียดอีกมากมายหากต้องการขุดลึก ผมจะหยุดที่นี่

เมธอดของ Nokogiri

  • at
  • search

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

เช่น ถ้าต้องการค้นหาออบเจ็กต์เดียว ใช้ at ส่วน search จะคืนค่าออบเจ็กต์ทั้งหมดที่ตรงกับ selector บนหน้านั้น เมธอดเหล่านี้ทำงานได้ทั้งกับ Nokogiri document objects และ Mechanize page objects

some_scraper.rb

Output

ลิงก์ (Links)

  • links
  • link_with
  • links_with

เราสามารถนำทางเว็บไซต์ทั้งหมดตามใจชอบ ส่วนที่สำคัญที่สุดของ Mechanize คือความสามารถในการเล่นกับลิงก์—มิฉะนั้นก็แค่ใช้ Nokogiri อย่างเดียวพอ ลองดูว่าจะได้อะไรเมื่อขอลิงก์จากหน้าเว็บ

some_scraper.rb

Output

Mechanize ส่งคืนอาร์เรย์ของลิงก์จากหน้าแรกเท่านั้น เรียงจากบนลงล่าง ตามลำดับในหน้าเว็บ

ภาพหน้าจอตัวอย่าง

มาสเตอร์ Mechanize: เทคนิคเว็บสครัปปิ้งขั้นสูง – ภาค 2 มาสเตอร์ Mechanize: เทคนิคเว็บสครัปปิ้งขั้นสูง – ภาค 2 มาสเตอร์ Mechanize: เทคนิคเว็บสครัปปิ้งขั้นสูง – ภาค 2

เราสามารถดึงเฉพาะข้อความของลิงก์ได้เช่นกัน

some_scraper.rb

Output

การได้ลิงก์ทั้งหมดแบบนี้อาจมีประโยชน์หรืออาจรุ่งเรืองเกินไป Mechanize มีเครื่องมือช่วยกรองให้แม่นยำขึ้น

some_scraper.rb

Output

เราสามารถระบุลิงก์ที่ตรงตามเกณฑ์เฉพาะ เช่น ข้อความ (text) ด้วย API ที่สะดวกกว่าคือ links_with หรือ link_with หากมีลิงก์ "Focus" หลายอัน สามารถระบุลำดับด้วย bracket []

some_scraper.rb

หากต้องการค้นหาจาก href แทนข้อความ ให้ใช้ href แทน text

some_scraper.rb

หากต้องการลิงก์แรกที่ตรงตามข้อความ ใช้ syntax นี้

some_scraper.rb

ลอง click ลิงก์ Focus ดูสิว่ามีอะไรอยู่ด้านหลัง!

คลิก (Click)

some_scraper.rb

Mechanize จะคลิกลิงก์ให้ และติดตามไปยังหน้าใหม่ แล้วคืนค่าลิงก์ทั้งหมดที่พบบนหน้าใหม่นั้น

เช่น ถ้ามีลิงก์สองอันของ interviewee คนเดียวกัน—อันนำไปหน้าแท็ก อันนำไปหน้าตอนล่าสุด—และต้องการลิงก์จากทั้งสองหน้า:

some_scraper.rb

จะได้ลิงก์จากทั้งสองหน้า นี่คือตัวอย่าง combinations ต่างๆ เพื่อเริ่มต้น:

some_scraper.rb

ฟอร์ม (Forms)

  • submit
  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

มาดูฟอร์มกัน!

some_scraper.rb

Output

เมธอด forms คืนค่าเป็นอาร์เรย์ แม้จะมีฟอร์มเดียว กรณีนี้ฟอร์มมีชื่อ "f" เราสามารถใช้ form (เอกพจน์) เพื่อระบุฟอร์มเฉพาะนั้น

some_scraper.rb

ใช้ form('f') จะได้ฟอร์มเดียว ไม่ใช่อาร์เรย์

Output

เห็นฟิลด์ข้อความชื่อ q เราสามารถตั้งค่าได้เหมือน attribute ของ Ruby

some_scraper.rb

Output

ค่าของฟิลด์ข้อความเปลี่ยนเป็น New Google Search แล้ว ต่อไปแค่ submit ฟอร์ม และเก็บผลลัพธ์จากหน้าที่ Google คืนมา

some_scraper.rb

ที่นี่ใช้ CSS selector h3.r สำหรับ header ผลค้นหา map text และ pretty print ผลลัพธ์ ไมยากเลยใช่ไหม?

Output

Mechanize มี input fields หลากหลาย รวมถึงอัปโหลดไฟล์!

  • field_with
  • checkbox_with
  • radiobuttons_with
  • file_uploads

ระบุ radio buttons และ checkboxes โดย name แล้ว check ได้เลย

some_scraper.rb

สำหรับ dropdown (option tags) ระบุ name และเลือก option ตามลำดับ

some_scraper.rb

อัปโหลดไฟล์ทำงานคล้ายการกรอกข้อความ ระบุฟิลด์อัปโหลด แล้วกำหนด path ไฟล์

some_scraper.rb

ข้อคิดสุดท้าย

เห็นไหม ไม่มีเวทมนตร์อะไรเลย! ตอนนี้คุณพร้อมลองเล่นเองแล้ว ยังมีรายละเอียดของ Nokogiri และ Mechanize ให้เรียนรู้อีก แต่แทนที่จะลงลึกในรายละเอียดที่ไม่จำเป็น ลองเล่นจริงๆ และอ่าน documentation เมื่อเจอปัญหาที่เกินขอบเขตบทความระดับเริ่มต้น

หวังว่าคุณจะเห็นว่า Gem นี้เรียบง่ายแต่อันทรงพลัง ดังที่รู้กันดีจากวัฒนธรรมยุคใหม่ "พลังมากับความรับผิดชอบ" ใช้ในกรอบกฎหมาย และเมื่อไม่มี API ให้ใช้ คุณอาจไม่ได้ใช้บ่อย แต่เมื่อต้องสครัปจริง มันช่วยได้มาก!

ตามสัญญา บทความหน้าเราจะทำตัวอย่างจริง: สครัปข้อมูลจากเว็บ podcast เก่า (Sinatra) และย้ายไป Middleman ใหม่ที่ใช้ไฟล์ .markdown ต่อตอน จะดึงวันที่, หมายเลขตอน, ชื่อผู้สัมภาษณ์, หัวข้อ, หัวข้อย่อย ฯลฯ พบกันใหม่!