ในบทความนี้ เราจะเรียนรู้เทคนิคการดึงข้อมูลเว็บ (web scraping) โดยใช้โมดูล Scrapy ที่มีใน Python
Web Scraping คืออะไร?
Web scraping ใช้เพื่อดึงข้อมูลจากเว็บไซต์ด้วยความช่วยเหลือของโปรแกรมรวบรวมข้อมูล (crawler/scanner) Web scraping มีประโยชน์ในการดึงข้อมูลจากหน้าเว็บที่ไม่มีฟังก์ชัน API ใน Python สามารถทำ web scraping ได้ด้วยโมดูลต่างๆ เช่น Beautiful Soup, Scrapy และ lxml
ในที่นี้เราจะพูดถึง web scraping โดยใช้โมดูล Scrapy
ก่อนอื่น เราต้อง ติดตั้ง Scrapy
พิมพ์ในเทอร์มินัลหรือคอมมานด์พรอมป์ท −
>>> pip install Scrapy
เนื่องจาก Scrapy เป็นเฟรมเวิร์ก เราต้องรันคำสั่งเริ่มต้น
>>> scrapy startproject tutpts
ในที่นี้เราสร้าง เว็บครอลเลอร์ (web crawler) / สไปเดอร์ (spider) เพื่อดึงข้อมูลออกจากเว็บไซต์
สำหรับการสร้างครอลเลอร์ เราสร้างสคริปต์แยกชื่อ tutptscraw.py ในที่นี้เราประกาศคลาสสำหรับการแยกเนื้อหา เราตั้งชื่อเว็บครอลเลอร์ และใช้ .requests เพื่อดึงข้อมูลจาก URL ที่กำหนด
ฟังก์ชันเจเนอเรเตอร์ (generator functions) ถูกใช้ ซึ่งจะ yield ข้อมูลที่ดึงมา
import scrapy
class ExtractUrls(scrapy.Spider):
name = "fetch"
# ฟังก์ชันเจเนอเรเตอร์
def start_requests(self):
# ใส่ URL
urls = ['https://www.tutorialspoint.com/index.htm/', ]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
ข้อมูลทั้งหมดที่ห่อหุ้มอยู่ในแท็กแองคอร์ (anchor tag) จะถูกดึงมาโดยฟังก์ชัน request เนื่องจาก Scrapy เป็นเฟรมเวิร์กขนาดเล็ก เราจึงรันฟังก์ชันต่างๆ ใน Scrapy shell
เพื่อเปิดใช้งาน Scrapy shell ใช้คำสั่งต่อไปนี้
scrapy shell https://www.tutorialspoint.com/index.htm
ตอนนี้เราดึงข้อมูลจากแท็กแองคอร์โดยใช้ selectors คือ CSS หรือ xpaths
response.css('a')
links = response.css('a').extract()
เพื่อดึงลิงก์ทั้งหมดในหน้าเว็บ เราสร้างเมธอด parse Scrapy จะข้าม URL ที่เคยเยี่ยมชมไปแล้วโดยอัตโนมัติ ลดเวลาในการแสดงผล
import scrapy
class ExtractUrls(scrapy.Spider):
name = "fetch"
# ฟังก์ชันเจเนอเรเตอร์
def start_requests(self):
# ใส่ URL
urls = ['https://www.tutorialspoint.com/index.htm/', ]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
# ฟังก์ชัน parse
def parse(self, response):
title = response.css('title::text').extract_first()
# ดึงแท็กแองคอร์
links = response.css('a::attr(href)').extract()
for link in links:
yield {
'title': title,
'links': link
}
if 'tutorialspoint' in link:
yield scrapy.Request(url=link, callback=self.parse)
สรุป
ในบทช่วยสอนนี้ เราได้เรียนรู้การนำเว็บครอลเลอร์ไปใช้งานโดยใช้โมดูล Scrapy ใน Python