跳到主要内容

23 篇博文 含有标签「python」

查看所有标签

需求介绍

从网上获取目标网站的数据一般通过网络爬虫的方式,但是这种方式往往可能效率比较低,而且有些网站可能会限制爬虫,比如著名的Github,当通过API爬虫的方式获取数据的时候,Github官方对爬虫速率进行了限制,超过了这个速率的爬虫会被限制,同时Github官方还要求提供Github用户验证等等,这些限制无形中都加大了我们爬虫的难度,但是其实我们还可以通过直接下载Github仓库的方式来获取数据,这种方式比爬虫要更加方便快捷,但是下下来的文件中很多是文件夹或者不符合条件的文件,我们该如何快速的通过python脚本将这些文件提取出来呢?下面就是我们要介绍的使用python递归遍历目标路径下的所有文件。

实现思路

  1. 导入操作json和文件的模块,并定义最终存储的变量。
import os
import json
target_json = []
  1. 定义递归函数,接收路径作为参数,遍历路径中的每一个item,并判断其为文件夹还是文件,文件夹则投入继续递归,文件则读取文件中的json数据并存储到指定变量中。
def getTarget(dir):
temp = os.listdir(dir)
for t in temp:
if (os.path.isfile(dir + '/' + t)):
print('找到了',t)

for line in open(dir + '/' + t):
# print(line)
line=line.strip('\n')
line = json.loads(line)
target_json.append(line)
# with open(dir + '/' + t) as f:
# line = f.readline()
# while line:
# target_json.append(line)
# print(line)
else:
getTarget(dir + '/' + t)

getTarget('./crates.io-index-master')
  1. 将指定变量中的数据存储为json文件,方便后续使用。
json_str = json.dumps(target_json)
with open('target_json.json', 'w') as json_file:
json_file.write(json_str)

总结

获取有代码仓库的网站的数据,不一定要使用爬虫,有时候直接从代码仓库中下载数据并使用脚本进行处理,无论是从获取的速度还是精度都要更高。


Justinpython阅读需 2 分钟

一、从GitHub Advisory上获取Rust漏洞数据的方法

执行下面的语句即可:

python github_advisory_rust_vulnerability_first.py

增量更新方法

执行下面的语句即可:

python github_advisory_rust_update.py

二、获取Cargo的第三方依赖数据的方法

执行下面的程序

python3 Get_Cargo_First.py
python3 clean_dataset.py

将cargo数据集:cargo_dependency_datasets.json

增量更新的方法

首先执行下面的语句:

python3 Get_Cargo_First.py

接着执行下面的语句:

python3 cargo_update.py

最后将产生这样的数据集:cargo_dependency_datasets.json 和 cargo_hashtable.json

三、从Rust官方维护的漏洞数据库中获取数据的思路

下面是Rust官方维护的漏洞数据库对应的网址:

https://rustsec.org/

下面是Rust官方维护的漏洞数据库对应的Github仓库的地址:

https://github.com/RustSec/advisory-db

下面是仓库API对应的地址:

https://api.github.com/repos/rustsec/advisory-db/contents

下面是API使用的参考文档:

https://docs.github.com/en/rest/reference/repos#get-repository-content

一、找到所有的漏洞地址

  1. 要考虑到仓库中的两个入口点:

    • crates
    • rust

crates对应的url是:

https://api.github.com/repos/rustsec/advisory-db/contents/crates?ref=main

rust对应的url是:

https://api.github.com/repos/rustsec/advisory-db/contents/rust?ref=main

  1. 找到两个入口点的所有的元素对应的md文档

以rust为出发点,找到的每一个元素的URL项的URL,是每一个漏洞对应的URL。

以crates为出发点,找到每一个元素对应的URL项的URL,也是每一个漏洞对应的URL。

  1. 将所有的url构造一个URLS为最终的url集合。

  2. 向URLS中的每一个URL发起请求,将其中的content值进行base64解码,然后通过正则解析的方式获取关键信息,其中id作为key,然后整个元素作为value。

四、RustSec数据获取与更新

  1. 爬取RustSec数据的方法,只需运行下面的语句。
python3 rustsec_crawler.py

将输出 RustSec_Dataset.json 与 RustSec_HashTable.json

  1. 增量更新的方法
python3 rustsec_update.py

将更新 RustSec_Dataset.json 与 RustSec_HashTable.json


JustinPython阅读需 2 分钟

现在有一个文件夹,文件夹中有几百个markdown文件,我们想在每一个文件的第二行和第三行,分别添加date和title属性。

python如何读取markdown文件

我们只需使用open函数即可,但是在解码格式上年一定要采用UTF-8,否则会报错

如何获取文件的创建时间

t = os.path.getmtime(filePath + '\\' + i)

如何得到文件指定行的内容(通过linecache这个包)

import linecache
categories_add = 'categories: ' + linecache.getline(filePath + '\\' + i, 5).strip()[2:]

全部代码

import os
import time
import linecache
filePath = 'G:\HEXO\添加文件名和时间\\test'
def TimeStampToTime(timestamp):
timeStruct = time.localtime(timestamp)
return time.strftime('%Y-%m-%d',timeStruct)
for i in os.listdir(filePath):
print(i)
t = os.path.getmtime(filePath + '\\' + i)
print(TimeStampToTime(t))
file = open(filePath + '\\' + i, "r",encoding='utf-8')

text = file.read()
# print(text)
content_add = i[:-3]
text_add = TimeStampToTime(t)
pointer = text.find("date:")
pos = text.find("title:")

categories_add = 'categories: ' + linecache.getline(filePath + '\\' + i, 5).strip()[2:]
print(categories_add)

if pointer != -1 & pos != -1:
# text = text[:pointer+6] + text_add + text[pointer+6:]
# text = text[:pos+7] + content_add + text[pos+7:]
tagP = text.find("tags:")
text = text[:tagP] + categories_add + '\n' + text[tagP:]

file = open(filePath + '\\' + i, "w",encoding='utf-8')
file.write(text)
file.close()
# 下面的是写入标题

# print(i[:-3])
# file = open(filePath + '\\' + i, "r",encoding='utf-8')

# content = file.read()
# content_add = i[:-3]
# pos = content.find("title:")
# if pos != -1:
# content = content[:pos+6] + content_add + content[pos+6:]
# file = open(filePath + '\\' + i, "w")
# file.write(content)
# file.close()

Justinpython阅读需 2 分钟

1. 提取数据

# @time :2020-5-12
import openpyxl
import re

# 创建一个excel workbook对象
book = openpyxl.Workbook()
# 产生一个sheet
sh = book.active
# 修改当前sheet标题为 漏洞数据信息表
sh.title = '特殊文本信息表'
# 根据名称获取某个sheet对象
sh = book['特殊文本信息表']

# 标记
flag = 1

# 导入我们的xlsx文件
wb = openpyxl.load_workbook("vig_all.xlsx")

# 打开具体的某一个表
ws = wb.get_sheet_by_name("Sheet")

# cve列
cve_column = ws['C']

# desciprtion列
des_column = ws['G']

# 遍历每一个CVE编号
for i in range(len(cve_column)):
# print(cve_column[i].value)
try:
if bool(re.search(r"\** REJECT \**",des_column[i].value)):
print(des_column[i].value)
sh['A' + str(flag)] = cve_column[i].value
sh['B' + str(flag)] = des_column[i].value
flag = flag + 1
except Exception :
pass


book.save("特殊文本.xlsx")




print("---运行结束---")

2. 数据去重

# @time :2020-5-12
import openpyxl
import re

# 创建一个excel workbook对象
book = openpyxl.Workbook()
# 产生一个sheet
sh = book.active
# 修改当前sheet标题为 漏洞数据信息表
sh.title = '特殊文本信息表'
# 根据名称获取某个sheet对象
sh = book['特殊文本信息表']

# 标记
flag = 1
# 导入我们的xlsx文件
wb = openpyxl.load_workbook("特殊文本.xlsx")

# 打开具体的某一个表
ws = wb.get_sheet_by_name("特殊文本信息表")

# cve列
cve_column = ws['A']

# 特殊文本列
des_column = ws['B']

# 定义一个字典
new_dic = dict()

# 将excel文件中的每一对数据都放到字典中
for i in range(len(cve_column)):
new_dic[str(cve_column[i].value)] = des_column[i].value


values=set()
for key in list(new_dic.keys()):
val = new_dic[key]
if val in values:
del new_dic[key]
else:
values.add(val)

for key,value in new_dic.items():
sh['A' + str(flag)] = key
sh['B' + str(flag)] = value
flag = flag + 1


book.save("已去重Cnvd特殊文本.xlsx")
print("---运行结束---")

python阅读需 2 分钟

问题介绍

有时候我们需要将两个字典进行合并,我们需要相同的键的值,合并成一个列表。

代码

dic_a = {"key1":1,"key5":2}

dic_b = {"key1":3,"key4":4}
print("合并前的字典1是{}".format(dic_a))
print("合并前的字典2是{}".format(dic_b))
# 实现的目标是 "key2":[2,3]
result_dic = {}
'''
核心思路:
1:遍历字典1和字典2的每一个键
2:如果两个字典的键是一样的,就给新字典的该键赋值为空列表
然后空列表依次添加字典1和字典2 的值,然后将最后的值赋值给原字典
3:如果两个字典的键不同,则分别将键值对加到新列表中
'''
for k,v in dic_a.items():
for m,n in dic_b.items():
if k == m:
result_dic[k] = []
result_dic[k].append(dic_a[k])
result_dic[k].append(dic_b[k])
dic_a[k] = result_dic[k]
dic_b[k] = result_dic[k]
else:
result_dic[k] = dic_a[k]
result_dic[m] = dic_b[m]
# if k in dic_b.keys():


print("合并后的字典是{}.".format(result_dic))

结果


python阅读需 1 分钟

python中交换两个元素是同步的!!!

a[i],a[i-1] = a[i-1],a[i]

上面的例子,假如a[i] = 3 , a[i-1] = 2,那么交换之后,a[i-1] = 3,a[i] = 2


python阅读需 1 分钟

yield执行步骤

  • 1:执行foo函数,打印starting...
  • 2: foo函数返回的是一个迭代器,此时的g是可以迭代的,所以print(next(g))打印的是4
  • 3:正常打印20个*
  • 4:第二次执行next(g)的时候,从上次yield结束的位置继续,此时res变量获得的是None,因为4已经返回了。
  • 5:因为foo函数里有while循环,所以会继续返回一个4 含有yield的函数直接实例化的时候,里面不会被执行的。使用next才开始执行。

send函数相当于在暂停的那个位置给补充一个数。


python阅读需 1 分钟