Initial commit: LookingWeb project
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.pyo
|
||||
.env
|
||||
.venv/
|
||||
venv/
|
||||
@@ -0,0 +1,96 @@
|
||||
import time
|
||||
|
||||
import requests
|
||||
from loguru import logger
|
||||
from bs4 import BeautifulSoup
|
||||
from dataService.dto.SeedInfo import SeedInfo
|
||||
from dataService import MySqlService as mysql
|
||||
from ariaDownloaderService import AriaDownloader as ariaDownloader
|
||||
|
||||
"""
|
||||
获取页面信息
|
||||
"""
|
||||
def get_page(url):
|
||||
logger.debug("开始获取页面信息:{}", url)
|
||||
try:
|
||||
response = requests.get(url)
|
||||
soup = BeautifulSoup(response.content, 'html.parser')
|
||||
logger.debug("页面信息获取成功。URL: {}", url)
|
||||
return soup
|
||||
except Exception as e:
|
||||
logger.error("获取页面信息失败。URL: {}, 错误: {}", url, str(e))
|
||||
return None
|
||||
|
||||
|
||||
"""
|
||||
用于获取目标元素上的详情页url
|
||||
"""
|
||||
def get_target_element_list(page_content):
|
||||
logger.debug("开始提取可下载内容的链接")
|
||||
downloadable_url_list = []
|
||||
try:
|
||||
for element in page_content.find_all("div", {"class": "card-body"}):
|
||||
if "可下" in element.find("div", {"class": "video-list-item-tag-wrapper"}).text:
|
||||
url = element.find("a")["href"]
|
||||
downloadable_url_list.append(url)
|
||||
logger.debug("发现可下载链接: {}", url)
|
||||
logger.debug("链接提取完成。共发现 {} 个链接。", len(downloadable_url_list))
|
||||
return downloadable_url_list
|
||||
except Exception as e:
|
||||
logger.error("提取链接时出现错误: {}", str(e))
|
||||
return []
|
||||
|
||||
|
||||
def get_seed_from_element_detail(element_detail):
|
||||
logger.debug("开始解析页面中的种子信息")
|
||||
seedInfoList = []
|
||||
time.sleep(2)
|
||||
try:
|
||||
from_url = element_detail.find("link")["href"]
|
||||
title = element_detail.find("meta", {"name": "description"})["content"]
|
||||
for e in element_detail.find("tbody").find_all("a", class_="magnet-name text-truncate d-block small"):
|
||||
seedInfo = SeedInfo(title, e["href"], "1", url=from_url)
|
||||
seedInfoList.append(seedInfo)
|
||||
logger.debug("解析到种子信息: 标题:{},链接:{}", title, e["href"])
|
||||
logger.debug("页面种子信息解析完成。共 {} 个种子。", len(seedInfoList))
|
||||
return seedInfoList
|
||||
except Exception as e:
|
||||
logger.error("解析种子信息时出现错误: {}", str(e))
|
||||
return []
|
||||
|
||||
|
||||
def main():
|
||||
# 1-18
|
||||
for page in range(5):
|
||||
url = f"https://freejavbt.com/censored/filter?c=212&page={page+1}"
|
||||
logger.info("程序启动。开始处理 URL: {}", url)
|
||||
new_seed = []
|
||||
# 获取页面信息
|
||||
page = get_page(url)
|
||||
if page is not None:
|
||||
# 获取页面中的目标元素所包含的详情页信息(url列表)
|
||||
targetElementList = get_target_element_list(page)
|
||||
for targetElement in targetElementList:
|
||||
element_detail = get_page(targetElement)
|
||||
if element_detail is not None:
|
||||
seed_list = get_seed_from_element_detail(element_detail)
|
||||
# 将新发现的种子存储进new_seed列表
|
||||
for seed in seed_list:
|
||||
if not mysql.seed_is_exist(seed):
|
||||
new_seed.append(seed)
|
||||
logger.debug("新增种子到下载列表: {}", seed.name)
|
||||
|
||||
# 推送new_seed进入aria2进行种子下载
|
||||
for seed in new_seed:
|
||||
logger.info("开始下载种子: {}", seed.name)
|
||||
status = ariaDownloader.download_by_seed(seed) # 返回值取值1,0,-1
|
||||
seed.haveDownload = status
|
||||
seed.seave_to_dataBase()
|
||||
logger.info("种子下载完成。标题: {}, 状态: {}", seed.name, "成功" if status == "1" else "失败")
|
||||
else:
|
||||
logger.error("无法获取网页内容。URL: {}", url)
|
||||
|
||||
logger.info("程序处理完成。")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,30 @@
|
||||
import requests
|
||||
from loguru import logger
|
||||
|
||||
def download_by_seed(seed_info):
|
||||
url = "http://192.168.123.199:6800/jsonrpc"
|
||||
payload = {
|
||||
"jsonrpc": "2.0",
|
||||
"method": "aria2.addUri",
|
||||
"id": "QXJpYU5nXzE3MTczMTQ0NjBfMC41Nzc4ODU5Mjc2NjQ2MzE4",
|
||||
"params": [
|
||||
"token:guoxy5157",
|
||||
[seed_info.seedUrl],
|
||||
{}
|
||||
]
|
||||
}
|
||||
|
||||
logger.debug("开始向 Aria2 发送请求,种子URL: {}", seed_info.seedUrl)
|
||||
|
||||
try:
|
||||
response = requests.post(url, json=payload)
|
||||
|
||||
if response.status_code == 200:
|
||||
logger.info("请求成功,种子 {} 已添加至下载队列", seed_info.seedUrl)
|
||||
return "1"
|
||||
else:
|
||||
logger.warning("请求返回非200状态码,种子 {} 添加失败。状态码: {}", seed_info.seedUrl, response.status_code)
|
||||
return "-1" # 请求成功,但失败了
|
||||
except Exception as e:
|
||||
logger.error("请求过程中出现异常,种子 {} 添加失败。错误信息: {}", seed_info.seedUrl, str(e))
|
||||
return "0" # 请求过程中发生异常
|
||||
@@ -0,0 +1,122 @@
|
||||
import pymysql
|
||||
from loguru import logger
|
||||
|
||||
class DatabaseConfig:
|
||||
HOST = "192.168.123.199"
|
||||
PORT = 3306
|
||||
USER = "root"
|
||||
PASSWORD = "GUOxy5157"
|
||||
DB = "LookingWeb"
|
||||
|
||||
|
||||
class MySQLDatabase:
|
||||
def __init__(self, host, prot, user, password, db):
|
||||
self.port = prot
|
||||
self.host = host
|
||||
self.user = user
|
||||
self.password = password
|
||||
self.db = db
|
||||
self.connection = None
|
||||
self.connect()
|
||||
|
||||
def __enter__(self):
|
||||
self.connect()
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||
self.connection.close()
|
||||
|
||||
@classmethod
|
||||
def create_connection(cls):
|
||||
return cls(DatabaseConfig.HOST, DatabaseConfig.PORT, DatabaseConfig.USER, DatabaseConfig.PASSWORD,
|
||||
DatabaseConfig.DB)
|
||||
|
||||
|
||||
def connect(self):
|
||||
if not self.connection or not self.connection.open:
|
||||
try:
|
||||
self.connection = pymysql.connect(
|
||||
host=self.host, port=self.port, user=self.user,
|
||||
password=self.password, db=self.db, charset='utf8mb4',
|
||||
cursorclass=pymysql.cursors.DictCursor)
|
||||
logger.info("数据库连接成功:{}@{}", self.user, self.host)
|
||||
except pymysql.MySQLError as e:
|
||||
logger.error("数据库连接失败:{}", str(e))
|
||||
|
||||
def close(self):
|
||||
if self.connection and self.connection.open:
|
||||
self.connection.close()
|
||||
|
||||
def query(self, sql, params=None):
|
||||
self.connect()
|
||||
with self.connection.cursor() as cursor:
|
||||
try:
|
||||
cursor.execute(sql, params or ())
|
||||
result = cursor.fetchall()
|
||||
logger.debug("查询成功:{}", sql)
|
||||
return result
|
||||
except pymysql.MySQLError as e:
|
||||
logger.error("查询失败:{},错误:{}", sql, str(e))
|
||||
return None
|
||||
|
||||
def execute(self, sql, params=None):
|
||||
self.connect()
|
||||
with self.connection.cursor() as cursor:
|
||||
cursor.execute(sql, params or ())
|
||||
self.connection.commit()
|
||||
|
||||
|
||||
def is_connected():
|
||||
logger.debug("正在检查数据库连接...")
|
||||
with MySQLDatabase.create_connection() as mysql:
|
||||
try:
|
||||
mysql.query("SELECT * FROM seeds_info where id = 1")
|
||||
logger.info("数据库连接检查通过")
|
||||
return True
|
||||
except pymysql.MySQLError as e:
|
||||
logger.error("数据库连接检查失败:{}", str(e))
|
||||
return False
|
||||
|
||||
|
||||
def seed_is_exist(seed):
|
||||
with MySQLDatabase.create_connection() as mysql:
|
||||
try:
|
||||
sql = "SELECT * FROM seeds_info where seed_url = %s"
|
||||
result = mysql.query(sql, (seed.seedUrl,))
|
||||
if not result:
|
||||
logger.info("种子不存在: {}", seed.seedUrl)
|
||||
return False
|
||||
else:
|
||||
logger.info("种子已存在: {}", seed.seedUrl)
|
||||
return True
|
||||
except pymysql.MySQLError as e:
|
||||
logger.error("检查种子存在失败: {},错误: {}", seed.seedUrl, str(e))
|
||||
return False
|
||||
|
||||
def save_seed(seed_info):
|
||||
with MySQLDatabase.create_connection() as connection:
|
||||
query = """
|
||||
INSERT INTO seeds_info (name, seed_url, have_download, create_time, update_time, url)
|
||||
VALUES (%s, %s, %s, %s, %s, %s)
|
||||
"""
|
||||
values = (seed_info.name, seed_info.seedUrl, seed_info.haveDownload, seed_info.createTime, seed_info.updateTime,
|
||||
seed_info.url)
|
||||
try:
|
||||
connection.execute(query, values)
|
||||
logger.info("种子信息保存成功: {}", seed_info.seedUrl)
|
||||
return True
|
||||
except pymysql.MySQLError as e:
|
||||
logger.error("保存种子信息失败: {},错误: {}", seed_info.seedUrl, str(e))
|
||||
return False
|
||||
|
||||
def delete_seed(seed_info):
|
||||
query = "DELETE FROM seeds_info WHERE seed_url = %s"
|
||||
value = (seed_info.seedUrl,)
|
||||
with MySQLDatabase.create_connection() as connection:
|
||||
try:
|
||||
connection.execute(query, value)
|
||||
logger.info("种子删除成功: {}", seed_info.seedUrl)
|
||||
return True
|
||||
except pymysql.MySQLError as e:
|
||||
logger.error("删除种子失败: {},错误: {}", seed_info.seedUrl, str(e))
|
||||
return False
|
||||
@@ -0,0 +1,22 @@
|
||||
import time
|
||||
from datetime import datetime
|
||||
from dataService import MySqlService as mysqlService
|
||||
|
||||
class SeedInfo(object):
|
||||
def __init__(self, name=None, seedUrl=None, haveDownload=None, createTime=None, updateTime=None, url=None):
|
||||
self.name = name
|
||||
self.seedUrl = seedUrl
|
||||
self.haveDownload = haveDownload
|
||||
self.createTime = self.format_time(createTime)
|
||||
self.updateTime = self.format_time(updateTime)
|
||||
self.url = url
|
||||
|
||||
@staticmethod
|
||||
def format_time(timestamp):
|
||||
if timestamp is None:
|
||||
timestamp = time.time()
|
||||
return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
|
||||
|
||||
def seave_to_dataBase(self):
|
||||
mysqlService.save_seed(self)
|
||||
return
|
||||
Reference in New Issue
Block a user