使用Scrapy从表中获取数据,每页不同的行顺序

时间:2015-07-28 14:09:05

标签: python scrapy

所以我的scrapy工作非常好。它从页面中抓取数据,但我遇到的问题是有时页面的表顺序不同。例如,它到达的第一页:

Row name        Data
Name 1          data 1
Name 2          data 2

它抓取的下一页可能会使订单完全不同。其中Name 1是第一行,任何其他页面可能是第3行,第4行等。行名称始终相同。我想这可能是两种不同的方式中的一种,我不确定哪种方法可行或哪种更好。

第一个选项,使用一些if语句来查找我需要的行,然后获取以下列。这似乎有点乱,但可以奏效。

第二个选项,无论顺序如何,都抓住表中的所有数据并将其放在dict中。这样,我可以根据行名称获取所需的数据。这似乎是最干净的方法。

是否有第三种选择或更好的方法?

这是我的代码,以防它有用。

class pageSpider(Spider):
    name = "pageSpider"
    allowed_domains = ["domain.com"]
    start_urls = [
        "http://domain.com/stuffs/results",
    ]
    visitedURLs = Set()

    def parse(self, response):
        products = Selector(response).xpath('//*[@class="itemCell"]')
        for product in products:
            item = PageScraper()
            item['url'] = product.xpath('div[2]/div/a/@href').extract()[0]
            urls = Set([product.xpath('div[2]/div/a/@href').extract()[0]])
            print urls
            for url in urls:
                if url not in self.visitedURLs:
                    request = Request(url, callback=self.productpage)
                    request.meta['item'] = item
                    yield request

    def productpage(self, response):
        specs = Selector(response).xpath('//*[@id="Specs"]')
        item = response.meta['item']
        for spec in specs:
            item['make'] = spec.xpath('fieldset[1]/dl[1]/dd/text()').extract()[0].encode('utf-8', 'ignore')
            item['model'] = spec.xpath('fieldset[1]/dl[4]/dd/text()').extract()[0].encode('utf-8', 'ignore')
            item['price'] = spec.xpath('fieldset[2]/dl/dd/text()').extract()[0].encode('utf-8', 'ignore')
        yield item

productpage中的xpath可以包含与我需要的数据不对应的数据,因为订单已更改。

编辑: 我正在尝试dict方法,我认为这是最佳选择。

def productpage(self, response):
    specs = Selector(response).xpath('//*[@id="Specs"]/fieldset')
    itemdict = {}
    for i in specs:
        test = i.xpath('dl')
        for t in test:
            itemdict[t.xpath('dt/text()').extract()[0]] = t.xpath('dd/text()').extract()[0]
        item = response.meta['item']
    item['make'] = itemdict['Brand']
    yield item

1 个答案:

答案 0 :(得分:0)

This seems like the best and cleanest approach (using dict)

def productpage(self, response):
    specs = Selector(response).xpath('//*[@id="Specs"]/fieldset')
    itemdict = {}
    for i in specs:
        test = i.xpath('dl')
        for t in test:
            itemdict[t.xpath('dt/text()').extract()[0]] = t.xpath('dd/text()').extract()[0]
        item = response.meta['item']
    item['make'] = itemdict['Brand']
    yield item