70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
import requests
|
|
from bs4 import BeautifulSoup
|
|
import csv
|
|
import sys
|
|
|
|
def scrape_scryfall_checklist(set_code):
|
|
"""
|
|
Scrapes a Scryfall checklist page and saves the card names and numbers
|
|
to a CSV file in alphabetical order, using the provided set code.
|
|
|
|
Args:
|
|
set_code: The three-letter set code (e.g., 'afr').
|
|
"""
|
|
|
|
url = f'https://scryfall.com/sets/{set_code}?as=checklist'
|
|
filename = f'{set_code}_checklist.csv' # Changed file name format
|
|
|
|
response = requests.get(url)
|
|
response.raise_for_status()
|
|
|
|
soup = BeautifulSoup(response.content, 'html.parser')
|
|
card_rows = soup.find_all('tr', {'data-component': "card-tooltip"})
|
|
|
|
card_data = []
|
|
for row in card_rows:
|
|
# Initialize variables with default values
|
|
count = '' # You'll need to add logic for the checkbox later
|
|
name = ''
|
|
edition = ''
|
|
condition = 'NM' # Set condition to 'NM' for all cards
|
|
language = 'en' # Set language to 'en' for all cards
|
|
foil = 'No' # Default to 'No' unless foil information is found
|
|
collector_number = ''
|
|
purchase_price = '' # You'll need to add logic for purchase price later
|
|
|
|
# Extract collector number
|
|
number_link = row.find('td', class_='right').find('a')
|
|
if number_link:
|
|
collector_number = number_link.text.strip()
|
|
|
|
# Extract name
|
|
name_link = row.find('td', class_='ellipsis').find('a')
|
|
if name_link:
|
|
name = name_link.text.strip()
|
|
|
|
# Extract edition (set name)
|
|
set_link = row.find('td').find('a')
|
|
if set_link:
|
|
edition = set_link.text.strip()
|
|
|
|
# Check for foil (you'll need to adjust this based on Scryfall's HTML)
|
|
# if row.find('td', class_='foil-card'): # Example
|
|
# foil = 'Yes'
|
|
|
|
card_data.append([count, name, edition, condition, language, foil, collector_number, purchase_price])
|
|
|
|
# Sort card data alphabetically by name
|
|
card_data.sort(key=lambda x: x[1])
|
|
|
|
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
|
|
writer = csv.writer(csvfile)
|
|
writer.writerow(['Count', 'Name', 'Edition', 'Condition', 'Language', 'Foil', 'Collector Number', 'Purchase Price'])
|
|
writer.writerows(card_data)
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) > 1:
|
|
set_code = sys.argv[1]
|
|
scrape_scryfall_checklist(set_code)
|
|
else:
|
|
print("Error: Please provide a set code (e.g., python main.py afr)") |