728x90
웹 스크래핑 실습 |
특정 사이트에서 원하는만큼의 데이터를 스크랩하고 싶다면 어떻게 할 수 있을까?
beautifulsoup library 를 통해 간단하게 web scraping을 실습해보자.
1. 사이트 특정하기
먼저 스크랩하고자 하는 사이트를 특정한다. 이번 실습에서 활용할 사이트는 네이버 웹툰 그중에서도
헬퍼 2 : 킬베로스 를 선택했다.
현재 글 작성시점인 3월 7일 기준으로 292화가 최신화다.
2. 원하는 데이터 선택하기
내가 이 사이트에서 스크랩하고자 하는 내용은 "평균 평점보다 낮은 회차의 목록" 이다.
따라서 회차와 제목, 그리고 평점 데이터를 스크랩해야 할 것이다.
각각 하나씩 확인해보자.
먼저 회차와 제목은 <td> 태그 아래에 <a> 태그에 텍스트로 저장되어있다.
그리고 평점정보는 <div> 태그 아래에 <strong>태그에 텍스트로 저장되어있다.
3. bs4를 이용해서 데이터 스크랩하기
이제 원하는 데이터 텍스트가 담겨있는 태그를 활용해서 실제로 스크랩해보자.
import requests from bs4 import BeautifulSoup #get tltle def GetTitle(title_list): titles = soup.find_all("td",attrs={"class":"title"}) for title in titles: title_list.append(title.a.get_text()) return title_list #get rate def GetRate(cnt,sum,rate_list): rates = soup.find_all("div",attrs={"class":"rating_type"}) for rate in rates: num = rate.strong.get_text() sum = sum + float(num) cnt += 1 rate_list.append(num) return cnt,sum,rate_list sum = 0.0 cnt = 0 title = [] rate = [] page=30 while page>0: url = "https://comic.naver.com/webtoon/list?titleId=670143&weekday=thu" url += "&page="+str(page) res = requests.get(url) res.raise_for_status() soup = BeautifulSoup(res.text, "lxml") title = GetTitle(title) cnt, sum, rate = GetRate(cnt,sum,rate) page = page -1 #평균계산 avg = sum / float(cnt) print("헬퍼 2 : 킬베로스의 "+str(cnt) + "화 평균 평점은 "+str(avg)+" 입니다") print("[+]--------------- 평균 평점 이하 회차 리스트 -------------------[+]") #평균보다 낮은 화 출력 for i in range(len(rate)): if float(rate[i])<avg: print(title[i],rate[i]) |
1. 태그와 클래스를 활용해서 원하는 데이터 리스트를 객체로 얻어낸 다음
2. 텍스트만 추출하기 위해 텍스트를 담고있는 태그에서 get_text 함수를 사용해서 추출한다.
결과
간단한 내용이지만 재밌다
참고
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
728x90
'개인 공부 > WEB' 카테고리의 다른 글
burp suite로 nikto 동작 살펴보기 -2 (0) | 2022.11.12 |
---|---|
burp suite로 nikto 동작 살펴보기 -1 (0) | 2022.11.12 |
[웹해킹] dreamhack file-download (0) | 2021.07.26 |
[웹해킹] dreamhack image-storage (0) | 2021.07.26 |
[웹해킹] dreamhack php-1 (0) | 2021.07.26 |
댓글