Я использую 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()