본문 바로가기

IT&코딩/python

python 4주차 복습-4

728x90
반응형
포켓몬고 사이트에서 포켓몬 이름을 제목으로 한 포켓몬 png 파일 크롤링해오기.

내 풀이

import requests
from bs4 import BeautifulSoup

soup = BeautifulSoup(res.text, "html.parser")


for i in soup.select("li>a")[328:1040]:
    이름=i.select_one(".pokemonname").text
    경로="https:"+i.select_one("img").get("src")
    # print(이름.text)
    # print(경로)
    r=requests.get(경로)
    f=open(f"포켓몬/{이름}.png","wb")
    f.write(r.content)
-----------------------------------------------------------------------------------------------------------------------------
T풀이
 
import requests
from bs4 import BeautifulSoup
import os

if os.path.isdir("포켓몬"):
    pass
else:
    os.mkdir("포켓몬")

soup = BeautifulSoup(res.text, "html.parser")

for i in soup.select(".pokemonicon") :
    이름 = i.select_one("span").text
    링크 = 'https:' + i.select_one("img").get("src").replace("pokemonicon", "pokemonimage")
    r = requests.get(링크)
    f = open(f"포켓몬/{이름}.png", "wb")
    f.write(r.content)

-----------------------------------------------------------------------------------------------------------------------------

# 실습

import os

#os.listdir(x)
# x 하위의 파일, 폴더 이름들을 리스트로 반환
# x 의 default 값은 현재경로

li=os.listdir("실습")
# print(li)

# 1. 실습 아래의 파일, 각각의 글자수 출력

for i in li:
    f=open(f"실습/{i}","r",encoding="utf-8")
    print(f"{i}파일의 글자수>{len(f.read())}")
# 2. 현재 경로에 파일의 개수 폴더의 개수 출력하기

# os.path.isdir(x) x라는 폴더가 존재하면, x가 폴더이면 True, 아니면 False
# os.path.isfile(x) x라는 파일이 존재하면, x가 파일이면 True 아니면 False

import os

li=os.listdir()
fol,pil=0,0

for i in li:
    if os.path.isdir(i):
        fol+=1
    elif os.path.isfile(i):
        pil+=1
print(fol)
print(pil)
# 3. 퇴근 3시간전 여기있는 파일들의 이름을 바꿔야 한다.

# 파일번호_파일이름.py > [kgit]파일번호(2022)_파일이름.py

# 001_print.py        > [kgit]001(2022)_print.py
# 002_주석.py         >  [kgit]002(2022)_주석.py
# ......
 
# os.rename(A,B)
# A, B : 상대경로를 포함한 파일이름

import os

for i in os.listdir("실습"):
    바꿀이름=(f"[kgit]{i[:3]}(2022){i[3:]}")
    # print(바꿀이름)
    os.rename(f"실습/{i}",f"실습/{바꿀이름}")
 
# 4. 포켓몬 폴더의 파일 형식을 다음과 같이 바꿔주시면 됩니다.

# ===============================================
# 1.이상해씨 .png > 001_이상해씨.png
# 2.이상해풀 .png > 002_이상해풀.png
# ...
# ===============================================
# 이 때 새로운 표현이 필요합니다

# 문자열메서드 zfill 인데요. 일명 zerofill 이라고도 불러요
# idle 를 켜주시고 다음의 세 명령어를 입력해보시면 이해되실거에요
# "1".zfill(3)
# "12".zfill(3)
# "123".zfill(3)

# 그리고 자세히보시면 포켓몬이름 뒤에 공백이 있는데 그것도 제거해주세요~

import os
print(os.listdir("포켓몬"))
for i in os.listdir("포켓몬"):
    A=i.split(".")
    B=f"{A[0].zfill(3)}_{A[1].strip()}.png"
    os.rename(f"포켓몬/{i}",f"포켓몬/{B}")

# 5. pillow

from PIL import Image

img=Image.open("포켓몬/001_이상해씨.png")
img=img.resize((500,500)) # 튜플 값이 들어감
img.show() # 이미지계의 print
img.save("거다이맥스이상해씨.png")

print(img.size) # 가로세로 픽셀수
print(img.mode) # 색상모드
# 6. 포켓몬 500이라는 폴더에 모든 포켓몬 사진을 500x500으로 확대해서 저장하세요.

from PIL import Image
import os

li=os.listdir("포켓몬")

for i in li:
    img=Image.open(f"포켓몬/{i}")
    img=img.resize((500,500))
    img.save(f"포켓몬500/{i}")
# 7. pillow 검정색으로 칠해버리기 ~

from PIL import Image
img=Image.open("포켓몬500/001_이상해씨.png")
print(img.getpixel((0,0))) # 안에 튜플값! 0,0 의 색상정보를 반환

# (0,0,0,0)
# red green blue a(투명도)
# 0,0,0 검은색 0 투명 255 선명
# 0,0,0,255 검은색 0,0,0,0 투명색

print(img.getpixel((250,250)))

# 500이면 499까지만 가능, 그리고 왼쪽 위 모서리가 0,0

img.putpixel((0,0),(0,0,0,255)) # 두 개의 튜플 (좌표,색) 0,0에 검은색 칠함
img.putpixel((0,1),(0,0,0,255))
img.putpixel((0,2),(0,0,0,255))
img.putpixel((0,3),(0,0,0,255))
img.putpixel((0,4),(0,0,0,255))
img.putpixel((0,5),(0,0,0,255))
img.putpixel((0,6),(0,0,0,255))
img.putpixel((0,7),(0,0,0,255))
img.putpixel((0,8),(0,0,0,255))
img.putpixel((0,9),(0,0,0,255))
img.show()
# 색상값 정보를 추출한다
# 색상값이 존재하는 모든 색을 검정색으로 바꾼다

from PIL import Image

img=Image.open("포켓몬500/001_이상해씨.png")

for i in range(0,500):
        for j in range(0,500):
               
                rgba=img.getpixel((i,j))
                if rgba[3]>30:
                      img.putpixel((i,j),(0,0,0,255))  
             
img.show()
# 8. 포켓몬 500에있던 친구들 전부 "포켓몬그림자"에 뭘까요 상태로 저장

from PIL import Image
import os

li=os.listdir("포켓몬500")

for k in li:
    img=Image.open(f"포켓몬500/{k}")
    for i in range(0,500):
        for j in range(0,500):
            rgba=img.getpixel((i,j))
            if rgba[3]>30:
                img.putpixel((i,j),(0,0,0,255))
    img.save(f"포켓몬그림자/{k}")

# 포켓몬 맞추기 게임

import os
from random import randint as ri
from PIL import ImageTk
import tkinter as tk
from tkinter import messagebox

window = tk.Tk()
window.geometry("500x900")
window.title("뭘까요?")
window.resizable(False, False)

score = 0
life = 5
포켓몬목록 = os.listdir("포켓몬그림자")

la = tk.Label(window)
la.pack()

lalife = tk.Label(window, font=("맑은고딕", 30, "bold"), fg="red")
lalife.pack()

보기인덱스 = set()

def 문제출제():
    global 정답인덱스, 보기인덱스
    정답인덱스 = ri(0, len(포켓몬목록)-1)
    img = ImageTk.PhotoImage(file=f"포켓몬그림자/{포켓몬목록[정답인덱스]}")
    la["image"] = img
    la.image = img
    보기인덱스 = set()
    보기인덱스.add(정답인덱스)

    while True:
        보기인덱스.add(ri(0, len(포켓몬목록)-1))
        if len(보기인덱스) == 5:
            break
    보기인덱스 = list(보기인덱스)

    for i in range(5):
        button[i]["text"] = 포켓몬목록[보기인덱스[i]].split(".")[0].split("_")[1].strip()
   
    lalife["text"] = "♥ "*life + "♡ "* (5-life)

def 채점(idx):
    global 정답인덱스, 보기인덱스, score, life
   
    if 보기인덱스[idx] == 정답인덱스:
        score += 100
        img = ImageTk.PhotoImage(file=f"포켓몬500/{포켓몬목록[정답인덱스]}")
        la["image"] = img
        la.image = img
        messagebox.showinfo("CORRECT!!", "정답입니다.")
        문제출제()
    else:
        life -= 1
        if life == 0:
            messagebox.showinfo("GAME OVER", f"당신의 점수는 {score} 입니다.")
            exit()
    lalife["text"] = "♥ "*life + "♡ "* (5-life)
   

button = [None]*5
for i in range(5):
    button[i] = tk.Button(window, command=lambda x=i:채점(x), width=20, font=("맑은고딕", 20, "bold"), fg="blue")
    button[i].pack()


문제출제()

window.mainloop()
728x90
반응형

'IT&코딩 > python' 카테고리의 다른 글

python - 함수의 간결성을 이용한 프로그램  (0) 2022.09.13
python - 함수 심화  (0) 2022.09.13
python 4주차 복습-3  (0) 2022.07.31
python 4주차 복습-3  (0) 2022.07.29
python 4주차 복습-2  (0) 2022.07.29