Archived
添加下载用时输出
This commit is contained in:
9 files changed
+129
-865
No files matched your search
+25
-11
@@ -7,27 +7,28 @@
|
|||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import time
|
||||||
import requests
|
import requests
|
||||||
import threading
|
import threading
|
||||||
from bin.utils.logger import logger
|
from bin.utils.logger import logger
|
||||||
|
|
||||||
|
|
||||||
class Threaded(threading.Thread):
|
class Threaded(threading.Thread):
|
||||||
def __init__(self, s, e, fp, id_, url):
|
def __init__(self, s, e, id_, url, name):
|
||||||
"""
|
"""
|
||||||
初始化类
|
初始化类
|
||||||
:param s: 开始点
|
:param s: 开始点
|
||||||
:param e: 结束点
|
:param e: 结束点
|
||||||
:param fp: 文件操作
|
|
||||||
:param id_: 线程id
|
:param id_: 线程id
|
||||||
:param url: 文件url
|
:param url: 文件url
|
||||||
|
:param name: 文件名
|
||||||
"""
|
"""
|
||||||
super().__init__()
|
super(Threaded, self).__init__()
|
||||||
self.start_ = s
|
self.start_ = s
|
||||||
self.end_ = e
|
self.end_ = e
|
||||||
self.fp = fp
|
|
||||||
self.id = id_
|
self.id = id_
|
||||||
self.url = url
|
self.url = url
|
||||||
|
self.name = name
|
||||||
|
|
||||||
def download(self):
|
def download(self):
|
||||||
"""
|
"""
|
||||||
@@ -37,8 +38,9 @@ class Threaded(threading.Thread):
|
|||||||
"""
|
"""
|
||||||
logger.info(f'线程: {self.id} 开始下载')
|
logger.info(f'线程: {self.id} 开始下载')
|
||||||
res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content
|
res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content
|
||||||
self.fp.seek(self.start_)
|
with open(self.name, 'r+b') as fp:
|
||||||
self.fp.write(res)
|
fp.seek(self.start_)
|
||||||
|
fp.write(res)
|
||||||
logger.info(f'线程: {self.id} 结束下载')
|
logger.info(f'线程: {self.id} 结束下载')
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
@@ -49,7 +51,20 @@ class Threaded(threading.Thread):
|
|||||||
self.download()
|
self.download()
|
||||||
|
|
||||||
|
|
||||||
def main(url: str, name: str, path: str = '.', workers: int = 8):
|
def cost(func):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
logger.info('文件开始开始下载')
|
||||||
|
s = time.time()
|
||||||
|
execute = func(*args, **kwargs)
|
||||||
|
e = time.time()
|
||||||
|
logger.info(f'下载结束, 用时: {round(e - s, 2)} s')
|
||||||
|
return execute
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
@cost
|
||||||
|
def main(url: str, name: str, path: str = '.', workers: int = 4):
|
||||||
"""
|
"""
|
||||||
主函数
|
主函数
|
||||||
:param url:
|
:param url:
|
||||||
@@ -60,14 +75,13 @@ def main(url: str, name: str, path: str = '.', workers: int = 8):
|
|||||||
"""
|
"""
|
||||||
logger.info(f'本次下载使用线程数: {workers}')
|
logger.info(f'本次下载使用线程数: {workers}')
|
||||||
file_size = int(requests.get(url).headers['Content-Length'])
|
file_size = int(requests.get(url).headers['Content-Length'])
|
||||||
if requests.get(url).status_code == '302':
|
if requests.get(url).status_code == 302:
|
||||||
url = requests.get(url).headers['Location']
|
url = requests.get(url).headers['Location']
|
||||||
logger.warning(f'下载地址已重定向到了: {url}')
|
logger.warning(f'下载地址已重定向到了: {url}')
|
||||||
logger.info(f'文件大小: {round(file_size / 1024 / 1024, 2)} Mb')
|
logger.info(f'文件大小: {round(file_size / 1024 / 1024, 2)} Mb')
|
||||||
offset = int(file_size / workers)
|
offset = int(file_size / workers)
|
||||||
start = 0
|
start = 0
|
||||||
open(path + name, 'wb').close()
|
open(path + name, 'wb').close()
|
||||||
fp = open(path + name, 'r+b')
|
|
||||||
for i in range(workers):
|
for i in range(workers):
|
||||||
if i == workers - 1:
|
if i == workers - 1:
|
||||||
end = file_size
|
end = file_size
|
||||||
@@ -75,7 +89,7 @@ def main(url: str, name: str, path: str = '.', workers: int = 8):
|
|||||||
end = i * offset
|
end = i * offset
|
||||||
else:
|
else:
|
||||||
end = offset
|
end = offset
|
||||||
threads = Threaded(start, end, fp, i, url)
|
threads = Threaded(start, end, i, url, path + name)
|
||||||
threads.start()
|
threads.start()
|
||||||
threads.join()
|
threads.join()
|
||||||
start = end + 1
|
start = end + 1
|
||||||
@@ -84,4 +98,4 @@ def main(url: str, name: str, path: str = '.', workers: int = 8):
|
|||||||
if __name__ != '__main__':
|
if __name__ != '__main__':
|
||||||
if not os.path.exists('./bin/db/data.db'):
|
if not os.path.exists('./bin/db/data.db'):
|
||||||
logger.warning('数据库文件不存在, 即将开始下载')
|
logger.warning('数据库文件不存在, 即将开始下载')
|
||||||
main('https://themedatabase.vercel.app/assets', 'data.db', './bin/db/', 6)
|
main('https://themedatabase.vercel.app/assets', 'data.db', './bin/db/')
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -- coding:utf-8 --
|
|
||||||
# @Author: markushammered@gmail.com
|
|
||||||
# @Development Tool: PyCharm
|
|
||||||
# @Create Time: 2022/2/26
|
|
||||||
# @File Name: MySQL.py
|
|
||||||
|
|
||||||
|
|
||||||
from sqlalchemy import create_engine
|
|
||||||
from sqlalchemy.orm import sessionmaker
|
|
||||||
from models import * # 导入所有的主题表模型
|
|
||||||
from typing import List, Tuple
|
|
||||||
|
|
||||||
|
|
||||||
class MySQL:
|
|
||||||
"""使用SQLAlchemy进行的MySQL数据库操作"""
|
|
||||||
|
|
||||||
@property
|
|
||||||
def session(self):
|
|
||||||
"""
|
|
||||||
创建会话
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
return self.Session()
|
|
||||||
|
|
||||||
def __init__(self,
|
|
||||||
host: str,
|
|
||||||
user: str,
|
|
||||||
pwd: str,
|
|
||||||
database: str,
|
|
||||||
charset: str = 'utf8',
|
|
||||||
port: int = 3306
|
|
||||||
) -> None:
|
|
||||||
"""
|
|
||||||
初始化
|
|
||||||
:param host: 数据库地址
|
|
||||||
:param port: 数据库端口默认3306
|
|
||||||
:param user: 用户名
|
|
||||||
:param pwd: 登陆密码
|
|
||||||
:param database: 数据库名
|
|
||||||
:param charset: 字符集 默认utf8
|
|
||||||
"""
|
|
||||||
self.host = host
|
|
||||||
self.port = port
|
|
||||||
self.user = user
|
|
||||||
self.password = pwd
|
|
||||||
self.database = database
|
|
||||||
self.charset = charset
|
|
||||||
self.engine = create_engine(
|
|
||||||
f'mysql+pymysql://{self.user}:{self.password}@{self.host}:{self.port}/{self.database}') # 连接到数据库
|
|
||||||
self.Session = sessionmaker(bind=self.engine) # 创建引擎
|
|
||||||
self.Base = Base
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
"""
|
|
||||||
自动提交
|
|
||||||
自动关闭连接
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.session.commit()
|
|
||||||
self.session.close()
|
|
||||||
|
|
||||||
def insert(self, name: str, times: int = 0) -> bool:
|
|
||||||
"""
|
|
||||||
插入数据
|
|
||||||
:param name: 名称
|
|
||||||
:param times: 次数 默认0
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
new_data = ReqCount(name=name, times=times)
|
|
||||||
self.session.add(new_data)
|
|
||||||
self.session.commit()
|
|
||||||
return True
|
|
||||||
|
|
||||||
def update(self, name: str, times: int) -> bool:
|
|
||||||
"""
|
|
||||||
更新数据
|
|
||||||
:param name: 名称
|
|
||||||
:param times: 次数
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.session.query(ReqCount).filter(ReqCount.name == name).update({'name': name, 'times': times})
|
|
||||||
return True
|
|
||||||
|
|
||||||
def delete(self, name: str) -> bool:
|
|
||||||
"""
|
|
||||||
删除数据
|
|
||||||
:param name: 名称
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.session.query(ReqCount).filter(ReqCount.name == name)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def fetch(self, name: str) -> int:
|
|
||||||
"""
|
|
||||||
查询数据
|
|
||||||
:param name:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
data = self.session.query(ReqCount).filter(ReqCount.name == name).all()
|
|
||||||
for i in data:
|
|
||||||
return i.times
|
|
||||||
|
|
||||||
def fetchall(self) -> List[Tuple]:
|
|
||||||
"""
|
|
||||||
抓取全部数据
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
data_list = []
|
|
||||||
data = self.session.query(ReqCount).filter().all()
|
|
||||||
for tup in data:
|
|
||||||
data_list.append((tup.name, tup.times))
|
|
||||||
|
|
||||||
return data_list
|
|
||||||
|
|
||||||
def fetch_table(self, table_name: str) -> List[Tuple] or bool:
|
|
||||||
"""
|
|
||||||
抓取指定名称的表
|
|
||||||
:param table_name:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
table_list = []
|
|
||||||
tables = self.session.query(eval(table_name)).filter().all() # 使用eval函数将字符串转换为Python对象
|
|
||||||
for tup in tables:
|
|
||||||
table_list.append((tup.k, tup.v, tup.w, tup.h))
|
|
||||||
return table_list
|
|
||||||
|
|
||||||
def create(self):
|
|
||||||
self.Base.metadata.create_all(self.engine)
|
|
||||||
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -- coding:utf-8 --
|
|
||||||
# @Author: markushammered@gmail.com
|
|
||||||
# @Development Tool: PyCharm
|
|
||||||
# @Create Time: 2022/2/27
|
|
||||||
# @File Name: MySQL_.py
|
|
||||||
|
|
||||||
|
|
||||||
import pymysql
|
|
||||||
|
|
||||||
|
|
||||||
class MySQL:
|
|
||||||
"""操作MySQL数据库"""
|
|
||||||
|
|
||||||
def __init__(self,
|
|
||||||
host: str,
|
|
||||||
user: str,
|
|
||||||
pwd: str,
|
|
||||||
database: str
|
|
||||||
) -> None:
|
|
||||||
"""
|
|
||||||
初始化MySQL对象并创建一个连接
|
|
||||||
创建的连接会在执行完毕后自动提交以及自动关闭
|
|
||||||
:param host: 数据库地址
|
|
||||||
:param user: 数据库用户名
|
|
||||||
:param pwd: 数据库密码
|
|
||||||
:param database: 数据库名
|
|
||||||
"""
|
|
||||||
self.__host = host
|
|
||||||
self.__user = user
|
|
||||||
self.__password = pwd
|
|
||||||
self.__database = database
|
|
||||||
self.__conn = pymysql.connect(user=self.__user,
|
|
||||||
password=self.__password,
|
|
||||||
host=self.__host,
|
|
||||||
database=self.__database) # 创建连接
|
|
||||||
self.__cursor = self.__conn.cursor()
|
|
||||||
|
|
||||||
def __del__(self):
|
|
||||||
"""
|
|
||||||
自动提交
|
|
||||||
自动关闭连接
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__conn.commit()
|
|
||||||
self.__cursor.close()
|
|
||||||
self.__conn.close()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def show_tables(self) -> list:
|
|
||||||
"""
|
|
||||||
查询已有的表
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute('show tables;') # 列出所有的表名
|
|
||||||
tuple_tables = self.__cursor.fetchall()
|
|
||||||
# 将元组类型转换为列表
|
|
||||||
tables = []
|
|
||||||
for origin in tuple_tables:
|
|
||||||
tables.append(origin[0])
|
|
||||||
del tuple_tables
|
|
||||||
return tables
|
|
||||||
|
|
||||||
def exists_name(self, name: str):
|
|
||||||
"""
|
|
||||||
判断是否存在于数据库内
|
|
||||||
:param name:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
status = self.fetch(name)
|
|
||||||
if status == ():
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
def exists_table(self, table: str) -> bool:
|
|
||||||
"""
|
|
||||||
判断表是否在数据库内
|
|
||||||
:param table:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
tables = self.show_tables
|
|
||||||
if table in tables:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def insert(self, name: str, times: int = 0) -> bool:
|
|
||||||
"""
|
|
||||||
插入数据
|
|
||||||
:param name:
|
|
||||||
:param times:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
self.__cursor.execute(
|
|
||||||
'insert into reqcount(name, times) values("%(name)s", %(times)s);' % {'name': name, 'times': times})
|
|
||||||
return True
|
|
||||||
except pymysql.err.IntegrityError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def delete(self, name: str) -> bool:
|
|
||||||
"""
|
|
||||||
删除数据
|
|
||||||
:param name:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute('delete from reqcount where name="%(name)s";' % {'name': name})
|
|
||||||
return True
|
|
||||||
|
|
||||||
def fetch(self, name: str) -> bool or tuple:
|
|
||||||
"""
|
|
||||||
抓取数据
|
|
||||||
:param name:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute('select * from reqcount where name="%(name)s";' % {'name': name})
|
|
||||||
data = self.__cursor.fetchall()
|
|
||||||
if data == ():
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return data[0]
|
|
||||||
|
|
||||||
def update(self, name: str, times: int) -> bool:
|
|
||||||
"""
|
|
||||||
更改数据
|
|
||||||
:param name:
|
|
||||||
:param times:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute(
|
|
||||||
'update reqcount set times="%(times)s where name="%(name)s"";' % {'times': times, 'name': name})
|
|
||||||
return True
|
|
||||||
|
|
||||||
def fetching_table(self, table: str) -> list:
|
|
||||||
"""
|
|
||||||
抓取主题表内的数据
|
|
||||||
:param table:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute('select * from %(table)s' % {'table': table})
|
|
||||||
datas = self.__cursor.fetchall()
|
|
||||||
lst = []
|
|
||||||
for i in datas:
|
|
||||||
lst.append({'k': i[0],
|
|
||||||
'v': i[1],
|
|
||||||
'w': i[2],
|
|
||||||
'h': i[3]}
|
|
||||||
) # 向空列表内添加抓取到的数据 -> 将元组数据转换为列表
|
|
||||||
|
|
||||||
del datas
|
|
||||||
return lst
|
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['MySQL']
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -- coding:utf-8 --
|
|
||||||
# @Author: markushammered@gmail.com
|
|
||||||
# @Development Tool: PyCharm
|
|
||||||
# @Create Time: 2022/2/27
|
|
||||||
# @File Name: SQLite_.py
|
|
||||||
|
|
||||||
|
|
||||||
import sqlite3
|
|
||||||
|
|
||||||
|
|
||||||
class SQLite:
|
|
||||||
"""操作SQLite数据库"""
|
|
||||||
|
|
||||||
def __init__(self,
|
|
||||||
path: str = './bin/db/data.db'
|
|
||||||
) -> None:
|
|
||||||
"""
|
|
||||||
初始化SQLite对象
|
|
||||||
:param path: 数据库路径
|
|
||||||
"""
|
|
||||||
self.__path = path
|
|
||||||
self.__conn = sqlite3.connect(self.__path)
|
|
||||||
self.__cursor = self.__conn.cursor()
|
|
||||||
|
|
||||||
def __del__(self) -> None:
|
|
||||||
"""
|
|
||||||
自动提交
|
|
||||||
自动关闭连接
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__conn.commit()
|
|
||||||
self.__cursor.close()
|
|
||||||
self.__conn.close()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def show_tables(self) -> list:
|
|
||||||
"""
|
|
||||||
列出所有在数据库内的表
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute('select * from sqlite_master where type="table"')
|
|
||||||
tables = self.__cursor.fetchall()
|
|
||||||
lst = []
|
|
||||||
for table in tables:
|
|
||||||
lst.append(table[1])
|
|
||||||
del tables
|
|
||||||
return lst
|
|
||||||
|
|
||||||
def exist_name(self, name: str) -> bool:
|
|
||||||
"""
|
|
||||||
判断当前名称是否在数据库内
|
|
||||||
调用fetch方法判断
|
|
||||||
:param name:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
status = self.fetch(name)
|
|
||||||
if status == ():
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
def exist_table(self, table: str) -> bool:
|
|
||||||
"""
|
|
||||||
判断表是否在数据库内
|
|
||||||
:param table:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
tables = self.show_tables
|
|
||||||
if table in tables:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def insert(self, name: str, times: int) -> bool:
|
|
||||||
"""
|
|
||||||
插入数据
|
|
||||||
:param name:
|
|
||||||
:param times:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute(
|
|
||||||
'insert into reqcount values(name="%(name)s", times=%(times)s)' % {'name': name, 'times': times})
|
|
||||||
return True
|
|
||||||
|
|
||||||
def delete(self, name: str) -> bool:
|
|
||||||
"""
|
|
||||||
删除数据
|
|
||||||
:param name:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute('delete from reqcount where name="%(name)s"' % {'name': name})
|
|
||||||
return True
|
|
||||||
|
|
||||||
def fetch(self, name: str) -> tuple:
|
|
||||||
"""
|
|
||||||
抓取数据
|
|
||||||
:param name:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute('select * from reqcount where name="%(name)s"' % {'name': name})
|
|
||||||
data = self.__cursor.fetchall()
|
|
||||||
if len(data):
|
|
||||||
return data[0]
|
|
||||||
else:
|
|
||||||
return tuple(data)
|
|
||||||
|
|
||||||
def update(self, name: str, times: int) -> bool:
|
|
||||||
"""
|
|
||||||
更新数据
|
|
||||||
:param name:
|
|
||||||
:param times:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
self.__cursor.execute(
|
|
||||||
'update reqcount set times=%(times)s where name="%(name)s"' % {'times': times, 'name': name})
|
|
||||||
return True
|
|
||||||
|
|
||||||
def fetching_table(self, table: str) -> list[dict]:
|
|
||||||
"""
|
|
||||||
抓取主题表的数据
|
|
||||||
:param table:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
status = self.exist_table(table)
|
|
||||||
if status:
|
|
||||||
tables = self.__cursor.execute('select * from %(table)s' % {'table': table})
|
|
||||||
lst = []
|
|
||||||
for data in tables:
|
|
||||||
lst.append({'index': data[0],
|
|
||||||
'base64': data[1],
|
|
||||||
'width': data[2],
|
|
||||||
'height': data[3]})
|
|
||||||
del tables
|
|
||||||
return lst
|
|
||||||
else:
|
|
||||||
return []
|
|
||||||
|
|
||||||
|
|
||||||
sqlite = SQLite('../db/data.db')
|
|
||||||
print(sqlite.fetching_table('gelbooru'))
|
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -- coding:utf-8 --
|
||||||
|
# @Author: markushammered@gmail.com
|
||||||
|
# @Development Tool: PyCharm
|
||||||
|
# @Create Time: 2022/3/4
|
||||||
|
# @File Name: down.py
|
||||||
|
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import requests
|
||||||
|
import threading
|
||||||
|
|
||||||
|
|
||||||
|
class Downloader(threading.Thread):
|
||||||
|
"""继承threading实现多线程"""
|
||||||
|
|
||||||
|
def __init__(self, start_: int, end_: int, t_id: int, url: str, name: str):
|
||||||
|
"""
|
||||||
|
初始化类
|
||||||
|
:param start_: seek开始点
|
||||||
|
:param end_: seek结束点
|
||||||
|
:param t_id: 线程id
|
||||||
|
:param url: 资源地址
|
||||||
|
:param name: 文件名
|
||||||
|
"""
|
||||||
|
super(Downloader, self).__init__()
|
||||||
|
self.start_ = start_
|
||||||
|
self.end_ = end_
|
||||||
|
self.t_id = t_id
|
||||||
|
self.url = url
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
def download(self):
|
||||||
|
"""
|
||||||
|
开始下载
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
print(f'{self.t_id} 开始下载')
|
||||||
|
res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content
|
||||||
|
with open(self.name, 'r+b') as fp:
|
||||||
|
fp.seek(self.start_)
|
||||||
|
fp.write(res)
|
||||||
|
print(f'{self.t_id} 结束下载')
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""
|
||||||
|
开始运行
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
self.download()
|
||||||
|
|
||||||
|
|
||||||
|
def cost(func):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
print('文件开始开始下载')
|
||||||
|
s = time.time()
|
||||||
|
execute = func(*args, **kwargs)
|
||||||
|
e = time.time()
|
||||||
|
print(f'下载结束, 用时: {round(e - s, 2)} s')
|
||||||
|
return execute
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
@cost
|
||||||
|
def main(url: str, threads: int = 4):
|
||||||
|
"""
|
||||||
|
处理各种数据
|
||||||
|
:param url: 资源地址
|
||||||
|
:param threads: 线程数
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
res = requests.get(url)
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
print('资源连接错误')
|
||||||
|
sys.exit(-1)
|
||||||
|
if res.status_code == 302:
|
||||||
|
url = res.headers['Location']
|
||||||
|
print(f'资源已重定向到: {url}')
|
||||||
|
file_name = url.split('/')[-1]
|
||||||
|
open(file_name, 'w').close()
|
||||||
|
file_size = int(res.headers['Content-Length'])
|
||||||
|
offset = file_size // threads
|
||||||
|
start = 0
|
||||||
|
for i in range(threads):
|
||||||
|
if i == 0:
|
||||||
|
end = offset
|
||||||
|
elif i == threads - 1:
|
||||||
|
end = file_size
|
||||||
|
else:
|
||||||
|
end = i * offset
|
||||||
|
t = Downloader(start, end, i, url, file_name)
|
||||||
|
t.start()
|
||||||
|
t.join()
|
||||||
|
start = end
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main('https://i0.hdslb.com/bfs/archive/ef0945f7d54a505953272022063a6335a9d3becf.jpg')
|
||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
import requests
|
import requests
|
||||||
import threading
|
import threading
|
||||||
from bin.utils.logger import logger
|
|
||||||
|
|
||||||
|
|
||||||
class Threaded(threading.Thread):
|
class Threaded(threading.Thread):
|
||||||
@@ -21,18 +20,18 @@ class Threaded(threading.Thread):
|
|||||||
self.url = url
|
self.url = url
|
||||||
|
|
||||||
def download(self):
|
def download(self):
|
||||||
logger.info(f'线程: {self.id} 开始下载')
|
print(f'线程: {self.id} 开始下载')
|
||||||
res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content
|
res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content
|
||||||
self.fp.seek(self.start_)
|
self.fp.seek(self.start_)
|
||||||
self.fp.write(res)
|
self.fp.write(res)
|
||||||
logger.info(f'线程: {self.id} 结束下载')
|
print(f'线程: {self.id} 结束下载')
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.download()
|
self.download()
|
||||||
|
|
||||||
|
|
||||||
def main(url: str, path: str = '.', workers: int = 8):
|
def main(url: str, path: str = '.', workers: int = 8):
|
||||||
logger.info(f'本次下载使用线程数: {workers}')
|
print(f'本次下载使用线程数: {workers}')
|
||||||
file_name = url.split('/')[-1]
|
file_name = url.split('/')[-1]
|
||||||
file_size = int(requests.get(url).headers['Content-Length'])
|
file_size = int(requests.get(url).headers['Content-Length'])
|
||||||
if requests.get(url).status_code == '302':
|
if requests.get(url).status_code == '302':
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -- coding:utf-8 --
|
|
||||||
# @Author: markushammered@gmail.com
|
|
||||||
# @Development Tool: PyCharm
|
|
||||||
# @Create Time: 2022/2/26
|
|
||||||
# @File Name: fetchtable.py
|
|
||||||
|
|
||||||
|
|
||||||
import sqlite3
|
|
||||||
|
|
||||||
conn = sqlite3.connect('../db/data.db')
|
|
||||||
cursor = conn.cursor()
|
|
||||||
cursor.execute('select * from sqlite_master where type="table"')
|
|
||||||
tables = []
|
|
||||||
for i in cursor.fetchall():
|
|
||||||
tables.append(i[1])
|
|
||||||
|
|
||||||
print(tables)
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -- coding:utf-8 --
|
|
||||||
# @Author: markushammered@gmail.com
|
|
||||||
# @Development Tool: PyCharm
|
|
||||||
# @Create Time: 2022/2/5
|
|
||||||
# @File Name: init_db.py
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sqlite3
|
|
||||||
import sys
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
while True:
|
|
||||||
yes_or_no = input('该操作会将数据库初始化输入y继续:')
|
|
||||||
if yes_or_no == 'y':
|
|
||||||
try:
|
|
||||||
os.remove('../db/count.db')
|
|
||||||
except PermissionError:
|
|
||||||
print('有其他程序正在使用此数据库无法删除')
|
|
||||||
sys.exit(-1)
|
|
||||||
conn = sqlite3.connect('../db/count.db')
|
|
||||||
cursor = conn.cursor()
|
|
||||||
cursor.execute('create table ReqCount (name text primary key, times integer )')
|
|
||||||
sys.exit(0)
|
|
||||||
elif yes_or_no == 'n':
|
|
||||||
print('已取消')
|
|
||||||
sys.exit(0)
|
|
||||||
else:
|
|
||||||
print('请输入y继续或n退出')
|
|
||||||
continue
|
|
||||||
@@ -1,376 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
# -- coding:utf-8 --
|
|
||||||
# @Author: markushammered@gmail.com
|
|
||||||
# @Development Tool: PyCharm
|
|
||||||
# @Create Time: 2022/2/26
|
|
||||||
# @File Name: tables.py
|
|
||||||
|
|
||||||
|
|
||||||
from sqlalchemy import Column
|
|
||||||
from sqlalchemy import Integer
|
|
||||||
from sqlalchemy import String
|
|
||||||
from sqlalchemy import VARCHAR
|
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
|
||||||
|
|
||||||
Base = declarative_base()
|
|
||||||
|
|
||||||
"""所有已保存的主题均在此处列出"""
|
|
||||||
|
|
||||||
|
|
||||||
class ReqCount(Base):
|
|
||||||
"""计数器数据库模型"""
|
|
||||||
|
|
||||||
__tablename__ = 'reqcount'
|
|
||||||
name = Column(String(20), primary_key=True) # 名称
|
|
||||||
times = Column(Integer()) # 次数
|
|
||||||
|
|
||||||
|
|
||||||
class gelbooru(Base):
|
|
||||||
__tablename__ = 'gelbooru'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class moebooru(Base):
|
|
||||||
__tablename__ = 'moebooru'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class g(Base):
|
|
||||||
__tablename__ = 'g'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class cripple(Base):
|
|
||||||
__tablename__ = 'cripple'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class blacked(Base):
|
|
||||||
__tablename__ = 'blacked'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class rule34(Base):
|
|
||||||
__tablename__ = 'rule34'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class steambanner(Base):
|
|
||||||
__tablename__ = 'steambanner'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class lefty(Base):
|
|
||||||
__tablename__ = 'lefty'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class crewbooru(Base):
|
|
||||||
__tablename__ = 'crewbooru'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class sthg(Base):
|
|
||||||
__tablename__ = 'sthg'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class rfck(Base):
|
|
||||||
__tablename__ = 'rfck'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class lisu(Base):
|
|
||||||
__tablename__ = 'lisu'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class tv(Base):
|
|
||||||
__tablename__ = 'tv'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class lewd(Base):
|
|
||||||
__tablename__ = 'lewd'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class amibooru(Base):
|
|
||||||
__tablename__ = 'amibooru'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class blankatlas(Base):
|
|
||||||
__tablename__ = 'blankatlas'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class mmballbusting(Base):
|
|
||||||
__tablename__ = 'mmballbusting'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class sss(Base):
|
|
||||||
__tablename__ = 'sss'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class legolamb(Base):
|
|
||||||
__tablename__ = 'legolamb'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class goldengator(Base):
|
|
||||||
__tablename__ = 'goldengator'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class r6gdrawfriends(Base):
|
|
||||||
__tablename__ = 'r6gdrawfriends'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class vivi(Base):
|
|
||||||
__tablename__ = 'vivi'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class twifanartsfw(Base):
|
|
||||||
__tablename__ = 'twifanartsfw'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class hololive(Base):
|
|
||||||
__tablename__ = 'hololive'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class vglobby(Base):
|
|
||||||
__tablename__ = 'vglobby'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class jaypee(Base):
|
|
||||||
__tablename__ = 'jaypee'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class melanin(Base):
|
|
||||||
__tablename__ = 'melanin'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class orb(Base):
|
|
||||||
__tablename__ = 'orb'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class min(Base):
|
|
||||||
__tablename__ = 'min'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class mjg(Base):
|
|
||||||
__tablename__ = 'mjg'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class cloppers(Base):
|
|
||||||
__tablename__ = 'cloppers'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class townofgravityfalls(Base):
|
|
||||||
__tablename__ = 'townofgravityfalls'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class brown(Base):
|
|
||||||
__tablename__ = 'brown'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class enacdoa(Base):
|
|
||||||
__tablename__ = 'enacdoa'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class daifuku(Base):
|
|
||||||
__tablename__ = 'daifuku'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class osc(Base):
|
|
||||||
__tablename__ = 'osc'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class girlsfeet(Base):
|
|
||||||
__tablename__ = 'girlsfeet'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class hybreedsgeneral(Base):
|
|
||||||
__tablename__ = 'hybreedsgeneral'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class sr(Base):
|
|
||||||
__tablename__ = 'sr'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class mono(Base):
|
|
||||||
__tablename__ = 'mono'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class riskofrain(Base):
|
|
||||||
__tablename__ = 'riskofrain'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class neovb(Base):
|
|
||||||
__tablename__ = 'neovb'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
class ffsr(Base):
|
|
||||||
__tablename__ = 'ffsr'
|
|
||||||
k = Column(VARCHAR(500), primary_key=True)
|
|
||||||
v = Column(VARCHAR(500))
|
|
||||||
w = Column(Integer())
|
|
||||||
h = Column(Integer())
|
|
||||||
|
|
||||||
|
|
||||||
__all__ = ['ReqCount', 'gelbooru', 'moebooru', 'g', 'cripple', 'blacked', 'rule34', 'steambanner', 'lefty', 'crewbooru',
|
|
||||||
'sthg', 'rfck', 'lisu', 'tv', 'lewd', 'amibooru', 'blankatlas', 'mmballbusting', 'sss', 'legolamb',
|
|
||||||
'goldengator', 'r6gdrawfriends', 'vivi', 'twifanartsfw', 'hololive', 'vglobby', 'jaypee', 'melanin', 'orb',
|
|
||||||
'min', 'mjg', 'cloppers', 'townofgravityfalls', 'brown', 'enacdoa', 'daifuku', 'osc', 'girlsfeet',
|
|
||||||
'hybreedsgeneral', 'sr', 'mono', 'riskofrain', 'neovb', 'ffsr', 'Base']
|
|
||||||
Reference in New Issue
Block a user