feat: Implement GameTora scraper for Umamusume support cards, including details, effects, hints, events, and image downloads.
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user