feat: Implement GameTora scraper for Umamusume support cards, including details, effects, hints, events, and image downloads.

This commit is contained in:
kiyreload27
2025-12-28 21:19:05 +00:00
parent f7b68d360b
commit 0abeed99a0

View File

@@ -136,6 +136,11 @@ def download_card_image(page, card_id, card_name):
safe_name = re.sub(r'[<>:"/\\|?*]', '_', card_name) safe_name = re.sub(r'[<>:"/\\|?*]', '_', card_name)
file_path = os.path.join(IMAGES_PATH, f"{card_id}_{safe_name}.png") file_path = os.path.join(IMAGES_PATH, f"{card_id}_{safe_name}.png")
# Skip if already exists
if os.path.exists(file_path):
# print(f" Art already exists, skipping download")
return file_path
# Download image # Download image
response = requests.get(img_url, timeout=10) response = requests.get(img_url, timeout=10)
if response.status_code == 200: if response.status_code == 200:
@@ -521,23 +526,23 @@ def scrape_events(page, card_id, cur):
// Targeted search for event triggers based on section headers // Targeted search for event triggers based on section headers
const getTriggers = () => { const getTriggers = () => {
const triggers = []; const triggers = [];
const seenNames = new Set();
const headers = Array.from(document.querySelectorAll('div, h2, h3, span')).filter(el => const headers = Array.from(document.querySelectorAll('div, h2, h3, span')).filter(el =>
el.innerText.includes('Chain Events') || el.innerText.includes('Random Events') el.innerText.includes('Chain Events') || el.innerText.includes('Random Events')
); );
headers.forEach(header => { headers.forEach(header => {
// Look for buttons in the siblings or children of the parent container
const container = header.parentElement; const container = header.parentElement;
if (container) { if (container) {
const buttons = Array.from(container.querySelectorAll('button')); const buttons = Array.from(container.querySelectorAll('button'));
buttons.forEach(btn => { buttons.forEach(btn => {
const text = btn.innerText.trim(); const text = btn.innerText.trim();
// Check visibility to avoid mobile/desktop duplicates
const style = window.getComputedStyle(btn); const style = window.getComputedStyle(btn);
const isVisible = style.display !== 'none' && style.visibility !== 'hidden' && btn.offsetWidth > 0; const isVisible = style.display !== 'none' && style.visibility !== 'hidden' && btn.offsetWidth > 0;
if (isVisible && text && text.length > 5 && !text.includes('Events')) { if (isVisible && text && text.length > 5 && !text.includes('Events') && !seenNames.has(text)) {
triggers.push(btn); triggers.push(btn);
seenNames.add(text);
} }
}); });
} }