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
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]
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]
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
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]
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
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
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
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