Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

one step

[파이썬] 비동기 화면 크롤링하기 (wait 사용하기) 본문

이것저것 코드/파이썬

[파이썬] 비동기 화면 크롤링하기 (wait 사용하기)

원-스텝 2022. 9. 16. 16:58
반응형
세 번째
프로젝트세 번째 프로젝트는 이 웹페이지에서 진행합니다.
서버와 ajax 통신 이 이루어지는 페이지이므로, wait 기능을 활용해보고, 여러 페이지로부터 데이터를 추출하는 방법을 학습합니다.

지시사항
1) 저번 실습과 마찬가지로, 웹에 있는 데이터를 구조화된 데이터(Structured Data)로 만들기 위해 class 를 먼저 정의합니다. 멤버 변수로 들어가야할 것은 다음과 같습니다.
영화 제목
해당년도
후보등록 수
수상 개수
2) 각 연도별 링크 요소를 찾습니다.
3) 각 연도별 링크 요소를 하나씩 클릭해가며 모든 영화 데이터를 추출해서 Film 인스턴스로 만들어 film_list 에 추가합니다.
4) 그런데 버튼을 클릭하면 데이터를 서버에서 가져오는 ajax 통신이 이루어집니다. 때문에 로딩에 시간이 걸리게 되어 Wait 기능이 필수적입니다. 이 실습에 적절한 Wait 기능을 추가해서 데이터 추출을 해봅시다.
5) film_list 를 이용해서, 10개 이상 후보에 올랐던 작품의 작품명을 사전순으로 정렬하고, 모두 출력해봅시다.
#초기 코드
from typing import NamedTuple

from selenium import webdriver


class Film:
    # 지시사항 1번을 작성하세요.
    


with webdriver.Firefox() as driver:
    driver.get("https://www.scrapethissite.com/pages/ajax-javascript/")

    # 지시사항 2번을 작성하세요.
    
    # 지시사항 3번과 4번을 작성하세요.
    film_list = list()

    # 지시사항 5번을 작성하세요.

 

 

# 완성 코드
from typing import NamedTuple

from selenium import webdriver
import time

class Film(NamedTuple):
    # 지시사항 1번을 작성하세요.
    # def __init__(self, title, year, nominates, awards):
    #     self.title = title
    #     self.year = year
    #     self.nominates = nominates
    #     self.awards = winawardss
    title: str
    year: int
    nominates: int
    awards: int

with webdriver.Firefox() as driver:
    driver.get("https://www.scrapethissite.com/pages/ajax-javascript/")

    # 지시사항 2번을 작성하세요.
    a_list = driver.find_elements_by_class_name('year-link')

    # 지시사항 3번과 4번을 작성하세요.
    film_list = list()

    for a in a_list:
        a.click()

        time.sleep(3)
        tbody = driver.find_element_by_tag_name('tbody')
        tr_list = tbody.find_elements_by_tag_name('tr')

        for tr in tr_list:
            film_list.append(Film(
                title = tr.find_element_by_class_name('film-title').text,
                year = int(a.text),
                nominates = int(tr.find_element_by_class_name('film-nominations').text),
                awards = int(tr.find_element_by_class_name('film-awards').text)
            ))

    # 지시사항 5번을 작성하세요.
    many_nomi_list = list()
    for film in film_list:
        if film.nominates >= 10:
            many_nomi_list.append(film)
    print(sorted(many_nomi_list))
반응형