如何在我的 Scrapy 蜘蛛代码中使用项目加载器?

Posted

技术标签:

【中文标题】如何在我的 Scrapy 蜘蛛代码中使用项目加载器?【英文标题】:How to use a Item loader in my Scrapy spider code? 【发布时间】:2015-11-13 20:20:22 【问题描述】:

我已经慢慢创建了以下(工作)Scrapy 蜘蛛,它从新闻网站检索新闻文章和一些其他数据。我遇到的问题是其中一项中有很多空格。我在 Scrapy 帮助文件和 *** (How To Remove White Space in Scrapy Spider Data) 中发现我应该使用项目加载器。我不知道如何将项目加载器集成到我现有的代码中。这段代码是从 Scrapy 教程中的标准爬虫演变而来的。对我来说,与项目加载器相关的代码很难与教程中解释的内容结合起来。

import scrapy
from datetime import timedelta, date
from nos.items import NosItem


def daterange(start_date, end_date):
        for n in range(int ((end_date - start_date).days)):
            yield start_date + timedelta(n)

start_date = date(2015, 8, 19)
end_date = date(2015, 8, 20)
nos_urls = []
for single_date in daterange(start_date, end_date):
    nos_urls.append(single_date.strftime("http://nos.nl/nieuws/archief/%Y-%m-%d"))


class NosSpider(scrapy.Spider):
    name = "nos"
    allowed_domains = ["nos.nl"]

    start_urls = nos_urls

    def parse(self, response):
        for sel in response.xpath('//*[@id="archief"]/ul/li'):
            item = NosItem()
            item['name'] = sel.xpath('a/@href').extract()[0]
            item['date'] = sel.xpath('a/div[1]/time/@datetime').extract()[0]
            item['desc'] = sel.xpath('a/div[@class="list-time__title link-hover"]/text()').extract()[0]
            url = response.urljoin(item['name'])
            request = scrapy.Request(url, callback=self.parse_dir_contents)
            request.meta['item'] = item
            yield request


    def parse_dir_contents(self, response):
        for sel in response.xpath('//*[@id="content"]/article'):
            item = response.meta['item']
            textdata = sel.xpath('section//text()').extract()
            textdata = " ".join(textdata)
            #textdata = textdata.replace("\n", "")
            #textdata = textdata.strip(' \t\n\r\\n')
            item['article'] = textdata
            yield item

这是我目前得到的 JSON 导出示例:

"date": "2015-08-19T15:43:26+0200", "article": "\n        Man met bijl aangehouden \n        \n         \n          De man zou zijn vrouw hebben aangevallen met een bijl en dreigde zichzelf iets aan te doen.\n         Video afspelen \n                              00:34\n                         De politie heeft in Schijndel een man aangehouden die verdacht wordt van huiselijk geweld. De man had zichzelf in een woning opgesloten en dreigde zichzelf iets aan te doen. [text cut off]", "name": "/artikel/2052794-politie-in-schijndel-heeft-handen-vol-aan-verdachte-huiselijk-geweld.html", "desc": "Politie in Schijndel heeft handen vol aan verdachte huiselijk geweld"

文章项目包含空格和许多我想删除的\n。

我相信这些功能将有助于解决问题:

l.default_input_processor = MapCompose(lambda v: v.split(), replace_escape_chars)
l.default_output_processor = Join()

【问题讨论】:

【参考方案1】:

您可以在提取中只使用unicode.strip()

textdata = " ".join(map(unicode.strip,textdata))

这会从您的数据中删除所有空格,并且您可以使文章内容更清晰。

【讨论】:

结果对我来说有点奇怪` M a n m e t b i j l a n g e h o u d e n ` (...) ;-) 好吧,如果您的textdata 只是一个字符串而不是字符串数组,那么" ".join 方法会在字符之间插入空格。你当然也得看看这个。我用过你的蜘蛛,我得到了字符串数组——不是一个字符串。 对我来说,这个答案似乎很完美,它甚至可以用 \" 转义字符串中的引号,这很好:-)。我还制作了一个自定义管道以将我的 JSON 导出为 utf-8,使用 unicode.strip 会否定自定义管道的需要吗? @GHajba 这对我来说真的很尴尬......我真的需要休息一下,喝杯咖啡。

以上是关于如何在我的 Scrapy 蜘蛛代码中使用项目加载器?的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy - 如何启动同一个蜘蛛进程的多个实例?

使用项目加载器scrapy获取键中的值

如何在单个 Scrapy 项目中为不同的蜘蛛使用不同的管道

如何使用 PyCharm 调试 Scrapy 项目

scrapy 项目加载器返回列表不是单个值

Scrapy是什么(未完待续)