commit f8e8fd38b448deb1c6309451608889d1cc9e73ad Author: cat-shark Date: Sun Aug 30 09:15:34 2026 +0800 Initial commit: LookingWeb project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d95ae28 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +__pycache__/ +*.pyc +*.pyo +.env +.venv/ +venv/ diff --git a/LookingWebMain.py b/LookingWebMain.py new file mode 100644 index 0000000..35157c7 --- /dev/null +++ b/LookingWebMain.py @@ -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() diff --git a/ariaDownloaderService/AriaDownloader.py b/ariaDownloaderService/AriaDownloader.py new file mode 100644 index 0000000..0e032db --- /dev/null +++ b/ariaDownloaderService/AriaDownloader.py @@ -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" # 请求过程中发生异常 diff --git a/dataService/MySqlService.py b/dataService/MySqlService.py new file mode 100644 index 0000000..6131610 --- /dev/null +++ b/dataService/MySqlService.py @@ -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 \ No newline at end of file diff --git a/dataService/dto/SeedInfo.py b/dataService/dto/SeedInfo.py new file mode 100644 index 0000000..2618753 --- /dev/null +++ b/dataService/dto/SeedInfo.py @@ -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