scrapy爬行类树

时间:2015-11-26 07:29:12

标签: python scrapy scrapy-spider

我是python的新手所以请耐心等待 我需要抓取一个网站(在线商店)以获取类别树,这意味着在页面树中导航,并且还保留当前子子类别的父类以生成清洁类别结构。 因此,请想象一下在线商店如何记录它的产品类别

基本上我需要使用逗号分隔的字符串获取带有树节点的项目,如下所示:

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菜单中获取类别
  

ID = “猫”

来自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个子子类别。 另外,我需要能够存储curent“branch”(Maincat-> SubCat1-> SubSubcat1-> ...)并且只返回它。

那么我该如何根据自己的需要调整这个脚本呢?

1 个答案:

答案 0 :(得分:0)

遗憾的是,我无法在myshop.com网站上找到你问题中的任何x路径。但是,我认为您可以重组您的项目以实现您想要的结果。我建议只有一个解析例程,因为每个页面都可以有链接,需要为其类别进行刮除。您需要在解析例程中使用以下部分:

提取此页面的类别。将类别添加到现有元数据并生成元数据。

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})