본문 바로가기

항해99

[항해99] 웹 개발 종합반 3주차 : Python / Flask

  • 웹 스크래핑

- 인터넷에서 정보를 가져오는 작업 (구조를 가져오는 것)

- 웹 스크래핑 패키지 : pip install requests bs4

 

1. 선택자를 사용하는 방법

- 특정 tag에 계속 접근해 데이터를 가져옴

- soup이란 변수 안에 우리가 원하는 html 정보를 전부 가져옴

- 개발자 도구를 통해 데이터 가져옴

 

* select_one() : 같은 것이 여러개라도 맨 위 데이터 가져옴

* select() : 같은 조건에 있는 태그들을 묶어 리스트로 저장

출처 : 스파르타 코딩클럽

 

2. 원하는 데이터의 태그 속성을 잘 살펴보기 (어떤 태그인지 (div 등), 클래스 이름(temperature_text 등))

3. .text를 이용해서 글자 가져오기 (html 태그 데이터)

temp = soup.select_one('.temperature_text')
print(temp.text)

 

4. contents 명령어로 데이터 뽑아내기

- list 안에 있는 자료를 알아서 쪼개줌

temp = soup.select_one('.temperature_text > strong').contents[1]

 

  • Flask

- 사용자의 요청에 맞춰 HTML 파일을 응답해주는 서버

 

1. 정해진 폴더 구조가 있음

- templates 폴더는 고정

- 첫 페이지는 보통 index.html을 사용

- app.py 변경 가능 but, 라이브러리와 같은 이름은 불가능

 

2. 프레임 워크 중 하나

3. render_template : Flask 내장 함수 -> html 파일을 불러 올 수 있음 (임포트 필요)

4. 데이터 넘겨주기

- 원하는 데이터를 변수에 넣고 render_template('index.html', 데이터 이름 = 데이터) 방식으로 코드 추가 -> html에서 정해둔 데이터 이름으로 python 서버의 데이터 사용가능

@app.route('/')
def home():
    name = "사나"
    return render_template('index.html', data=name)

 

5. 넘겨준 데이터를 HTML에서 사용 (Python -> HTML)

- {{ 변수명 }} : Python 서버 --데이터--> {{ 변수명 }} -> HTML 사용

 

6. 여러개 넘겨주기

- key 값에는 HTML에서 사용할 이름 / 값에는 Python 변수 넣기

 

7. HTML에서 반복문 사용하기

- ffor(자동완성) 사용

<body>
    <h1>안녕, {{ data.name }}</h1>
    <h2>로또 번호: {{ data.lotto }}</h2> # data.lotto 이 부분에 데이터 넣기

    {% for number in data.lotto %}
            {{ number }}
    {% endfor %}
</body>

 

- 반복문 + HTML 태그 (ol 태그 : 순서가 있는 리스트)

<body>
    <h1>안녕, {{ data.name }}</h1>
    <h2>로또 번호: {{ data.lotto }}</h2>
    <ol>
        {% for number in data.lotto %}
        <li>{{ number }}</li>    
        {% endfor %}
    </ol>
</body>

 

8. 같은 요소의 개수 확인 (교집합 구하기)

@app.route("/")
def home():
    name = "사나"
    lotto = [16, 18, 20, 23, 32, 43]

    def generate_lotto_numbers():
        numbers = random.sample(range(1, 46), 6)
        return sorted(numbers)

    random_lotto = generate_lotto_numbers()

    def count_common_elements(list1, list2):
      common_elements = set(list1) & set(list2)
      return len(common_elements)

    common_count = count_common_elements(lotto, random_lotto) # (lotto, random_lotto) 이 부분에 사용하는 요소 넣어주기

    context = {
        "name": name,
        "lotto": lotto,
				"random_lotto": random_lotto,
    }

    return render_template("index.html", data=context)

 

* 이미 사용중인 주소라고 뜰 때

app.run('0.0.0.0', post = 5001, debug=True) : 5001 부분에 숫자 바꿔주기

* 이미지 삽입 : static(폴더 생성, 고정) -> image(폴더 생성) -> 사진 넣기

* url_for('경로') : 위치를 나타 낼 때 사용

 

9. 검색어 받아오기

- request.args.get('name 속성명') : form에서 입력한 데이터를 받아 올 수 있음(request 임포트 해줘야함)

 

10. 검색 데이터 받아오기

- pip install requests 설치

import requests

@app.route("/movie")
def movie():
    query = request.args.get('query') # 검색어
    URL = f"http://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=f5eef3421c602c6cb7ea224104795888&movieNm={query}" # URL

    res = requests.get(URL) # url을 요청한다.
    rjson = res.json()
    movie_list = rjson["movieListResult"]["movieList"]
		
		return render_template("movie.html", data=movie_list)

 

보완해야 하는 부분 / 아쉬웠던 점
뭔가 한참 건너 뛰고 배운 느낌이 강하게 들었다.
flask 사용하는 부분도 보면 이해가 되지만 막상 코드를 짜려니 어려웠다.
그래서 챗 gpt에 따로 예제를 받아서 공부했다.