Может ли scrapy пропустить ошибку, связанную с пустыми данными и сохранением данных? - PullRequest
0 голосов
/ 29 мая 2019

Я хочу очистить страницы продукта от его карты сайта, страница продуктов похожа, но не все они одинаковы.

например

Продукт A https://www.vitalsource.com/products/environment-the-science-behind-the-stories-jay-h-withgott-matthew-v9780134446400

Продукт B https://www.vitalsource.com/products/abnormal-psychology-susan-nolen-hoeksema-v9781259765667

мы можем видеть, что у продукта A есть субтитры, а у другого нет.

Так что я получаю ошибки, когда пытаюсь очистить все страницы продукта..

У меня такой вопрос, есть ли способ, позволяющий пауку пропустить ошибку из-за отсутствия данных?

Существует простой способ ее обойти.это не использует strip () Но мне интересно, есть ли лучший способ сделать работу.

import scrapy
import re
from VitalSource.items import VitalsourceItem
from scrapy.selector import Selector
from scrapy.spiders import SitemapSpider



class VsSpider(SitemapSpider):
    name = 'VS'
    allowed_domains = ['vitalsource.com']
    sitemap_urls = ['https://storage.googleapis.com/vst-stargate-production/sitemap/sitemap1.xml.gz']
    sitemap_rules = [
        ('/products/', 'parse_product'),
    ]
    def parse_product(self, response):
        selector = Selector(response=response)
        item = VitalsourceItem()
        item['Ebook_Title'] = response.css('.product-overview__title-header::text').extract()[1].strip
        item['Ebook_SubTitle'] = response.css("div.subtitle.subtitle-pdp::text").extract().strip
        print(item)
        return item

сообщение об ошибке

    item['Ebook_SubTitle'] = response.css("div.subtitle.subtitle-pdp::text").extract().strip
AttributeError: 'list' object has no attribute 'strip'

Ответы [ 3 ]

3 голосов
/ 29 мая 2019

Поскольку вам нужен только один субтитр, вы можете использовать get() с установкой значения по умолчанию для пустой строки. Это избавит вас от ошибок при применении функции strip() к пустому элементу.

item['Ebook_SubTitle'] = response.css("div.subtitle.subtitle-pdp::text").get('').strip()
0 голосов
/ 29 мая 2019

Вы можете проверить, возвращено ли значение перед извлечением:

if response.css("div.subtitle.subtitle-pdp::text"):
    item['Ebook_SubTitle'] = response.css("div.subtitle.subtitle-pdp::text").get().strip

Таким образом строка кода субтитра будет работать только в том случае, если будет возвращено значение ...

0 голосов
/ 29 мая 2019

В общем, scrapy не прекращает ползать, если обратные вызовы вызывают исключение. e.g.:

def start_requests(self):
    for i in range(10):
        yield Requst(
            f'http://example.org/page/{i}',
            callback=self.parse,
            errback=self.errback,
        )

def parse(self, response):
    # first page 
    if 'page/1' in response.request.url:
        raise ValueError()
    yield {'url': response.url}

def errback(self, failure): 
    print(f"oh no, failed to parse {failure.request}")

В этом примере будет сделано 10 запросов и 9 элементов будут очищены, но 1 потерпит неудачу и получит errback

В вашем случае вам нечего бояться - любой запрос, который не вызывает исключение, будет очищен, как и должен, для тех, которые это сделают, вы просто увидите трассировку исключения в вашем терминале / журналах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...