【问题标题】:Yield multiple items using scrapy使用 scrapy 生成多个项目
【发布时间】:2014-03-07 12:20:51
【问题描述】:

我正在从以下 URL 抓取数据:
http://www.indexmundi.com/commodities/?commodity=gasoline

有两个部分包含价格:墨西哥湾汽油期货日终结算价汽油每日价格

我想将这两个部分的数据作为两个不同的项目抓取。这是我写的代码:

if dailyPrice:
        item['description'] = u''.join(dailyPrice.xpath(".//h1/text()").extract())
        item['price'] = u''.join(dailyPrice.xpath(".//span/text()").extract())
        item['unit'] =  dailyPrice.xpath(".//div/p/text()").extract()[0].split(',')[-1]
        regex = re.compile("Source:(.*)",re.IGNORECASE|re.UNICODE)
        result = re.search(regex, u''.join(dailyPrice.xpath(".//div/p/text()").extract()))
        if result:
            item['source'] = result.group(1).strip()

        yield item


if futurePrice:
        item['description'] = u''.join(futurePrice.xpath(".//h1/text()").extract())
        item['price'] = u''.join(futurePrice.xpath(".//span/text()").extract())
        item['unit'] =  u''.join(futurePrice.xpath(".//div[2]/table//tr[1]/td/text()").extract())
        source = futurePrice.xpath(".//div[2]/table//tr[4]/td/a/text()").extract()
        if source:
            item['source'] = u' - '.join(source)
        else:
            item['source'] = ''

        yield item

我想知道这段代码是否可以正常工作,或者应该采取什么正确的方法来做到这一点?

【问题讨论】:

    标签: python-2.7 web-scraping web-crawler scrapy


    【解决方案1】:

    它应该可以正常工作。您可以根据需要从 parse 回调中生成任意数量的项目。只是一些注释:

    1. 在第二种情况下,最好先创建一个新项目,然后再使用旧项目。因为您永远不知道旧项目参考发生了什么。也许您正在覆盖并丢失以前的数据。

    2. 您可以为两个案例创建不同的项目类型。并且在管道中以不同的方式对待它们。

    【讨论】:

    • 不创建新项目的原因是两个项目需要共享一些字段值,例如 url 和几个更​​多字段。我在此代码上方某处设置这些字段的值,然后根据这两个 IF 条件和产生项设置其余字段的值。
    • 如果两个不同的项目共享相同的数据,使用copy.copy复制第一个项目然后更新它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多