дерево категорий краудсорсинга

Я новичок в python, поэтому, пожалуйста, наберитесь терпения. Мне нужно просканировать веб-сайт (интернет-магазин), чтобы получить дерево категорий, что подразумевает навигацию по дереву страниц, а также сохранение родителей текущего под-под- ...-category для создания чистой структуры категорий. Поэтому, пожалуйста, представьте, как интернет-магазин будет вести учет своих категорий товаров.

В основном мне нужно получить элементы со строками, разделенными запятыми, с узлами дерева, как показано ниже:

MainCateg1
MainCateg1, MainCateg1Sub1
MainCateg1, MainCateg1Sub1, MainCateg1Sub1Sub1
MainCateg1, MainCateg1Sub1, MainCateg1Sub1Sub1, MainCateg1Sub1Sub1Sub1
MainCateg1, MainCateg1Sub1, MainCateg1Sub1Sub1, MainCateg1Sub1Sub1Sub2
...
MainCateg1, MainCateg1Sub2, 
MainCateg1, MainCateg1Sub2, MainCateg1Sub1Sub1, MainCateg1Sub1Sub1Sub1
...
MainCateg2
MainCateg2, MainCateg2Sub1
MainCateg2, MainCateg2Sub1, MainCateg2Sub1Sub1
MainCateg2, MainCateg2Sub1, MainCateg2Sub1Sub1, MainCateg2Sub1Sub1Sub1
...
and so on...

Количество уровней подкатегорий является переменным и неизвестным. Я не знаю, как к этому подойти, потому что, казалось бы, мне придется рекурсивно вызывать скрипт, сохраняя запись предыдущих уровней в фактическом порядке появления. Я могу получить категории из меню, которое является ul с

идентификатор = "кошка"

и соответствующие подкатегории из div с

класс = «блокировать многоуровневое содержимое»

Итак, мой скрипт пока выглядит так:

import logging
from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from products.items import Categories
import urlparse 
from scrapy.http.request import Request

class CategoriesSpider(BaseSpider): 
    name = "categories" 
    allowed_domains = ["myshop.com"] 
    start_urls = ['http://www.myshop.com/']

    def parse(self,response): 
        hxs = HtmlXPathSelector(response) 
        listings = hxs.select('//ul[@id="cat"]/li') 
        links = []
        #scrap listings page to get listing links
        for listing in listings: 
            link=listing.select('.//a/@href').extract()[0] 

        #parse listing url to get content of the listing page

        for link in links: 
            item=Categories() 
            item['link']=link 
            yield Request(urlparse.urljoin(response.url, link), meta={'item':item},callback=self.parse_listing_page)

        #get next button link 
        next_page = hxs.select('//a/@href/text()').extract()[0]

        if next_page: 
            yield Request(urlparse.urljoin(response.url, next_page), self.parse)

    #scrap listing page to get content 
    def parse_listing_page(self,response): 
        hxs = HtmlXPathSelector(response) 
        listings = hxs.select('//div[@class="block-layered-content"]/ul/li') 
        item = response.request.meta['item'] 
        logging.log(logging.WARNING, response)
        yield item

Но очевидно, что это неправильно. Что я делаю до сих пор, так это анализирую основные категории на главной странице, и для каждой из них я обращаюсь к странице категорий и пытаюсь получить найденный там контент (подкатегории). Но учитывая неизвестное количество подкатегорий, я не могу написать 10-15 подкатегорий... потому что во-первых: у категории может быть только одна подкатегория, а у другой категории может быть 15 под-подкатегорий. Кроме того, мне нужно иметь возможность хранить текущую «ветку» (Maincat->SubCat1->SubSubcat1->...) и возвращать только ее.

Итак, как я могу адаптировать этот сценарий к своим потребностям?


person user1137313    schedule 26.11.2015    source источник
comment
как насчет того, чтобы снова вызвать parse вместо parse_listing_page?   -  person eLRuLL    schedule 26.11.2015


Ответы (1)


К сожалению, я не смог найти ни один из путей xpath из вашего вопроса на сайте myshop.com. Однако я думаю, что вы можете изменить структуру своего проекта, чтобы добиться желаемых результатов. Я бы предложил иметь только одну процедуру синтаксического анализа, поскольку каждая страница может иметь ссылки и должна быть очищена для своих категорий. Вам потребуются следующие разделы в процедуре синтаксического анализа:

Извлеките категорию для этой страницы. Добавьте категорию к существующим метаданным и получите метаданные.

category = response.xpath( extract the category )
if response.meta['breadcrumbs']:
    breadcrumbs = response.meta['breadcrumbs'] + ', ' + category
else:
    breadcrumbs = category
item['breadcrumbs'] = breadcrumbs
.... extract anything else
yield item

Извлеките прямые ссылки со страницы и отправьте запрос на их постановку в очередь для анализа и передачи метаданных.

links = response.xpath( extract the links )
for link in links:
    yield Request(link, meta={'breadcrumbs': breadcrumbs})
person Steve    schedule 26.11.2015