Beautiful Soup เป็นไลบรารี Python แบบโอเพ่นซอร์ส มันใช้ตัวแยกวิเคราะห์การนำทางเพื่อขูดเนื้อหาของไฟล์ XML และ HTML คุณต้องการข้อมูลเพื่อการวิเคราะห์หลายประการ อย่างไรก็ตาม หากคุณเพิ่งเริ่มใช้ Python และการขูดเว็บ ไลบรารี Beautiful Soup ของ Python ก็คุ้มค่าที่จะลองใช้โปรเจ็กต์การขูดเว็บ
ด้วยไลบรารี Beautiful Soup แบบโอเพ่นซอร์สของ Python คุณสามารถรับข้อมูลได้โดยการขูดส่วนหรือองค์ประกอบใดๆ ของหน้าเว็บที่ควบคุมกระบวนการได้อย่างเต็มที่ ในบทความนี้ เราจะมาดูวิธีการใช้ Beautiful Soup เพื่อขูดเว็บไซต์
วิธีการติดตั้งซุปที่สวยงามและเริ่มต้นกับมัน
ก่อนที่เราจะดำเนินการต่อ ในบทความบทช่วยสอน Beautiful Soup เราจะใช้ Python 3 และbeautifulsoup4ซึ่งเป็นเวอร์ชันล่าสุดของ Beautiful Soup ตรวจสอบให้แน่ใจว่าคุณได้สร้างสภาพแวดล้อมเสมือนของ Pythonเพื่อแยกโปรเจ็กต์และแพ็คเกจออกจากโปรเจ็กต์บนเครื่องของคุณ
ในการเริ่มต้น คุณต้องติดตั้งไลบรารี Beautiful Soup ในสภาพแวดล้อมเสมือนของคุณ Beautiful Soup มีให้ในรูปแบบแพ็คเกจ PyPi สำหรับระบบปฏิบัติการทั้งหมด ดังนั้นคุณจึงสามารถติดตั้งได้ด้วยคำสั่งpip install beautifulsoup4ผ่านเทอร์มินัล
แต่ถ้าคุณอยู่ใน Debian หรือ Linux คำสั่งดังกล่าวยังคงทำงาน แต่คุณสามารถติดตั้งได้กับผู้จัดการแพคเกจโดยใช้apt-get install python3-BS4
Beautiful Soup ไม่ขูด URL โดยตรง ใช้งานได้กับไฟล์ HTML หรือ XML สำเร็จรูปเท่านั้น นั่นหมายความว่าคุณไม่สามารถส่ง URL เข้าไปโดยตรงได้ ในการแก้ปัญหานั้น คุณต้องรับ URL ของเว็บไซต์เป้าหมายด้วยไลบรารีคำขอของ Python ก่อนส่งไปยัง Beautiful Soup
เพื่อให้ไลบรารีนั้นพร้อมใช้งานสำหรับมีดโกนของคุณ ให้รันคำสั่งpip installการร้องขอผ่านเทอร์มินัล
ในการใช้ไลบรารี XML parser ให้รันpip install lxmlเพื่อติดตั้ง
ตรวจสอบหน้าเว็บที่คุณต้องการขูด
ก่อนที่จะขูดเว็บไซต์ใด ๆ ที่คุณไม่คุ้นเคย แนวทางปฏิบัติที่ดีที่สุดคือการตรวจสอบองค์ประกอบของเว็บไซต์ คุณสามารถทำได้โดยเปลี่ยนเบราว์เซอร์เป็นโหมดนักพัฒนาซอฟต์แวร์ การใช้ Chrome DevToolsนั้นค่อนข้างง่ายหากคุณใช้ Google Chrome
อย่างไรก็ตาม จำเป็นต้องตรวจสอบหน้าเว็บเพื่อทราบข้อมูลเพิ่มเติมเกี่ยวกับแท็ก HTML แอตทริบิวต์ คลาส และรหัส การทำเช่นนี้เป็นการเปิดเผยองค์ประกอบหลักของหน้าเว็บและประเภทเนื้อหา
นอกจากนี้ยังช่วยให้คุณพัฒนากลยุทธ์ที่ดีที่สุดที่คุณสามารถใช้เพื่อรับข้อมูลที่แน่นอนที่คุณต้องการจากเว็บไซต์และวิธีที่คุณจะได้รับ
วิธีขูดข้อมูลเว็บไซต์ด้วยซุปที่สวยงาม
เมื่อคุณมีทุกอย่างพร้อมแล้ว ให้เปิดตัวแก้ไขโค้ดที่ต้องการและสร้างไฟล์ Python ใหม่ โดยตั้งชื่อให้กับไฟล์นั้น อย่างไรก็ตาม คุณสามารถใช้ IDE บนเว็บเช่น Jupyter Notebook ได้หากคุณไม่คุ้นเคยกับการรัน Python ผ่านบรรทัดคำสั่ง
ถัดไป นำเข้าไลบรารีที่จำเป็น:
from bs4 import BeautifulSoup import requests
ก่อนอื่น มาดูกันว่าคำขอห้องสมุดทำงานอย่างไร:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com') print(website)
เมื่อคุณเรียกใช้โค้ดด้านบน โค้ดจะส่งคืนสถานะ 200 ซึ่งบ่งชี้ว่าคำขอของคุณสำเร็จ มิฉะนั้น คุณจะได้รับสถานะ 400 หรือสถานะข้อผิดพลาดอื่นๆ ที่ระบุคำขอ GET ที่ล้มเหลว
อย่าลืมแทนที่ URL ของเว็บไซต์ในวงเล็บด้วย URL เป้าหมายของคุณ
เมื่อคุณได้รับเว็บไซต์ที่มีการรับคำขอแล้วคุณจะผ่านมันข้ามไปยังสวยซุปซึ่งขณะนี้สามารถอ่านเนื้อหาเป็น HTML หรือไฟล์ XML โดยใช้ตัวใน XML หรือ HTML parser ขึ้นอยู่กับรูปแบบที่คุณเลือก
ดูข้อมูลโค้ดต่อไปนี้เพื่อดูวิธีดำเนินการกับตัวแยกวิเคราะห์ HTML:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com') soup = BeautifulSoup(website.content, 'html.parser') print(soup)
โค้ดด้านบนส่งคืน DOM ทั้งหมดของหน้าเว็บที่มีเนื้อหา
คุณยังสามารถรับ DOM เวอร์ชันที่มีการจัดตำแหน่งมากขึ้นโดยใช้วิธีprettify คุณสามารถลองใช้สิ่งนี้เพื่อดูผลลัพธ์:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.prettify())
คุณยังสามารถรับเนื้อหาบริสุทธิ์ของหน้าเว็บโดยไม่ต้องโหลดองค์ประกอบด้วยวิธี.text :
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.text)
วิธีการขูดเนื้อหาของหน้าเว็บด้วยชื่อแท็ก
คุณยังสามารถขูดเนื้อหาในแท็กเฉพาะด้วย Beautiful Soup ในการดำเนินการนี้ คุณต้องใส่ชื่อของแท็กเป้าหมายในคำขอมีดโกนซุปสวย
ตัวอย่างเช่น มาดูกันว่าคุณจะรับเนื้อหาในแท็กh2ของหน้าเว็บได้อย่างไร
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') print(soup.h2)
ในข้อมูลโค้ดด้านบนนี้soup.h2จะคืนค่าองค์ประกอบh2แรกของหน้าเว็บและละเว้นส่วนที่เหลือ ในการโหลดองค์ประกอบh2ทั้งหมดคุณสามารถใช้ฟังก์ชัน find_allในตัวและfor loop ของ Python:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') h2tags = soup.find_all('h2') for soups in h2tags: print(soups)
บล็อกของรหัสนั้นส่งคืนองค์ประกอบh2ทั้งหมดและเนื้อหา อย่างไรก็ตาม คุณสามารถรับเนื้อหาโดยไม่ต้องโหลดแท็กโดยใช้วิธี.string :
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') h2tags = soup.find_all('h2') for soups in h2tags: print(soups.string)
คุณสามารถใช้วิธีนี้กับแท็ก HTML ใดก็ได้ สิ่งที่คุณต้องทำคือแทนที่แท็กh2ด้วยแท็กที่คุณต้องการ
อย่างไรก็ตาม คุณสามารถขูดแท็กเพิ่มเติมได้โดยส่งรายการแท็กไปยังเมธอดfind_all ตัวอย่างเช่น บล็อกของโค้ดด้านล่างขูดเนื้อหาของa , h2และแท็กชื่อ :
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') tags = soup.find_all(['a', 'h2', 'title']) for soups in tags: print(soups.string)
วิธีการขูดเว็บเพจโดยใช้ ID และ Class Name
หลังจากตรวจสอบเว็บไซต์ด้วย DevTools แล้ว จะช่วยให้คุณทราบข้อมูลเพิ่มเติมเกี่ยวกับแอตทริบิวต์ id และ class ที่ถือแต่ละองค์ประกอบใน DOM เมื่อคุณมีข้อมูลชิ้นนั้นแล้ว คุณสามารถขูดหน้าเว็บนั้นโดยใช้วิธีนี้ มีประโยชน์เมื่อเนื้อหาขององค์ประกอบเป้าหมายมีการวนซ้ำจากฐานข้อมูล
คุณสามารถใช้วิธีfindสำหรับ id และ class scrapers ต่างจากเมธอดfind_allที่ส่งคืนอ็อบเจ็กต์แบบ iterable วิธีfindทำงานบนเป้าหมายเดียวที่ไม่สามารถทำซ้ำได้ ซึ่งเป็นidในกรณีนี้ ดังนั้น คุณไม่จำเป็นต้องใช้forลูปกับมัน
มาดูตัวอย่างวิธีขูดเนื้อหาของหน้าด้านล่างโดยใช้รหัส:
from bs4 import BeautifulSoup import requests website = requests.get('http://somewebpages.com/') soup = BeautifulSoup(website.content, 'html.parser') id = soup.find(id = 'enter the target id here') print(id.text)
การทำเช่นนี้สำหรับชื่อชั้นแทนรหัสที่มีระดับ อย่างไรก็ตาม การเขียนคลาสโดยตรงทำให้เกิดความสับสนทางไวยากรณ์ เนื่องจาก Python มองว่าเป็นคีย์เวิร์ด เพื่อหลีกเลี่ยงข้อผิดพลาดที่คุณจะต้องเขียนขีดอยู่หน้าชั้นเรียนเช่นนี้class_
โดยพื้นฐานแล้วบรรทัดที่มี id จะกลายเป็น:
my_classes = soup.find(class_ = 'enter the target class name here') print(my_classes.text)
อย่างไรก็ตาม คุณสามารถขูดหน้าเว็บโดยเรียกชื่อแท็กเฉพาะด้วยรหัสหรือคลาสที่เกี่ยวข้อง:
data = soup.find_all('div', class_ = 'enter the target class name here') print(data)
วิธีทำที่ขูดแบบใช้ซ้ำได้ด้วยซุปที่สวยงาม
คุณสามารถสร้างคลาสและรวมโค้ดก่อนหน้าทั้งหมดเข้าด้วยกันในฟังก์ชันในคลาสนั้นเพื่อสร้างมีดโกนที่นำกลับมาใช้ใหม่ได้ซึ่งรับเนื้อหาของแท็กและ id ของแท็กบางส่วน เราสามารถทำได้โดยการสร้างฟังก์ชันที่ยอมรับห้าอาร์กิวเมนต์: URL, สองชื่อแท็ก และรหัสหรือคลาสที่เกี่ยวข้อง
สมมติว่าคุณต้องการขูดราคาเสื้อเชิ้ตจากเว็บไซต์อีคอมเมิร์ซ ตัวอย่างคลาสขูดด้านล่างแยกราคาและแท็กเสื้อด้วยรหัสหรือคลาสที่เกี่ยวข้อง จากนั้นส่งคืนเป็นกรอบข้อมูล Pandas โดยมี 'ราคา' และ Shirt_name เป็นชื่อคอลัมน์
ตรวจสอบให้แน่ใจว่าคุณpip ติดตั้งแพนด้าผ่านเทอร์มินัล หากคุณยังไม่ได้ดำเนินการ
import pandas as pd class scrapeit: try: def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None): if not (website and tag1 and id1 and tag2 and id2)==None: try: page = requests.get(website) soup = BeautifulSoup(page.content, 'html.parser') infotag1 = soup.find_all(tag1, id1) infotag2 = soup.find_all(tag2, id2) priced = [prices.text for prices in infotag1] shirt = [shirts.text for shirts in infotag2] data = { 'Price':priced, 'Shirt_name':shirt} info = pd.DataFrame(data, columns=['Price', 'Shirt_name']) print(info) except: print('Not successful') else: print('Oops! Please enter a website, two tags and thier corresponding ids') except: print('Not successful!')
มีดโกนที่คุณเพิ่งสร้างนั้นเป็นโมดูลที่นำกลับมาใช้ใหม่ได้และคุณสามารถนำเข้าและใช้ในไฟล์ Python อื่นได้ ที่จะเรียกขูดฟังก์ชั่นจากระดับนี้คุณสามารถใช้scrapeit.scrape (URL ของเว็บไซต์ ', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id') หากคุณไม่ได้ระบุ URL และพารามิเตอร์อื่นๆคำสั่งelseจะแจ้งให้คุณดำเนินการดังกล่าว
หากต้องการใช้สเคเปอร์นั้นในไฟล์ Python อื่น คุณสามารถนำเข้าได้ดังนี้:
from scraper_module import scrapeit scrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')
หมายเหตุ: scraper_moduleเป็นชื่อของไฟล์ Python ที่มีคลาส scraper
คุณยังสามารถตรวจสอบเอกสารประกอบของBeautiful Soup ได้หากต้องการเจาะลึกถึงวิธีการใช้งานให้เกิดประโยชน์สูงสุด
Beautiful Soup เป็นเครื่องขูดหน้าจอ Python อันทรงพลังที่ให้คุณควบคุมวิธีที่ข้อมูลของคุณเข้ามาในระหว่างการขูด เป็นเครื่องมือทางธุรกิจที่มีคุณค่า เนื่องจากช่วยให้คุณสามารถเข้าถึงข้อมูลเว็บของคู่แข่งได้ เช่น ราคา แนวโน้มตลาด และอื่นๆ
แม้ว่าเราจะสร้างตัวขูดแท็กในบทความนี้ แต่คุณยังคงสามารถใช้ไลบรารี Python อันทรงพลังนี้เพื่อสร้างเครื่องมือขูดที่มีประโยชน์มากขึ้น