ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CIVITAI에서 이미지 정보를 가져오는 방법
    IT 2024. 11. 7. 16:59
    반응형

    CIVITAI

    이미지 생성을 위한 다양한 모델을 공유하고, 사용자가 생성한 이미지와 관련 정보를 나눌 수 있는 플랫폼입니다. 

    Civitai web scraper 

    Civitai Web Scraper는 ScreamingHawk가 만든 스크립트로, API를 통해 Civitai의 정보를 일괄적으로 수집할 수 있는 방법을 제공합니다. 

    GitHub 링크 : https://github.com/ScreamingHawk/civitai-web-scraper

    설치 방법

    설치할 폴더에서 명령 프롬프트(cmd)를 열고, 아래 명령어를 입력합니다. 이를 통해 civitai-web-scraper 폴더가 C 드라이브에 생성되며, 스크립트가 설치됩니다. 

    git clone https://github.com/ScreamingHawk/civitai-web-scraper.git

    C드라이브의 civitai-web-scraper 폴더에 설치된다

     

    사용방법

    1. civitai-web-scraper 폴더에 있는 config.example.ini 파일의 이름을 config.ini로 변경합니다. 이는 처음 실행할 때 한 번만 설정합니다. 

    2. civitai-web-scraper 폴더에 out 폴더를 만듭니다. 

    3. 명령 프롬프트를 열고 다음 명령어를 차례대로 입력합니다. 

    폴더를 열고 경로 부분에 'cmd'를 입력하면 해당 폴더의 명령 프롬프트가 열린다

    py -m venv venv    가상환경을 생성
    .\venv\Scripts\activate    가상환경을 활성화
    py -m pip install -r requirements.txt    필수 라이브러리 설치(처음 실행할 때 한번만 실행)
    py scrape_civitai.py    스크립트 실행

    위와 같은 방법으로 Civitai Web Scraper를 설치하고 실행할 수 있습니다. 

    Config.ini

    Civitai Web Scraper의 설정파일입니다. 다음 항목을 포함하고 있습니다. 

     

    OutputDir=out : 저장할 경로를 지정합니다. (기본값: out)

    Pages=10 : 스크랩할 페이지 수를 설정합니다. (기본값: 10)

    PageStart=1 : 스크랩을 시작할 페이지 번호를 설정합니다. (기본값: 1)

    NSFWLevel= : NSFW 콘텐츠의 필터링 수준을 설정합니다. (기본값 없음)

    ServerPort=8000 : 서버의 포트 번호를 지정합니다. (기본값: 8000)

    ItemsPerPage=100 : 한 페이지당 가져올 항목 수를 설정합니다. (기본값: 100)

    LocalImages=False : 이미지를 로컬에 다운로드할지 여부를 설정합니다. (True이면 다운로드, False이면 다운로드 안 함)

    Execute

    Civitai Web Scraper를 실행하면 이미지의 정보는 JSON 파일로 저장되고, 이미지는 JPG 파일로 저장됩니다. 이 스크립트는 페이지 1~10까지의 데이터를 각각 100개씩 가져올 수 있습니다. 페이지 11이상에서는 오류가 발생하며, 한 페이지당 100개를 초과하는 항목은 가져올 수 없습니다.

    Modified Code

    import os
    import json
    import requests
    import configparser
    import time

    # Configuration
    config = configparser.ConfigParser()
    config.read("config.ini")
    output_dir = config["DEFAULT"]["OutputDir"]
    nsfw_level = config["DEFAULT"]["NSFWLevel"]
    local_images = config["DEFAULT"]["LocalImages"] == 'True'
    limit = 100  # 페이지당 이미지 개수

    # 첫 번째 요청 URL 설정
    url = f"https://civitai.com/api/v1/images?limit={limit}&sort=Most Reactions&nsfw={nsfw_level}"

    while url:
        print(f"Requesting: {url}")
        response = requests.get(url)

        if response.status_code == 200:
            data = response.json()
            
            # 데이터 처리
            for item in data.get("items", []):
                item_id = item["id"]
                img_filename = f"{output_dir}/{item_id}.jpg"
                txt_filename = f"{output_dir}/{item_id}.txt"
                
                # TXT 파일 저장 확인 및 생성
                if os.path.isfile(txt_filename):
                    print(f"File {txt_filename} already exists.")
                else:
                    print(f"Saving {txt_filename}.")
                    with open(txt_filename, "w") as f:
                        f.write(json.dumps(item, indent=1))  # JSON 데이터를 문자열로 변환 후 저장
                    
                    # 이미지 다운로드 (메타데이터와 이미지 URL이 있을 때)
                    if item.get("meta") and item.get("url") and local_images:
                        image_response = requests.get(item["url"])
                        if image_response.status_code == 200:
                            with open(img_filename, "wb") as f:
                                f.write(image_response.content)
                            print("Image saved successfully!")
                        else:
                            print("Error saving image:", image_response.status_code)
            
            # 다음 페이지 URL로 설정 (metadata.nextPage 사용)
            url = data["metadata"].get("nextPage")
            if url:
                print(f"Moving to next page: {url}")
                time.sleep(1)  # 호출 제한을 피하기 위해 대기 시간 추가
        else:
            print("Error:", response.status_code)
            break

    11페이지 이상에서 발생하는 오류를 수정한 코드입니다. 전체 페이지의 데이터를 가져오며, 데이터 파일은 텍스트 파일로 저장됩니다. config.ini의 OutputDir, NSFWLevel, LocalImages 항목을 사용하며, 사용법은 Civitai Web Scraper와 동일합니다. scrape_civitai.py 파일의 내용을 위 코드로 바꾸면 됩니다.

     

     

    Thank you, ScreamingHawk, for creating the excellent Civitai Web Scraper

     

    반응형

    댓글

Designed by Vitual Stylist