项目输出的顺序顺序| Scrapy

时间:2017-06-19 18:06:34

标签: scrapy web-crawler scrapinghub

我正在使用ScrapingHub API,并使用shub来部署我的项目。但是,项目结果如下所示:

Example Item Output

不幸的是,我按以下顺序需要它 - >标题,发布日期,描述,链接。如何让输出完全符合每个项目类的顺序?

以下是我的蜘蛛的简短样本:

import scrapy

from scrapy.spiders import XMLFeedSpider
from tickers.items import tickersItem
class Spider(XMLFeedSpider):
    name = "Scraper"
    allowed_domains = ["yahoo.com"]
    start_urls = ('https://feeds.finance.yahoo.com/rss/2.0/headline?s=ABIO,ACFN,AEMD,AEZS,AITB,AJX,AU,AKERMN,AUPH,AVL,AXPW
                  'https://feeds.finance.yahoo.com/rss/2.0/headline?s=DRIO
                  'https://feeds.finance.yahoo.com/rss/2.0/headline?s=IDXG,IMMU,IMRN,IMUC,INNV,INVT,IPCI,INPX,JAGX,KDMN,KTOV,LQMT
                  )
    itertag = 'item'

    def parse_node(self, response, node):
        item = {}
        item['Title'] = node.xpath('title/text()',).extract_first()
        item['Description'] = node.xpath('description/text()').extract_first()
        item['Link'] = node.xpath('link/text()').extract_first()
        item['PublishDate'] = node.xpath('pubDate/text()').extract_first()
        return item

此外,这是我附加的items.py文件,它与我的蜘蛛的顺序相同,所以我不知道为什么输出不按顺序。

Items.py:

import scrapy

class tickersItem(scrapy.Item):
    Title = scrapy.Field()
    Description = scrapy.Field()
    Link = scrapy.Field()
    PublishDate = scrapy.Field()

我的代码的语法是为了项目和蜘蛛文件,我不知道如何解决它。我是一名新的python程序员。

1 个答案:

答案 0 :(得分:1)

您可以使用collections.OrderedDict,而不是在items.py中定义项目。只需导入collections模块,然后在parse_node方法中更改行:

item = {}

到行:

item = collections.OrderedDict()

或者,如果您想要定义项目,可以使用此answer中概述的方法。然后,您的items.py将包含此代码:

from collections import OrderedDict

from scrapy import Field, Item
import six

class OrderedItem(Item):
    def __init__(self, *args, **kwargs):
        self._values = OrderedDict()
        if args or kwargs:  # avoid creating dict for most common case
            for k, v in six.iteritems(dict(*args, **kwargs)):
                self[k] = v

class tickersItem(OrderedItem):
    Title = Field()
    Description = Field()
    Link = Field()
    PublishDate = Field()

然后,您还应该修改您的蜘蛛代码以相应地使用此项目。请参阅documentation