[Python]ทำ Web Scraping/ Web Crawler

minatorak
2 min readJan 29, 2018

--

28/1/2018

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

เริ่มแรกเราติดตั้ง library กันก่อน

pip install requests beautifulsoup4
http://docs.python-requests.org/en/master/

สำหรับ library request นั้นทาง

เขานิยามตัวเองไว้ว่าเป็น HTTP for Humans. คือเจ้าตัวนี้มันทำหน้าที่สร้าง HTTP connection โดยที่เราไม่ต้องไปทำอะไรยุ่งยากนัก

โดยเจ้าตัวนี้พัฒนามากจาก urllib3

ปล. Logoอย่างเท่อะ

.

.

.

.

.

.

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#getting-help

อันนี้คือ 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 ในการค้นหา

tag ของตัวtitle ในเว็บ
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เพียงอย่างเดียว เช่น

เพียงเท่านี้เราก็ได้ข้อมูลจากหน้าเว็บต่างๆไปทำอะไรอย่างอื่นได้อีกเยอะเลย

--

--