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