CoderCastrov logo
CoderCastrov
Питон

FashionWebScraping.md

FashionWebScraping.md
просмотров
4 мин чтение
#Питон

Парсинг данных о продуктах с веб-сайта электронной коммерции.

Введение

В наше время в области искусственного интеллекта мы все знаем, насколько важно иметь данные. Если вы работаете, например, с данными о продуктах, продаваемых онлайн, но у вас их нет под рукой, что делать без данных? 😲

Что, если я скажу, что есть обходной путь, с помощью которого вы можете фактически спарсить данные с веб-сайта электронной коммерции всего за несколько простых шагов с использованием кода на Python. 😁

Python Package

Scrapy, как следует из названия, предназначен для парсинга данных с веб-сайта. Пауки Scrapy будут обходить веб-сайт, чтобы получить данные полей, которые мы инициализируем.


Обзор кода

Мы будем парсить данные с этого интернет-магазина BOYNER. Мы можем спарсить все страницы на этом сайте. Спарсенные данные о продуктах включают название, бренд, цену, URL изображения и URL продукта.

Шаги

**$ pip install -r requirements.txt**

2. Создайте проект scrapy, чтобы получить необходимые файлы.

**$ scrapy startproject #YourFoldername $ cd #YourFoldername**

3. Создайте папки проекта.

**$ mkdir csvFiles $ mkdir images_scraped $ mkdir jsonFiles $ mkdir utilityScripts**

Структура папок и файлов проекта, как показано на изображении.

Папка 'csvfiles' содержит CSV-файлы, содержащие веб-сайты, которые нужно спарсить. Пауки будут считывать из этих CSV-файлов 'начальные URL' для начала парсинга.

Папка 'fashionWebScraping' содержит пауки Scrapy и вспомогательные скрипты, такие как 'settings.py', 'item.py' и 'pipelines.py'. Нам нужно изменить некоторые из этих вспомогательных скриптов Scrapy, чтобы успешно выполнить процесс парсинга.

4. Заполните CSV-файлы начальными URL для каждого веб-сайта.

URL первой страницы веб-сайта, который мы парсим, выглядит так.

[https://www.boyner.com.tr/kadin-canta-c-1005/1/?dropListingPageSize=90](https://www.boyner.com.tr/kadin-canta-c-1005/1/?dropListingPageSize=90)

5. Изменение 'item.py' и 'settings.py'.

Мы определяем объекты Item для парсинга данных в 'items.py'.

**# файл items.py в папке fashionWebScarping**import scrapy
from scrapy.item import Item, Fieldclass FashionwebscrapingItem(scrapy.Item):
        
            **#связанные с продуктом элементы**
            gender=Field()
            productId=Field()
            productName=Field()
            priceOriginal=Field()
            priceSale=Field()**#элементы для хранения ссылок**
            imageLink = Field()
            productLink=Field()**#элемент для названия компании**
            company = Field()**#элементы для изображений**
            #image_urls = scrapy.Field()
            #images = scrapy.Field()            passclass ImgData(Item):
            image_urls=scrapy.Field()
            images=scrapy.Field()

Затем мы изменяем 'settings.py'. Это необходимо для настройки конвейера изображений и поведения пауков. Не изменяйте ничего другого в файле settings.py.

**# файл settings.py в папке fashionWebScraping**BOT_NAME = 'fashionWebScraping'SPIDER_MODULES = ['fashionWebScraping.spiders']
NEWSPIDER_MODULE = 'fashionWebScraping.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Nischay'# Obey robots.txt rules
ROBOTSTXT_OBEY = FalseITEM_PIPELINES = {'scrapy.pipelines.images.ImagesPipeline': 1}
IMAGES_STORE = 'ПУТЬ к папке image_scraped'
  1. Наконец, самая интересная часть, время создать паука для парсинга.
$ scrapy genspider fashionBOYNER boyner.com

Эта команда создаст файл 'fashionBOYNER.py' в папке spiders.

**# файл fashionBOYNER.py в папке fashionWebScraping/spiders**import scrapy
        from fashionWebScraping.items import FashionwebscrapingItem
        from fashionWebScraping.items import ImgData
        from scrapy.http import Request#to read from a csv file
        import csvclass FashionboynerSpider(scrapy.Spider):
            name = 'fashionBOYNER'
            allowed_domains = ['BOYNER.com']
            start_urls = ['[http://BOYNER.com/'](http://BOYNER.com/')]# This function helps us to scrape the whole content of the website# by following the links in a csv file.
            def start_requests(self):# Read main category links from a csv file  
                with open(r"D:\AI and Python\Python\Web_Scraping1\csvFiles\SpiderMainCategoryLinksBOYNER.csv", "rU") as f:
                    reader=csv.DictReader(f)
                
                    for row in reader:url=row['url']
                        # Change the offset value incrementally to navigate through the product list
                        # You can play with the range value according to maximum product quantity
                        link_urls = [url.format(i) for i in range(1,2)]for link_url in link_urls:
                            
                            print(link_url)#Pass the each link containing 100 products, to parse_product_pages function with the gender metadata
                            request=Request(link_url, callback=self.parse_product_pages, meta={'gender': row['gender']})
                
                            yield request# This function scrapes the page with the help of xpath provided
            def parse_product_pages(self,response):item=FashionwebscrapingItem()# Get the HTML block where all the products are listed
                # <ul> HTML element with the "products-listing small" class name
                content=response.xpath('//div[starts-with([@class](http://twitter.com/class),"product-list-item")]')
                
                # loop through the <li> elements with the "product-item" class name in the content
                for product_content in content:image_urls = []# get the product details and populate the items
                    item['productId']=product_content.xpath('.//a/@data-id').extract_first()
                    item['productName']=product_content.xpath('.//img/@title').extract_first()item['priceSale']=product_content.xpath('.//ins[[@class](http://twitter.com/class)="price-payable"]/text()').extract_first()item['priceOriginal']=product_content.xpath('.//del[[@class](http://twitter.com/class)="price-psfx"]/text()').extract_first()if item['priceOriginal']==None:
                        item['priceOriginal']=item['priceSale']item['imageLink']=product_content.xpath('.//img/@data-original').extract_first()   
                    item['productLink']="[https://www.boyner.com.tr](https://www.boyner.com.tr)"+product_content.xpath('.//a/@href').extract_first()
                    
                    image_urls.append(item['imageLink'])item['company']="BOYNER"
                    item['gender']=response.meta['gender']if item['productId']==None:
                        breakyield (item)
                    yield ImgData(image_urls=image_urls)def parse(self, response):
                pass

HTML-теги берутся из исходного кода страницы, щелкните правой кнопкой мыши на веб-странице и выберите "Инспектировать", найдите product-list-item, чтобы получить необходимые теги для объектов.

  1. Создание JSON-файлов из пауков.
**$ scrapy crawl -o rawdata_BOYNER.json -t jsonlines fashionBOYNER**

Это создает rawdata_BOYNER.json в папке jsonfiles. Возможно, у вас будут строки с пустыми полями или повторяющиеся значения. В обоих случаях требуется процесс коррекции, который я обрабатываю с помощью 'jsonPrep.py' и 'deldub.py'. 'jsonPrep.py' ищет строки с пустыми значениями и удаляет их при обнаружении. Результат сохраняется с именем файла, начинающимся с 'prepdata', в папке проекта 'jsonFiles', после удаления строк с пустыми значениями. 'deldub.py' ищет повторяющиеся строки и удаляет их при обнаружении. Результат сохраняется с именем файла, начинающимся с 'finaldata', в папке проекта 'jsonFiles', после удаления повторяющихся строк.

**# Чтобы удалить пустые значения. $ python utilityScripts\deldub.py ****# Чтобы удалить повторяющиеся строки. $ python utilityScripts\jsonPrep.py**
  1. Данные о продуктах в формате CSV.

Как мы все знаем, окончательные очищенные данные представлены в формате CSV-файла, чтобы преобразовать JSON-файлы в CSV, мы используем файл 'jsontocsv.py' в папке utilityscripts.

**# Чтобы удалить повторяющиеся строки. $ python utilityScripts\jsontocsv.py**

Окончательный CSV-файл с продуктами сохраняется в папке final_products_csv.

Вот и все. Вы можете найти ссылку на мой GitHub со всеми файлами здесь.

Если вам понравилось это содержание, поставьте лайк и подпишитесь, если хотите. 😊