Initial commit: LookingWeb project

This commit is contained in:
cat-shark
2026-08-30 09:15:34 +08:00
commit f8e8fd38b4
5 changed files with 276 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
__pycache__/
*.pyc
*.pyo
.env
.venv/
venv/
+96
View File
@@ -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) # 返回值取值10-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()
+30
View File
@@ -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" # 请求过程中发生异常
+122
View File
@@ -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
+22
View File
@@ -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