Scraping và crawling Web với Scrapy

Giới thiệu

Trong bài viết này sẽ giới thiệu ví dụ đơn giản thu thập dữ liệu từ một trang web bằng cách sử dụng Scrapy. Cụ thể mình sẽ thu thập toàn bộ thông tin sản phẩm của một cửa hàng trên mạng, ví dụ: http://hshop.vn/collections/all?page=1

Tiến hành

  • Cài Python 2.7
  • Cài packages Scrapy
$ pip install Scrapy

Scraping và crawling
Chúng ta có thể thấy thông tin của mỗi sản phẩm được đặt trong thẻ div và class là ProductDetails

<div class="ProductDetails">
<strong><a href="/products/khung-robot-17dof-humanoid-robo-soul-h30">Khung robot  17DOF Humanoid Robo-Soul H3.0</a></strong>
</div>

Để lấy tên của sản phẩm và đường dẫn tương đối của

products_name = response.xpath("//div[@class='ProductDetails']//a/text()").extract()
products_url = response.xpath("//div[@class='ProductDetails']//a//@href").extract()

Trang web này tất cả sản phẩm hiện thị trong 32 page, đoạn code dưới dây sẽ thu thập toạn bộ tên các sản phẩm, đường link của từng sản phẩm, từ đó chúng ta có thể vào từ link sản phẩm và thu thập các meta data, hình ảnh vào cơ sở dữ liệu hoặc đơn giản hơn Scrapy hỗ trợ xuất dữ liệu sang file csv, xml…
Scraping và crawling

Code Python

'''
Created on Oct 17, 2017
@author: nvtienanh
'''
# -*- coding: utf-8 -*-
import scrapy
import urlparse
BMSID = 42
class get_products(scrapy.Spider):
    name = 'get_products'

    start_urls = ['http://hshop.vn/collections/all?page=1']
    num_pages = 33
    
    for page in range(2, num_pages):
        start_urls.append('http://hshop.vn/collections/all?page=%d'%page)
    
    def parse(self, response):
        domain_name = 'http://hshop.vn'      
        global BMSID
        BMSModel = []
        #Extracting the content using css selectors
    
        products_name = response.xpath("//div[@class='ProductDetails']//a/text()").extract()
        products_url = response.xpath("//div[@class='ProductDetails']//a//@href").extract() 
        for i in range(len(products_url)):
            # ... compute some result based on item ...
            BMSID = BMSID + 1
            BMSModel.append('BMS%04d'%BMSID)
            url = urlparse.urljoin(domain_name,products_url[i])
            products_url[i] = url
                         

        for item in zip(products_name,products_url,BMSModel):    
            #create a dictionary to store the scraped info
            scraped_info = {
                'product_name' : item[0],
                'product_url' : item[1],
                'product_model' : item[2],

            }

            #yield or give the scraped info to scrapy
            yield scraped_info

Full project Scrapy: đang cập nhật

Xem thêm

Bình luận