python - Scrapy 如何使用 itemloader 填充空项目?
问题描述
我正在尝试抓取电子商务网站。我的目标是获取卖家的信息。
我使我的代码比实际代码更简单
当我的蜘蛛访问一个没有卖家数据的页面时,我的项目字段'company'
并被'owner'
填充为 None。是的,我的字段填充为 None 没关系。但我的问题是我的领域刚刚消失!
# My spider
class GmarketSpider(CrawlSpider):
name = 'gmarket'
allowed_domains = ['gmarket.co.kr']
start_urls = ['http://www.gmarket.co.kr/']
rules = (
Rule(callback='parse_item', follow=True),
)
def parse_item(self, response):
loader = GmarketLoader(item=GmarketItem(), response=response)
loader.add_xpath('company', '//something')
loader.add_xpath('owner', '//something')
return loader.load_item()
# My item
class GmarketItem(scrapy.Item):
company = scrapy.Field()
owner = scrapy.Field()
# My loader
class GmarketLoader(ItemLoader):
default_input_processor = Identity()
default_output_processor = TakeFirst()
# My pipeline
class InvalidPagePipeline(object):
def process_item(self, item, spider):
if item['owner'] is None: # This line gives me an error
raise DropItem()
else:
return item
请参阅我的管道代码。我检查了页面是否有效的 item['owner'] 的值。如果页面无效,那么我预计 item['owner'] 填充为 None。但这给了我一个错误,因为“所有者”密钥完全消失了...
这是错误信息
2019-11-05 20:22:57 [scrapy.core.scraper] ERROR: Error processing {'market': ['Gmarket'],
'url': ['https://sslmember2.gmarket.co.kr/FindPW/FindPW?targetUrl=http%3a%2f%2fmyg.gmarket.co.kr%2f']}
Traceback (most recent call last):
File "d:\python projects\sellerinfoscraper\venv\lib\site-packages\twisted\internet\defer.py", line 654, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "D:\Python Projects\SellerInfoScraper\sellerInfo\sellerInfo\pipelines.py", line 14, in process_item
if item['owner'] is None:
File "d:\python projects\sellerinfoscraper\venv\lib\site-packages\scrapy\item.py", line 91, in __getitem__
return self._values[key]
KeyError: 'owner'
它说KeyError: 'owner'
如何使用 ItemLoader 填充具有 None 值的项目字段?我知道我可以在不使用 ItemLoader 的情况下解决此问题,但我不想使用此功能。
解决方案
默认情况下,scrapy 的 ItemLoader 会丢弃所有None
字段
要解决此问题,您需要确保加载器将使用其他值,例如空字符串:""
from scrapy.loader import ItemLoader
from scrapy.loader.processors import Compose
def default_action(value):
return value or ''
class MyLoader(ItemLoader):
default_output_processor = Compose(default_action)
例如,它的行为如下:
>>> l = MyLoader()
>>> l.add_value('company', None)
>>> l.load_item()
{}
>>> l.add_value('company', '')
>>> l.load_item()
{'company': ['']}