สารบัญ:

ขูดข้อมูลด้วย ESP8266/ESP32: 7 ขั้นตอน
ขูดข้อมูลด้วย ESP8266/ESP32: 7 ขั้นตอน

วีดีโอ: ขูดข้อมูลด้วย ESP8266/ESP32: 7 ขั้นตอน

วีดีโอ: ขูดข้อมูลด้วย ESP8266/ESP32: 7 ขั้นตอน
วีดีโอ: ขั้นตอนการติดตั้งบอร์ด ESP8266 และ ESP32 สำหรับ Arduino IDE V2 2024, พฤศจิกายน
Anonim
ขูดข้อมูลด้วย ESP8266/ESP32
ขูดข้อมูลด้วย ESP8266/ESP32
ขูดข้อมูลด้วย ESP8266/ESP32
ขูดข้อมูลด้วย ESP8266/ESP32

คุณเคยต้องการรับข้อมูลสำหรับโครงการ Arduino ของคุณ แต่ไม่มี API สาธารณะสำหรับมันหรือไม่? หรือในกรณีเช่น Instagram API ที่ขั้นตอนการตั้งค่าไม่สะดวก?

ในคำแนะนำนี้ เราจะดู 2 ตัวเลือกที่แตกต่างกันสำหรับการดึงข้อมูลจากเว็บไซต์สำหรับโครงการ ESP8266 หรือ ESP32 ของคุณ

ขั้นตอนที่ 1: ดูวิดีโอ

Image
Image

ฉันได้ทำวิดีโอที่ครอบคลุมสิ่งเดียวกับคำแนะนำนี้ ดังนั้นหากคุณสนใจ โปรดตรวจสอบ!

ขั้นตอนที่ 2: ก่อนที่เราจะเริ่มต้น

ก่อนที่เราจะเริ่ม
ก่อนที่เราจะเริ่ม
ก่อนที่เราจะเริ่ม
ก่อนที่เราจะเริ่ม

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

สำหรับเทคนิคที่ครอบคลุมในคำแนะนำนี้ เราจะต้องใช้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์บางอย่างที่มีอยู่ในเบราว์เซอร์ ฉันจะสาธิตพวกเขาด้วย Firefox แต่ฉันรู้ว่า Chrome บางตัวมีเครื่องมือที่คล้ายกันและฉันแน่ใจว่าเบราว์เซอร์อื่นก็มีเครื่องมือเหล่านี้เช่นกัน

ขั้นตอนที่ 3: ไม่ใช่ API สาธารณะ (สปอยเลอร์: Instructables Has One!)

วิธีแรกที่เราจะพิจารณาคือการใช้ API ที่ไม่ใช่แบบสาธารณะ วิธีนี้อาจไม่สามารถใช้ได้เสมอไป แต่ถ้าเป็นวิธีนี้แน่นอน คุณควรตั้งเป้าที่จะใช้ สิ่งที่ฉันเรียกว่า "API ที่ไม่ใช่แบบสาธารณะ" โดยพื้นฐานแล้วไซต์ใช้ API ที่ไม่ได้โฆษณาบนเว็บไซต์ของพวกเขาในเบื้องหลังเพื่อดึงข้อมูลที่เราต้องการ

มีเหตุผลสองสามประการที่จะเป็นตัวเลือกที่ต้องการใช้

  1. ข้อได้เปรียบที่ใหญ่ที่สุดคือไม่น่าจะเปลี่ยนแปลงบ่อยเท่าหน้าเว็บ หากคุณขูดข้อมูลโดยตรงจาก HTML ของหน้าเว็บ ทุกครั้งที่พวกเขาทำการเปลี่ยนแปลงในเว็บไซต์ การแยกวิเคราะห์ของคุณอาจเสียหายได้
  2. โดยปกติแล้วข้อมูลจะมีประสิทธิภาพมากกว่า เมื่อคุณขูดหน้าเว็บ คุณกำลังดาวน์โหลดหน้า HTML ทั้งหมดเพื่อดึงข้อมูลบางส่วนออกจากหน้าเว็บนั้น API จะส่งกลับเฉพาะจุดข้อมูลเท่านั้น ซึ่งปกติแล้วจะเป็นคำขอที่เล็กกว่ามาก
  3. มักจะง่ายกว่าในการแยกวิเคราะห์ โดยปกติ API จะส่งคืนข้อมูลในรูปแบบ JSON ซึ่งง่ายต่อการแยกวิเคราะห์ โดยเฉพาะอย่างยิ่งหากคุณกำลังแยกข้อมูลหลายส่วน

ก่อนอื่นเราต้องค้นหาว่าหน้าเว็บใช้การตั้งค่าแบบนี้หรือไม่ เงื่อนงำที่ใหญ่ที่สุดคือหากไซต์อัปเดตค่าในแบบเรียลไทม์เหมือนใน Kickstarter แต่ถึงแม้จะไม่มีก็หวังว่าจะใช้การตั้งค่านี้ Instructables ใช้ API ที่ไม่ใช่แบบสาธารณะในการดึงข้อมูลบางส่วนสำหรับไซต์ของตน แม้ว่าจะไม่รีเฟรชในแบบเรียลไทม์ก็ตาม

หากต้องการตรวจสอบว่าไซต์ใช้การตั้งค่านี้หรือไม่ ให้เข้าสู่โหมดนักพัฒนาซอฟต์แวร์ของเบราว์เซอร์ ฉันพบวิธีที่ง่ายที่สุดในการทำเช่นนี้คือคลิกขวาที่หน้าและเลือก "ตรวจสอบองค์ประกอบ"

จากนั้น คุณจะต้องไปที่แท็บเครือข่าย ซึ่งจะแสดงคำขอที่หน้าเว็บสร้างขึ้นในพื้นหลัง โปรดทราบว่าคุณอาจต้องโหลดหน้านี้ซ้ำหลังจากเปิดแท็บนี้ เนื่องจากจะแสดงเฉพาะคำขอที่ทำขึ้นนับจากนี้เป็นต้นไป

ปกติคุณต้องการค้นหาประเภท "json" อาจมีคำขอจำนวนมากที่นี่ ดังนั้นอาจช่วยจัดเรียงตามประเภทได้ คุณสามารถเห็นได้ชัดเจนว่าในหน้าแคมเปญ kickstarter นั้นใช้การตั้งค่านี้ เนื่องจากคุณสามารถเห็นคำขอคงที่ที่ส่งไปยังปลายทาง "stats.json" ในหน้าผู้เขียน Instructables (เช่น ของฉันคือ "https://www.instructables.com/member/witnessmenow/") พวกเขาจะไม่ส่งคำขออย่างต่อเนื่อง แต่คุณสามารถเห็นคำขอซ่อน "showAuthorStats" ที่ซ่อนอยู่ในหมู่ผู้อื่น

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

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

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

ขั้นตอนที่ 4: ขูดข้อมูลโดยตรง

ขูดข้อมูลโดยตรง
ขูดข้อมูลโดยตรง
ขูดข้อมูลโดยตรง
ขูดข้อมูลโดยตรง
ขูดข้อมูลโดยตรง
ขูดข้อมูลโดยตรง

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

สิ่งหนึ่งที่สำคัญที่ควรทราบในที่นี้ หากคุณคุ้นเคยกับการพัฒนาเว็บ คุณอาจเคยชินกับการใช้คุณลักษณะตรวจสอบองค์ประกอบเพื่อค้นหาข้อมูลเกี่ยวกับองค์ประกอบเฉพาะและโครงสร้างขององค์ประกอบ วิธีนี้ควรหลีกเลี่ยง เนื่องจากหน้าเว็บสมัยใหม่มักจะมีการเปลี่ยนแปลงแบบไดนามิกโดยใช้ Javascript ซึ่งจะไม่เกิดขึ้นบนอุปกรณ์ของคุณ รหัส HTML ที่มีอยู่ในอุปกรณ์ของคุณจะเป็นหน้าเว็บต้นฉบับที่ดาวน์โหลดเท่านั้น ตัวอย่างที่ดีของสิ่งนี้คือหน้า TeamTrees จำนวนการบริจาคปัจจุบันเริ่มต้นที่ 0 และโหลดเข้าสู่หน้าในภายหลังด้วยภาพเคลื่อนไหวนี้ แต่ต่างจากตัวอย่างสองตัวอย่างที่เราเคยเห็นมาก่อน มันไม่โหลดข้อมูลในพื้นหลัง ดังนั้น ข้อมูลที่ถูกต้องจะต้องอยู่ที่อื่น

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

คุณต้องค้นหาสตริงการค้นหาที่นำคุณไปสู่ข้อมูลของคุณ ง่ายกว่ามากที่จะคิดออกก่อนที่จะเขียนโค้ดสำหรับอุปกรณ์ สำหรับตัวอย่างนี้ การค้นหา "data-count\" ทำให้ฉันได้ข้อมูลที่เราต้องการ ซึ่งสมบูรณ์แบบมาก เราไม่ต้องกังวลว่าจะตรงกับตำแหน่งอื่นๆ ของหน้าด้วย เพราะจะอยู่ที่ด้านบนสุดก่อน หากคุณจำเป็นต้องตีอันที่ 3 คุณก็ตั้งโปรแกรมให้ละเว้น 2 ตัวแรกที่คุณกดได้

หากเราดูตัวอย่าง TeamTrees อย่างเมื่อก่อนเราข้ามหัวข้อการตอบกลับไปและตอนนี้กำลังดูเนื้อหาของการตอบกลับ (ซึ่งเป็นหน้าเว็บ) สิ่งที่กลับมาจากลูกค้าคือกระแสข้อมูล เราไม่สนใจเกี่ยวกับคำค้นหาของเรา ดังนั้นเราจึงทำ client.find หากพบคำค้นหาก็จะคืนค่าเป็นจริงและจะย้ายสตรีมไปยังจุดสิ้นสุดของข้อความค้นหา สิ่งต่อไปจากสตรีมคือข้อมูลที่เรากำลังค้นหา แต่ในกรณีนี้ เราไม่แน่ใจว่าข้อมูลจะนานแค่ไหน แต่เรารู้ว่ามันเป็นข้อมูลทั้งหมดระหว่างตำแหน่งปัจจุบันของเราในสตรีมกับเครื่องหมายจุลภาคถัดไป. เราสามารถทำได้โดยใช้ "client.readBytesUntil" ซึ่งทำงานตามที่กล่าวไว้ โดยจะอ่านไบต์ลงในบัฟเฟอร์จนกว่าจะถึงคิวรีที่ระบุ แค่ตรวจสอบให้แน่ใจว่าบัฟเฟอร์ที่คุณกำลังอ่านมีขนาดใหญ่พอที่จะเก็บข้อมูลทั้งหมด ฉันคิดว่าเราค่อนข้างปลอดภัยที่นี่ด้วย 32!

หากคุณมีข้อมูลทั้งหมดที่ต้องการ คุณก็ไม่จำเป็นต้องอ่านข้อมูลอีกต่อไป ฉันไม่ได้ปิดการเชื่อมต่อที่นี่เพราะดูเหมือนว่าจะไม่ก่อให้เกิดปัญหากับ ESP8266 ดูเหมือนว่าจะทำให้เกิดปัญหากับ ESP32 ดังนั้นฉันจึงเพิ่ม client.stop() พูดตามตรงเลย ฉันไม่แน่ใจว่าทำไมฉันถึงวางมันไว้บนสุดของวิธีการ ฉันคิดว่ามันสมเหตุสมผลกว่าที่จะปิดมันเมื่อคุณมีข้อมูลที่คุณต้องการแล้ว

ขั้นตอนที่ 5: การขูดข้อมูลโดยใช้เซิร์ฟเวอร์ภายนอก:

การขูดข้อมูลโดยใช้เซิร์ฟเวอร์ภายนอก
การขูดข้อมูลโดยใช้เซิร์ฟเวอร์ภายนอก
การขูดข้อมูลโดยใช้เซิร์ฟเวอร์ภายนอก
การขูดข้อมูลโดยใช้เซิร์ฟเวอร์ภายนอก

มีอีกหัวข้อหนึ่งที่ต้องพูดถึง มีเครื่องมือที่ดีกว่ามากสำหรับการแยกวิเคราะห์ในสภาพแวดล้อมที่ใช้คอมพิวเตอร์ทั่วไป เช่น NodeJS มากกว่าบนไมโครคอนโทรลเลอร์ ดังนั้นบางครั้งอาจสมเหตุสมผลที่จะให้บริการที่ดึงข้อมูลจากเว็บเพจและให้ความเรียบง่าย จุดสิ้นสุดสำหรับ ESP8266 หรือ ESP32 ของคุณ ตัวอย่างหนึ่งของสิ่งนี้คือการขูดหน้า CrowdSupply เพื่อนับจำนวน TinyPICO ที่ขายแบบสด อาจเป็นไปได้ที่จะบรรลุผลโดยตรงบน ESP8266 หรือ ESP32 แต่เนื่องจากกำลังแยกวิเคราะห์จุดข้อมูลที่แตกต่างกันหลายจุดในองค์ประกอบที่แตกต่างกันหลายอย่าง ดังนั้นจึงมีความซับซ้อน

ฉันลงเอยด้วยการสร้างโปรเจ็กต์ NodeJS และแยกวิเคราะห์ข้อมูลโดยใช้ไลบรารี่ที่ชื่อว่า Cheerio และมันได้ผลดีมาก ฉันโฮสต์โปรเจ็กต์นี้บนคลาวด์เซิร์ฟเวอร์ที่ฉันมีอยู่แล้ว แต่คุณสามารถรันโปรเจ็กต์ประเภทนี้บน pi ได้ หากคุณไม่มีการตั้งค่าแบบนั้น

ขั้นตอนที่ 6: ขีดจำกัดการใช้งาน

ขีด จำกัด การใช้งาน
ขีด จำกัด การใช้งาน

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

ขั้นตอนที่ 7: ขอบคุณสำหรับการอ่าน

หวังว่าวิดีโอนี้จะช่วยคุณได้หากคุณสนใจที่จะแยกวิเคราะห์ข้อมูลโดยตรงจากหน้าเว็บใน ESP8266 หรือ ESP32 ของคุณ คุณมีคำถามอื่น ๆ ในหัวข้อที่ฉันไม่ได้กล่าวถึงหรือไม่? โปรดแจ้งให้เราทราบในความคิดเห็นด้านล่าง หรือเข้าร่วมกับฉันและผู้ผลิตรายอื่นๆ บนเซิร์ฟเวอร์ Discord ของฉัน ที่ซึ่งเราสามารถพูดคุยเกี่ยวกับหัวข้อนี้หรือผู้ผลิตรายอื่นที่เกี่ยวข้องกับสิ่งที่คุณมี ผู้คนช่วยเหลือดีมากที่นั่น เป็นสถานที่ที่ดีในการแขวน ออก

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

ขอบคุณที่อ่าน!

แนะนำ: