1. 크롬 옵션 설정
크롬 브라우저 옵션을 설정하여 불필요한 에러 메시지를 없애고, 자동화 탐지를 회피하기 위해 프로필을 위조합니다. 브라우저를 생성하여 이후의 웹 스크래핑 작업에 사용합니다.
import selenium
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time
import json
# 크롬 옵션
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
# 불필요한 에러 메시지 없애기
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])
# 자동화기계 방지 뚫기+프로필 위조
chrome_options.add_argument("disable-gpu") # GPU 가속 끄기
chrome_options.add_argument("lang=ko_KR") # 언어 설정
chrome_options.add_argument('user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36') # user-agent 위조
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) # 자동화된 소프트웨어 제어 문구 삭제
chrome_options.add_argument(r'user-data-dir=C:\User Data')
# 브라우저 생성
browser = webdriver.Chrome(options=chrome_options)
2.분기 링크 리스트 제작
2000년부터 2024년까지 각 분기별로 애니메이션 정보를 제공하는 링크 리스트를 생성합니다.
# 분기 링크 리스트 제작
def GetQuarterLink():
QuarterLinkList=[]
baseLink="https://anime.onnada.com/"
time.sleep(1)
for year in range(2000, 2025):
for quarter in range(1, 5):
QuarterLinkList.append(baseLink + str(year) + "." + str(quarter) + ".php")
return QuarterLinkList
3.애니메이션 링크 얻기
주어진 분기 링크에서 애니메이션 링크를 추출합니다. 각 애니메이션 제목 요소를 찾아 링크를 수집합니다.
# 애니메이션 링크 얻기
def GetAnimationLink(QuarterLinkList):
time.sleep(0.5)
AnimationLinkList=[]
AnimeList=browser.find_elements(By.CLASS_NAME, "title")
for element in AnimeList:
try:
a_tag = element.find_element(By.TAG_NAME, "a")
href = a_tag.get_attribute("href")
AnimationLinkList.append(href)
except:
continue
return AnimationLinkList
4. 애니메이션 데이터 얻기
각 애니메이션 링크에서 상세 정보를 추출합니다. 애니메이션 이름, 이미지 링크, 방영 연도를 가져와 딕셔너리 형태로 저장합니다.
# 애니메이션 데이터 얻기
def GetAnimationData():
time.sleep(0.2)
try:
AnimationName=browser.find_elements(By.TAG_NAME,"h1")[0].text
AnimationImage=browser.find_elements(By.CLASS_NAME,"image")[0].find_element(By.TAG_NAME, "div").find_element(By.TAG_NAME, "a").get_attribute("href")
AnimationInfoList=browser.find_elements(By.CLASS_NAME,"list")[0].find_elements(By.TAG_NAME, "p")
for Animationinfo in AnimationInfoList:
Year=Animationinfo.find_elements(By.CLASS_NAME, "block")[1].text
if(Year[:2]=='20'):
AnimationYear=Year.split(" ")[0].replace('.','-')
break
Animationinfo = {
"AnimationName": AnimationName,
"AnimationImg": AnimationImage,
"AnimationYear": AnimationYear
}
AnimationinfoList.append(Animationinfo)
print(Animationinfo, end="")
print(",")
except:
return
5. 메인 실행 코드
분기 링크를 통해 애니메이션 정보를 수집하고, 각 애니메이션의 세부 정보를 추출한 후, 결과를 JSON 파일로 저장합니다.
# 애니 정보 리스트
AnimationinfoList=[]
# 분기 링크 리스트
QuarterLinkList = GetQuarterLink()
# 이후 분기 리스트 반복
for QuarterLink in QuarterLinkList:
browser.get(QuarterLink)
# 애니 리스트 얻기
AnimationLinkList = GetAnimationLink(QuarterLink)
# 각 애니 데이터 얻기
for AnimationLink in AnimationLinkList:
browser.get(AnimationLink)
GetAnimationData()
# 결과를 JSON 파일로 저장
with open("animations.json", "w", encoding="utf-8") as json_file:
json.dump(AnimationinfoList, json_file, ensure_ascii=False, indent=4)
https://github.com/asa9874/Python_small_projects/tree/main/09_CrolAnimationData
'Language > Python' 카테고리의 다른 글
[Python] langchain + VoiceVox 로 tts 챗봇 만들기 (0) | 2025.01.12 |
---|---|
[Python]카카오톡 단어 분석 프로그램2 (카톡 시간대분석) (0) | 2024.07.16 |
[오류][Python] 가상환경을 활성화해도 적용이 안될때 (0) | 2024.07.12 |