Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การดึงข้อมูลเว็บ (Web Scraping) ด้วย Scrapy ใน Python


ในบทความนี้ เราจะเรียนรู้เทคนิคการดึงข้อมูลเว็บ (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