Scrapy Как я могу заполнить пустые предметы с помощью itemloader? - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь почистить сайт электронной коммерции. Моя цель - получить информацию о продавцах.

Я сделал свой код проще, чем фактический код

Когда мой паук посетил страницу, на которой не было данных продавца, поля моего товара 'company' и 'owner' были заполнены Нет. И да, это нормально, что мои поля заполнены 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

Пожалуйста, посмотрите мой код конвейера. Я проверил значение элемента ['owner'], является ли страница действительной или нет. Если страница недействительна, то я ожидал, что элемент ['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'

Какя могу заполнить поля элемента значением None, используя ItemLoader? Я знаю, что могу решить эту проблему без использования ItemLoader, но я не хочу использовать эту функцию.

...