Exemple #1
0
def get_webtoon_episode_list(webtoon_id):
    soup = open_webtoon_html(webtoon_id)

    episode_list = list()
    tr_list = soup.find_all('tr')
    for tr in tr_list:
        if tr.attrs == {'class': ['band_banner']} or tr.th:
            continue
        td_list = tr.find_all('td')
        td_thumbnail = td_list[0]
        td_title = td_list[1]
        td_rating = td_list[2]
        td_created_date = td_list[3]

        # In order to find no, we go in to the a tag -> parse href -> from the query dictionary find 'no'
        td_list_a_tag = td_list[0].a
        parsed_a_tag = urlparse(td_list_a_tag['href'])
        no = parse_qs(parsed_a_tag.query)['no'][0]

        img_url = td_list[0].img['src']

        title = td_list[1].get_text(strip=True)

        rating = td_list[2].strong.get_text(strip=True)

        created_date = td_list[3].get_text(strip=True)

        episode = Episode(no=no,
                          img_url=img_url,
                          title=title,
                          rating=rating,
                          created_date=created_date)
        episode_list.append(episode)

    return episode_list
Exemple #2
0
def load_episode_list_from_file(path):
    """
    path에 해당하는 file을 읽어 Episode 리스트를 생성해 리턴
    """

    with open(path, 'rt') as f:
        return [Episode._make(line.strip().split('|')) for line in f]
Exemple #3
0
def load_episode_list_from_file(path):
    """
    path에 해당 하는 file을 읽어 Episode리시트를 생성해 리턴

    :param path:
    :return:
    """
    # 리스트 형태로 담을 episode_list 정의

    with open(path, 'rt') as f:
        return [Episode._make(line.strip().split('|')) for line in f]
Exemple #4
0
def get_webtoon_episode_list(webtoon_id, page=1):
    """
    특정 page의 episode 리스트를 리턴하도록 리팩토링
    :param webtoon_id: 웹툰 고유 ID
    :param page: 가져오려는 Episode list 페이지
    :return: list(Episode)
    """
    # webtoon_url을 기반으로 특정 웹툰의 리스트페이지 내용을 가져와 soup객체에 할당
    webtoon_list_url = 'http://comic.naver.com/webtoon/list.nhn'
    params = {
        'titleId': webtoon_id,
        'page': page,
    }
    response = requests.get(webtoon_list_url, params=params)
    soup = BeautifulSoup(response.text, 'lxml')

    # 필요한 데이터들 (img_url, title, rating, created_date)추출
    episode_list = list()
    webtoon_table = soup.select_one('table.viewList')
    tr_list = webtoon_table.find_all('tr', recursive=False)
    for tr in tr_list:
        td_list = tr.find_all('td')
        if len(td_list) < 4:
            continue
        td_thumbnail = td_list[0]
        td_title = td_list[1]
        td_rating = td_list[2]
        td_created_date = td_list[3]

        # Episode고유의 no
        url_episode = td_thumbnail.a.get('href')
        parse_result = urlparse(url_episode)
        queryset = parse_qs(parse_result.query)
        no = queryset['no'][0]
        # td_thumbnail에 해당하는 Tag의 첫 번째 a tag의 첫 번째 img태그의 'src'속성값
        img_url = td_thumbnail.a.img.get('src')
        # td_title tag의 내용을 좌우여백 잘라냄
        title = td_title.get_text(strip=True)
        # td_rating내의 strong태그내의 내용을 좌우여백 잘라냄
        rating = td_rating.strong.get_text(strip=True)
        # td_title과 같음
        created_date = td_created_date.get_text(strip=True)

        # Episode형 namedtuple객체 생성, episode_list에 추가
        episode = Episode(
            no=no,
            url_thumbnail=img_url,
            title=title,
            rating=rating,
            created_date=created_date
        )
        episode_list.append(episode)

    return episode_list
Exemple #5
0
def load_episode_list_from_file(path):
    """
    path에 해당하는 file을 읽어 Episode리스트를 생성해 리턴
    1. file객체 f할당
    2. readline()함수를 이용해 한줄씩 읽기 <- 다른방법도 있습니다
    3. 한줄을 쉼표단위로 구분해서 Episode객체 생성
    4. 객체들을 하나의 리스트에 담아 리턴
    :param path:
    :return:
    """
    with open(path, 'rt') as f:
        return [Episode._make(line.strip().split('|')) for line in f]
Exemple #6
0
def get_webtoon_episode_list(titleId,weekday,page=1):
    payload = {'titleId':titleId , 'weekday':weekday, 'page':page }
    response = requests.get('http://comic.naver.com/webtoon/list.nhn', params=payload)
    source = response.text
    soup = BeautifulSoup(source, 'lxml')

    # 필요한 데이터들 (img_url, title, rating, created_date)추출
    episode_list = list()
    webtoon_table = soup.select_one('table.viewList')   # class = 'viewList'인 '첫번째' <table> 태그 안의 html 반환
    tr_list = webtoon_table.find_all('tr', recursive=False) # 그 안에서 모든 <tr> 태그의 html 반환. recursive=False 설정은 자식 태그만 반환

    for i, tr in enumerate(tr_list):
        td_list = tr.find_all('td')
        if len(td_list) < 4:        # 배너광고 차단
            continue
        td_thumbnail = td_list[0]   # td_thumbnail에 해당하는 Tag의 첫 번째 a tag의 첫 번째 img태그의 'src'속성값
        img_url = td_thumbnail.a.img.get('src')
        title_url = td_thumbnail.a.get('href')
        parsed_url = urlparse(title_url)    # url 쪼개기 (6개 항목의 namedtuple 반환. 그러나 그 외의 다른 속성도 참조할 수 있음. 예를 들어 port, geturl(url전체 반환))
        queryset = parse_qs(parsed_url.query)   # query 쪼개기 (string:[string]구조의 딕셔너리로 반환)
        no = queryset['no']
        titleId = queryset['titleId']

        td_title = td_list[1]
        title = td_title.get_text(strip=True)               # td_title tag의 내용을 좌우여백 잘라냄

        td_rating = td_list[2]
        rating = td_rating.strong.get_text(strip=True)      # td_rating내의 strong태그내의 내용을 좌우여백 잘라냄

        td_created_date = td_list[3]
        created_date = td_created_date.get_text(strip=True) # td_title과 같음

        episode = Episode(     # Episode형 namedtuple객체 생성, episode_list에 추가
            no=no[0],
            titleId=titleId[0],
            img_url=img_url,
            title=title,
            rating=rating,
            created_date=created_date
        )
        episode_list.append(episode)

    # for episode in episode_list:
    #     print('\n', episode)
    return episode_list
Exemple #7
0
def load_episode_list_from_file(path):
    """
    path에 해당하는 file을 읽어 Episode리스트를 생성해 리턴
    1. file객체 f할당
    2. readline()함수를 이용해 한줄씩 읽기 <- 다른방법도 있습니다
    3. 한줄을 '|'단위로 구분해서 Episode객체 생성
    4. 객체들을 하나의 리스트에 담아 리턴
    :param path:
    :return:
    """
    with open(path, 'rt') as f:
        # String 객체의 메서드 strip은 문자열 양쪽의 공백을 지운다.
        # 공백을 지운 후 '|'로 나누어 다시 저장한다.
        # collections.namedtuple의
        # _make 함수는 기존에 생성된 namedtuple()에 새로운 인스턴스를 생성하는 메소드
        # 즉, Episode namedtuple(class라고 생각하면 쉽다.)의 인스턴스를 하나 더 생성
        episode_list = list()
        for line in f:
            episode_list.append(Episode._make(line.strip().split('|')))
        return episode_list
Exemple #8
0
def get_webtoon_episode_list(webtoon_id, page=1):
    base_url = "http://comic.naver.com/webtoon/list.nhn?"
    params = {
        'titleId': webtoon_id,
        'page': page,
    }
    response = requests.get(base_url, params=params)
    soup = BeautifulSoup(response.text, 'lxml')
    webtoon_table = soup.select_one('table.viewList')
    tr_list = webtoon_table.find_all('tr', recursive=False)

    # List 정의
    episode_list = list()

    for tr in tr_list:
        td_list = tr.find_all('td')
        if len(td_list) < 4:
            continue
        image = tr.select_one('img')['src']
        # Episode 고유의 no
        url_episode = tr.a.get('href')
        parse_result = urlparse(url_episode)
        queryset = parse_qs(parse_result.query)
        no = queryset['no'][0]
        # image_url = td_image['src']s
        # print(image_url)
        title = tr.select_one('td.title').get_text(strip=True)
        # title = td_title.get_text(strip=True)
        # print(title)
        rate = tr.select_one('div.rating_type').get_text(strip=True)
        # rate = td_rate.get_text(strip=True)
        # print(rate)
        date = tr.select_one('td.num').get_text(strip=True)
        # date = td_date.get_text(strip=True)
        # print(date)
        p = Episode(no, image, title, rate, date)
        episode_list.append(p)
    return episode_list
Exemple #9
0
def load_episode_list_from_file(path):
    Episode = namedtuple('Episode', ['no','titleId', 'img_url', 'title', 'rating', 'created_date'])
    with open(path, 'rt') as file:
        episode_list = [Episode._make(line.split('|')) for line in file]
    return episode_list