如何在我的 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 蜘蛛代码中使用项目加载器?的主要内容,如果未能解决你的问题,请参考以下文章