FashionWebScraping.md
Table Of Content
Парсинг данных о продуктах с веб-сайта электронной коммерции.
Введение
В наше время в области искусственного интеллекта мы все знаем, насколько важно иметь данные. Если вы работаете, например, с данными о продуктах, продаваемых онлайн, но у вас их нет под рукой, что делать без данных? 😲
Что, если я скажу, что есть обходной путь, с помощью которого вы можете фактически спарсить данные с веб-сайта электронной коммерции всего за несколько простых шагов с использованием кода на 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'
- Наконец, самая интересная часть, время создать паука для парсинга.
$ 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, чтобы получить необходимые теги для объектов.
- Создание 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**
- Данные о продуктах в формате CSV.
Как мы все знаем, окончательные очищенные данные представлены в формате CSV-файла, чтобы преобразовать JSON-файлы в CSV, мы используем файл 'jsontocsv.py' в папке utilityscripts.
**# Чтобы удалить повторяющиеся строки. $ python utilityScripts\jsontocsv.py**
Окончательный CSV-файл с продуктами сохраняется в папке final_products_csv.
Вот и все. Вы можете найти ссылку на мой GitHub со всеми файлами здесь.
Если вам понравилось это содержание, поставьте лайк и подпишитесь, если хотите. 😊