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']
.
声明一下:我不是一个有经验的程序员,不要生我的气…… 我正在探索 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 是否正确。
我省略了部分代码。
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']
.