28/1/2018
จริงๆมันคือ วิธีการดึงข้อมูลจากหน้า web page โดยวิเคราะห์จากลักษณะของภาษา markupในเว็บนั้น ที่แต่เดิมใช้ในการแสดงผลข้อมูล ทำให้เราดึงเฉพาะข้อมูลที่เราต้องการได้โดยอัตโนมัติ
เริ่มแรกเราติดตั้ง library กันก่อน
pip install requests beautifulsoup4
สำหรับ library request นั้นทาง
เขานิยามตัวเองไว้ว่าเป็น HTTP for Humans. คือเจ้าตัวนี้มันทำหน้าที่สร้าง HTTP connection โดยที่เราไม่ต้องไปทำอะไรยุ่งยากนัก
โดยเจ้าตัวนี้พัฒนามากจาก urllib3
ปล. Logoอย่างเท่อะ
.
.
.
.
.
.
อันนี้คือ Beautiful Soup เอาไว้จัดการdata ที่ได้request มาอีกที เพื่อให้ง่ายต่อการค้นหาและจัดการ data
.
.
.
ก่อนอื่นเราไปดูตัวหน้าเว็บกันก่อน ว่าข้างหลังมันมีอะไรบ้าง
เมื่อเราเข้าเว็บ แล้วลองกดปุ่มF12(บนคีย์บอร์ด)ดู จะพบหน้าต่างแบบนี้แทรกขึ้นมา
ซึ่งตรงส่วนนี้จะมีcodeต่างๆที่ประกอบกันเป็นหน้าเว็บขึ้นมา และจะมีข้อความที่ปรากฎอยู่ในหน้าเว็บนั้นด้วย เราก็จะมาหาข้อความในเว็บกันจากตรงนี้แหละ
requests
import requests
url = "https://www.javacodegeeks.com/" # url ของเว็บที่ต้องการดูข้อมูล
data = requests.get(url)
print(data.status_code)
print(data.text)
เมื่อลองprint ดูจะพบว่ามีข้อความอะไรไม่รู้อยู่เต็มไปหมดเลย ซึ่งถ้าหากเราไปที่หน้าเว็บแล้วคลิกขวาดูsource(กดปุ่ม ctrl+u) ของเว็บนั้นจะพบว่าเป็นตัวเดียวกัน
Beautiful Soup
import requests
url = "https://www.javacodegeeks.com/"
data = requests.get(url)###############
from bs4 import BeautifulSoup
soup = BeautifulSoup(data.text,'html.parser')
print(soup.prettify())
จะเห็นว่าข้อมูลที่printออกมาดูง่ายกว่าเดิมหน่อย แต่ก็ยังยากที่จะใช้งานอยู่ดี แต่ BeautifulSoup พกของดีมามากกว่านั้นคือ ความสามารถในการค้นหา ที่เหมาะกับข้อมูลแบบนี้เป็นอย่างดี
การใช้ find_all ในการค้นหา
import requests
url = "https://www.javacodegeeks.com/"
data = requests.get(url)
from bs4 import BeautifulSoup
soup = BeautifulSoup(data.text,'html.parser')
x = soup.find_all("h2",{"class":"post-title"}) # <- ค่าที่ใช้ในการค้นหา
for i in x:
print(i)
เมื่อลองprintดูจะหน้าตาประมาณนี้ ซึ่งก็เอาไปใช้กับ Regex ได้ง่ายแล้ว (แอบขายของเก่า ลองเล่น Regular Expression ,Regular Expressions part2)
ทีนี้หากลองเปลี่ยนเป็น .text จะเป็นการเอาค่าstringที่ถูกห่ออยู่ออกมา
แต่จริงๆไม่จำเป็นต้องระบุรายละเอียดขนาดนั้นก็ได้ในบางเว็บเราสามารถค้นหาได้จากtagเพียงอย่างเดียว เช่น
เพียงเท่านี้เราก็ได้ข้อมูลจากหน้าเว็บต่างๆไปทำอะไรอย่างอื่นได้อีกเยอะเลย
ปล.สำหรับคนที่ยังไม่ค่อยเข้าใจเท่าไหร่ ว่าควรใส่ตัวแปรอะไรลงในคำสั่ง
แนะนำให้ดูวิดีโอนี้