scrapy 多个项目类,里面有提取方法

scrapy multiple item classes with extract method inside them

声明一下:我不是一个有经验的程序员,不要生我的气…… 我正在探索 scrapy 的可能性(我有一些 Python 编程技能)。

抓取网站:假设我们可以从 opengraph(og:) 中提取一些信息,例如 'title'、'url' 和 'description',以及来自 schema.org 的其他信息,例如 'author',最后我们想要 'title'、'url'、'description' 和 'date' 可以从 "normal" 的 XPath 中提取HTML 只是如果 opengraph(og:) 和 schema.org.

不可用

我在单独的 .py 文件中创建了 3 个项目 classes OpengraphItem(Item)、SchemaItem(Item) 和 MyItem(Item)。 在每个 class 中会有一个提取函数来提取字段,就像这个例子:

class OpengraphItem(Item):
      title = Field()
      url = Field()
      description = Field()

      def extract(self, hxs):
            self.title = hxs.xpath('/html/head/meta[@property="og:title"]/@content').extract()
            self.url = hxs.xpath('/html/head/meta[@property="og:url"]/@content').extract()
            self.description = hxs.xpath('/html/head/meta[@property="og:description"]/@content').extract()

然后在spider代码中会这样调用extract函数:

def parse_item(self, response):
    hxs = HtmlXPathSelector(response)

    my_item = MyItem()
    item_opengraph = OpengraphItem()
    item_opengraph.extract(hxs)

     item_schema = SchemaItem()
     item_schema.extract(hxs)

      my_item['date']= hxs.xpath('/html/body//*/div[@class="reviewDate"]/span/time[@class="dtreviewed"]/@content').extract()

      my_item['title'] = item_opengraph.get('title', None)
      my_item['url'] = item_opengraph.get('url', None)
      my_item['description'] = item_opengraph.get('description', None)

      if my_item['url'] == None:
            my_item['url'] = response.url

      if my_item['title'] == None:
            my_item['title'] = hxs.xpath('/html/head/title/text()').extract()

      if my_item['description'] == None:
            my_item['description'] = hxs.xpath('/html/head/meta[@name="description"]/@content').extract()

      return my_item

这有意义吗? 在项目中创建提取方法是正确的 class?

我查看了其他问题: scrapy crawler to pass multiple item classes to pipeline - 我不知道只有一个 items.py 里面有多个不同的 class 是否正确。

and scrapy single spider to pass multiple item classes to pipeline - 我应该有一个 Itempipeline 吗?我不熟悉那些,但在 scrapy 文档中说它的用途,我认为它不适合这个问题。还有物品装载机?

我省略了部分代码。

It is rigth to have the created extract method inside items class?

这很不寻常。我不能说它是 "not right",因为代码仍然可以工作,但通常所有与页面结构相关的代码(例如选择器)都保留在 Spider 中。

项目加载器可能对您尝试做的事情有用,您一定要试一试。

另一件事,对项目字段的属性分配,如

  def extract(self, hxs):
        self.title = hxs [...]

将不起作用。 Scrapy Items 就像字典,你应该分配给例如self['title'].