2015-11-30 4 views
0

Использование Scrapy У меня есть данные с сайта, который я хочу в json-форме, конечным результатом является то, что я хочу ПОСЛАТЬ эти данные в базу данных, используя rest api, поэтому он должен иметь определенные ключи в определенном форма.Scrapy json modifying array

Я пытаюсь получить данные в эту форму json; ЕДИНСТВЕННЫЙ массив может быть под атрибутом, все остальные должны быть от одного до одного ключей и значений.

{ 
"Event":{ 
"date":"2015-11-25", 
"threat_level_id":"1", 
"info":"TEST", 
"analysis":"0", 
"distribution":"0", 
"orgc":"Malware, Inc", 
"Attribute": [ 
{ 
"type":"md5", 
"category":"Payload delivery", 
"to_ids":true, 
"distribution":"3", 
"value":"35b759347aee663e36f5b91877749349"}, 
{"type":"url", 
"category":"Network activity", 
"to_ids":true, 
"distribution":"3", 
"value":"conf.f.360.cn"}, 
{ 
"type":"ip-dst", 
"category":"Network activity", 
"to_ids":true, 
"distribution":"3", 
"value":"1.1.1.1"}] 
} 
} 

* В массиве "Атрибут" может быть несколько элементов. Проблема, которую я получаю, - я не могу создать массив «Атрибут» для нескольких объектов, я не уверен, как добавлять многоуровневые типы, которые похожи и содержат одни и те же «ключи».

Это не работает ...

def parse_items(self, response): 
      self.log("Hi, this is an item page! %s" % response.url) 
      item = Website() 
      item["date"] = "current date" 
      item["threat_level_id"] = "1" 
      item["info"] = "Malware" 
      item["analysis"] = 0 
      item["distribution"] = 0 
      item["orgc"] = "Malware" 
      item["Attribute"] = {} 
      item["Attribute"]['type'] = "ip-dst" 
      item["Attribute"]["category"] ="Network activity" 
      item["Attribute"]["to-ids"] = True 
      item["Attribute"]["distribution"] = "3" 
      item["Attribute"]['ip'] = response.xpath('//*[@id="contacted- hosts"]//tr[1]/td[1]/text()').extract() 
      item["Attribute"]['type'] = "domain" 
      item["Attribute"]["category"] ="Network activity" 
      item["Attribute"]["to-ids"] = True 
      item["Attribute"]["distribution"] = "3" 
      item["Attribute"]['domain'] = response.xpath('//*[@id="dns-requests"]//a/text()').extract() 
      item["Attribute"]['type'] = "md5" 
      item["Attribute"]["category"] ="Payload delivery" 
      item["Attribute"]["to-ids"] = True 
      item["Attribute"]["distribution"] = "3" 
      item["Attribute"]['md5'] = response.xpath('//*[contains(text(), "MD5")]/following-sibling::dd[1]/text()')[0].extract() 

Это возвращает перемешивать как этот

[ 
[ 
[ 
{"info": "Website", 
"orgc": "Malware", 
"analysis": 0, 
"Attribute": {"category": "Payload delivery", 
"domain": ["anatolio69.no-ip.biz", "lucidspung.com", "swashsepal.com"],  #Gotta get this array to a one to one value as well 
"to-ids": true, 
"ip": ["190.127.234.120"], 
"distribution": "3", 
"type": "md5", 
"md5": "28e59d011c6103b5f5330b5ad042bdba"}, 
"date": "current date", 
"distribution": 0, 
"threat_level_id": "1"}, 

Как я разбить массивы, «ф» и «домен» возвращение и получить «Атрибут», чтобы держать все те же значения, как это -

{ 
"Event":{ 
"date":"2015-11-25", 
"threat_level_id":"1", 
"info":"TEST", 
"analysis":"0", 
"distribution":"0", 
"orgc":"Malware, Inc", 
"Attribute": [ 
{ 
"type":"md5", 
"category":"Payload delivery", 
"to_ids":true, 
"distribution":"3", 
"value":"35b759347aee663e36f5b91877749349"}, 
{"type":"url", 
"category":"Network activity", 
"to_ids":true, 
"distribution":"3", 
"value":"conf.f.360.cn"}, 
{ 
"type":"ip-dst", 
"category":"Network activity", 
"to_ids":true, 
"distribution":"3", 
"value":"1.1.1.1"}] 
} 
} 

Я оценил бы это ... Я действительно не знаю, как начать с этого.

ответ

1

Attribute ключ в JSON должен содержать массив словарей. Сначала необходимо инициализировать массив, а затем присвоить значения, указанные ниже:

item["Attribute"] = [] 
item["Attribute"].append({'type':"ip-dst"}) 
item["Attribute"][0]["category"] ="Network activity" 
item["Attribute"][0]["to-ids"] = True 
item["Attribute"][0]["distribution"] = "3" 
item["Attribute"][0]['ip'] = response.xpath('//*[@id="contacted- hosts"]//tr[1]/td[1]/text()').extract() 

item["Attribute"].append({'type':"domain"}) 
item["Attribute"][1]["category"] ="Network activity" 
item["Attribute"][1]["to-ids"] = True 
item["Attribute"][1]["distribution"] = "3" 
item["Attribute"][1]['domain'] = response.xpath('//*[@id="dns-requests"]//a/text()').extract() 

item["Attribute"].append({'type':"md5"}) 
item["Attribute"][2]["category"] ="Payload delivery" 
item["Attribute"][2]["to-ids"] = True 
item["Attribute"][2]["distribution"] = "3" 
item["Attribute"][2]['md5'] = response.xpath('//*[contains(text(), "MD5")]/following-sibling::dd[1]/text()')[0].extract() 
+0

Большое спасибо! Это работает. Не уверен, что бы я сделал без переполнения стека. – Dpitt1968