将SQL中的列表与从API中提取的列表进行比较

时间:2018-08-29 09:36:29

标签: python sql api sqlite

我为安全MSSP工作,目前正在创建一个脚本,该脚本从我们的供应商之一的在线控制台中提取威胁数据,并将详细信息存储在SQLLite3数据库中以供以后使用。

我已经能够从控制台查询所有威胁并将其上传到数据库,但是由于我们正在测试控制台上处理3000多种威胁,因此脚本需要很长时间才能运行。

该脚本的基本轮廓如下:

  1. 查询控制台API以获取威胁的总页数。 (它们只能以200个为单位进行查询)
  2. 浏览页面并获取每页上的所有威胁散列并将其存储在列表中。
  3. 浏览此列表,并使用API​​查询每个哈希以获取威胁的完整详细信息并将其存储到SQL数据库中。

我现在正在尝试优化脚本,以便在连续运行时更快地运行脚本。

我试图实现一个函数,该函数查询SQL数据库并提取所有当前存储的哈希并将它们添加到列表中,然后我想将此列表与API列表进行比较。如果哈希显示在SQL列表中,请跳过查询该哈希的API。

我遇到的问题是,当我尝试比较列表时,每个哈希似乎都在SQL列表中找不到,因此将其添加到最终的哈希列表中,该列表用于上载到数据库。

查询数据库的功能:

def get_sql_threats():
sql_threats = []
c.execute("SELECT sha256 from threats")
r = c.fetchall()
for result in r:
    sql_threats.append(result)
return sql_threats

获取威胁并比较列表的功能:

def get_threat_hashes():
page_num = 1
total_pages = get_total_pages()
temp_list = []
threat_hashes = []   
sql_threats = get_sql_threats() 
while page_num <= total_pages:
    threat_list = get_threats(page_num)
    for y in threat_list:
        hash = y['sha256']
        temp_list.append(hash)
    for x in temp_list: 
        if x in sql_threats:
            print "skipping"
        elif x not in sql_threats:
            threat_hashes.append(x)
            print "Adding " + x

    page_num += 1
return threat_hashes

有人可以看到这些功能的任何问题吗? 抱歉,我想提供尽可能多的信息。

任何帮助将不胜感激。

谢谢, 克雷格

1 个答案:

答案 0 :(得分:0)

使用setset来代替,而不是创建列表,如果没有,则手动添加它们:

threatsFromAPI = set(range(10))  # populate from API

sqlThreats = set(range(3,10,2))  # populate from Server: sqlThreats = set(c.fetchall())

getFromThreadApi = threatsFromAPI - sqlThreats  # calculate diff between API and Sql

print("In API: ", threatsFromAPI)
print("In SQL: ", sqlThreats)    
print("Get new ones: ", getFromThreadApi)

输出:

In API:  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 
In SQL:  {9, 3, 5, 7} 
Get new ones:  {0, 1, 2, 4, 6, 8}

Doku set() && set() class。如果您可以一次性填写({翻页,可能不会翻页),也可以使用不可变的frozenset()