我一直在使用scrapy建立一群蜘蛛。我正在使用MAC(将Scrapy作为docker容器运行),并且我所有的蜘蛛都运行良好,并且输出完全符合我的要求。
我正在使用管道将其格式化,专门用于ElasticSearch摄取。所有这些都可以在我的MAC上完美运行。完全相同的Docker容器和代码位于Linux服务器上,并且始终存在问题。
import json
from scrapy.exporters import JsonItemExporter
class RandomNamePipeline(object):
def __init__(self):
self.file = open('randomname.jl', 'w')
self.exporter = JsonItemExporter(self.file, encoding="utf-8", ensure_ascii=False)
def process_item(self, item, spider):
line = '{"index":{"_index":"XXX","_type":"XXX"}}' + "\n" + json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
注意:“ XXX”只是替换该项目的敏感数据,实际上并不存在。索引和类型名称是一个单词,没有空格或特殊字符,因此我认为这不是问题。
这是最终结果格式:
{"index":{ "_index”:”XXX”,”_type”:”XXX”}}
{"site_phn_nbr": [“000000”], "agcy_ofc_type_nm": ["XXX"], "site_nm": [“XXX”], "site_id": ["000000"], "ref_st": "000000", "org_unit_id": ["000000"], "cnty_cd": ["000000"], "org_unit_name": ["XXX"], "str_city_nm": ["XXX"], "st_cd": ["000000"], "str_dlvy_adr": ["XXX"], "str_st_abr": ["XXX"], "ref_cnty": "000000", "site_phn_ext": [""], "str_zip_cd": ["000000"], "agcy_abr": ["XXX"], "cnty_nm": ["XXX"]}
{"index":{ "_index”:”XXX”,”_type”:”XXX”}}
{"site_phn_nbr": ["000000"], "agcy_ofc_type_nm": ["XXX"], "site_nm": ["XXX"], "site_id": ["000000"], "ref_st": "000000", "org_unit_id": ["000000"], "cnty_cd": ["000000"], "org_unit_name": ["XXX"], "str_city_nm": ["XXX"], "st_cd": ["000000"], "str_dlvy_adr": ["XXX"], "str_st_abr": ["XXX"], "ref_cnty": "000000", "site_phn_ext": [""], "str_zip_cd": ["000000"], "agcy_abr": ["XXX"], "cnty_nm": ["XXX"]}
注意:所有000000和XXX都只是替换敏感数据,我不怀疑这些字段中的值是可疑的,因为它始终是文件的最后几行。
因此,我本地MAC上的同一脚本已完成并正确设置了格式。我的最终JSON文件中大约有900行。它实际上是一个.jl(Json Line)文件。这可以完美地工作,并且可以为ElasticSearch正确格式化。
但是,当我使用相同的Scrapy Docker容器在Linux服务器上运行相同的脚本来生成相同的文件时,最终格式始终是这样的:
{"index":{ "_index”:”XXX”,”_type”:”XXX”}}
{"site_phn_nbr": [“000000”], "agcy_ofc_type_nm": ["XXX"], "site_nm": [“XXX”], "site_id": ["000000"], "ref_st": "000000", "org_unit_id": ["000000"], "cnty_cd": ["000000"], "org_unit_name": ["XXX"], "str_city_nm": ["XXX"], "st_cd": ["000000"], "str_dlvy_adr": ["XXX"], "str_st_abr": ["XXX"], "ref_cnty": "000000", "site_phn_ext": [""], "str_zip_cd": ["000000"], "agcy_abr": ["XXX"], "cnty_nm": ["XXX"]}
{"index":{ "_index”:”XXX”,”_type”:”XXX”}}
{"site_phn_nbr": ["000000"], "agcy_ofc_type_nm": ["XXX"], "site_nm": ["XXX"], "site_id": ["000000"], "ref_st": "000000", "org_unit_id": ["000000"], "cnty_cd": ["000000"], "org_unit_name": ["XXX"], "str_city_nm": ["XXX"], "st_cd": ["000000"], "str_dlvy_adr": ["XXX"], "str_st_abr": ["XXX"], "ref_cnty": "000000", "site_phn_ext": [""], "str_zip_cd": ["000000"], "agcy_abr": ["XXX"], "cnty_nm": ["XXX"]}
000", "org_unit_id": ["000000"], "cnty_cd": ["000000"], "org_unit_name": ["XXX"], "str_city_nm": ["XXX"], "st_cd": ["000000"], "str_dlvy_adr": ["XXX"], "str_st_abr": ["XXX"], "ref_cnty": "000000", "site_phn_ext": [""], "str_zip_cd": ["000000"], "agcy_abr": ["XXX"], "cnty_nm": ["XXX"]}
XX"], "site_nm": ["XXX"], "site_id": ["000000"], "ref_st": "000000", "org_unit_id": ["000000"], "cnty_cd": ["000000"], "org_unit_name": ["XXX"], "str_city_nm": ["XXX"], "st_cd": ["000000"], "str_dlvy_adr": ["XXX"], "str_st_abr": ["XXX"], "ref_cnty": "000000", "site_phn_ext": [""], "str_zip_cd": ["000000"], "agcy_abr": ["XXX"], "cnty_nm": ["XXX"]}
最后两行将被截断或截断,并且也没有我在管道中设置的前缀:
{"index":{"_index":"XXX","_type":"XXX"}}
我还要补充一点,截断或截止有时会在不同的地方。
这使我认为管道中正在进行格式化,或者MAC和Linux之间存在格式化错误。但是由于我正在运行完全相同的Docker容器,所以我无所适从为什么会在完全相同的代码库上发生这种情况。可能是内存问题,还是在写入之前编译所有数据时出现问题?我想认为这将是一个问题,因为代码在我的MAC上正常运行,但始终在我的Linux服务器上运行。
最后,还有我正在运行的另一台抓图蜘蛛,它生成了多达27,000行的JL文件。我也有类似的问题。我最终将其分为两个蜘蛛。第二个蜘蛛网将其JL行附加到先前的蜘蛛网JL文件中。问题已解决,此后再也没有问题。但是这个特殊的,只有900行。这可能是某种内存泄漏吗?
有想法吗?