Scrapy: последние несколько строк файла JL не отформатированы должным образом или обрезаны.Результаты разные на MAC и LINUX сервере - PullRequest
0 голосов
/ 02 февраля 2019

Некоторое время я использовал скрап для создания группы пауков.Я работаю над MAC (использую Scrapy в качестве док-контейнера), и все мои пауки работают отлично, и результат получается именно так, как я хочу.

Я использую конвейер, чтобы отформатировать его специально для приема ElasticSearch.Это все отлично работает на моем MAC.Точно такой же док-контейнер и код находятся на сервере 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.

Однако, когда я запускаю тот же сценарий для создания этого же файла на сервере Linux с использованием того же контейнера Scrapy Docker, вот как окончательно выглядит окончательный формат:

{"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.

Наконец, был еще один паук-скрап, который я запускал, который генерировал вверх27000 строк файла JL.У меня тоже была похожая проблема.Я закончил тем, что разбил это на двух пауков.Второй паук добавляет свои строки JL к предыдущему файлу JL пауков.Проблема решена, и с тех пор ее не было.Но именно этот, это всего 900 строк.Может ли это быть какая-то утечка памяти?

Мысли?

...