Удаление нулевого значения из очищенных данных без удаления всего - PullRequest
0 голосов
/ 01 мая 2020

Я использую scrapy для очистки данных с сайта New York Times, но очищенные данные заполнены нулевыми значениями. Я не хочу этого, чтобы очистить свои извлеченные данные. Я изменил сценарий pipe.py. и это сработало, когда я извлекаю одно или два значения, оно работает как шарм. но когда я извлекаю несколько значений и поскольку в каждой извлеченной строке есть хотя бы одно нулевое значение, алгоритм в итоге удаляет почти все мои данные. Есть ли способ, чтобы предотвратить это?

вот мой файл паука:

# -*- coding: utf-8 -*-
import scrapy
import re
from config_spider.items import Item
from urllib.parse import urljoin, urlparse

def get_real_url(response, url):
    if re.search(r'^https?', url):
        return url
    elif re.search(r'^\/\/', url):
        u = urlparse(response.url)
        return u.scheme + url
    return urljoin(response.url, url)

class ConfigSpider(scrapy.Spider):
    name = 'config_spider'

    def start_requests(self):
        yield scrapy.Request(url='https://www.nytimes.com/', callback=self.parse_list)

    def parse_list(self, response):
        prev_item = response.meta.get('item')
        for elem in response.css('div'):
            item = Item()
            item['title'] = elem.css('h2::text').extract_first()
            item['date'] = elem.css('time::text').extract_first()
            item['excerpt'] = elem.css('.e1n8kpyg0::text').extract_first()
            item['author'] = elem.css('.e1god9m10::text').extract_first()
            item['categories'] = elem.css('.css-kh29da::text').extract_first()
            item['tags'] = elem.css('.css-1oxvs31::text').extract_first()
            item['link'] = elem.css('a::attr("href")').extract_first()
            item['published_at'] = elem.css('time::text').extract_first()
            item['source_url'] = elem.css('img::attr("src")').extract_first()
            item['caption'] = elem.css('img::attr("alt")').extract_first()
            if prev_item is not None:
                for key, value in prev_item.items():
                    item[key] = value
            yield item




вот мой файл piplines:

import os
from pymongo import MongoClient

mongo = MongoClient(
    host=os.environ.get('CRAWLAB_MONGO_HOST') or 'localhost',
    port=int(os.environ.get('CRAWLAB_MONGO_PORT') or 27017),
    username=os.environ.get('CRAWLAB_MONGO_USERNAME'),
    password=os.environ.get('CRAWLAB_MONGO_PASSWORD'),
    authSource=os.environ.get('CRAWLAB_MONGO_AUTHSOURCE') or 'admin'
)
db = mongo[os.environ.get('CRAWLAB_MONGO_DB') or 'test']
col = db[os.environ.get('CRAWLAB_COLLECTION') or 'test']
task_id = os.environ.get('CRAWLAB_TASK_ID')

class ConfigSpiderPipeline(object):
    def process_item(self, item, spider):
        item['task_id'] = task_id
        if col is not None:
            if any(item.values()):
                col.save(item)
                return item
            else:
                raise DropItem()



вот мои пункты файл:

import scrapy


class Item(scrapy.Item):
    _id = scrapy.Field()
    task_id = scrapy.Field()
    ts = scrapy.Field()
    title = scrapy.Field()
    date = scrapy.Field()
    excerpt = scrapy.Field()
    author = scrapy.Field()
    categories = scrapy.Field()
    tags = scrapy.Field()
    link = scrapy.Field()
    published_at = scrapy.Field()
    source_url = scrapy.Field()
    caption = scrapy.Field()



...