본문 바로가기

Python/실습

[웹크롤링: bs4, requests] 네이버 날씨 미세먼지 가져오기 / 네이버 웹툰 제목 가져오기 / 네이버 웹툰 썸네일 가져오기

작업 환경 구성

> mkdir webCrawling
> cd webCrawling
> python -m venv myvenv
> myvenv\Scripts\activate
> python -m pip install --upgrade pip
> pip install requests
> pip install BeautifulSoup4

 

네이버 날씨 미세먼지 가져오기

# 네이버 날씨에서 미세먼지 지수 가져오기
from bs4 import BeautifulSoup as bs
from pprint import pprint
import requests

html = requests.get('https://search.naver.com/search.naver?sm=top_hty&fbm=0&ie=utf8&query=%EB%82%A0%EC%94%A8') #네이버 날씨 웹페이지 가져오기
soup = bs(html.text, 'html.parser') #파싱을 통해 분석하여 html 요소들에 쉽게 접근 가능
data1 = soup.find('div', {'class':'detail_box'}) #매칭되는 처음 1개만 반환
data2 = data1.findAll('dd') #매칭되는 모든 애들 반환-> 0:미세먼지, 1:초미세먼지, 2:오존지수
data3 = data2[0].find('span', {'class':'num'}).text #미세먼지 지수만 뽑아서 텍스트로 반환
data4 = data2[1].find('span', {'class':'num'}).text #초미세먼지 지수만 뽑아서 텍스트로 반환

pprint(data3) #미세먼지
pprint(data4) #초미세먼지

 

네이버 웹툰 제목 가져오기

월요일 웹툰 제목을 가져와보자

from bs4 import BeautifulSoup as bs
from pprint import pprint
import requests

html = requests.get('https://comic.naver.com/webtoon/weekday.nhn')
soup = bs(html.text, 'html.parser')
html.close()

data1 = soup.find('div', {'class':'col_inner'})
data2 = data1.findAll('a', {'class':'title'})

for i in data2:
    pprint(i.text)

 

 

모든 요일 웹툰 제목을 가져와보자

from bs4 import BeautifulSoup as bs
from pprint import pprint
import requests

# 웹 페이지 열고 소스코드 가져오기
html = requests.get('https://comic.naver.com/webtoon/weekday.nhn')
soup = bs(html.text, 'html.parser')
html.close()

# 요일별 웹툰 영역 추출
data1_list = soup.findAll('div', {'class':'col_inner'})

week_title_list = [] # 전체 웹툰 리스트

for data1 in data1_list:
    data2 = data1.findAll('a', {'class':'title'}) # 요일별 제목 리스트 추출

    title_list = [t.text for t in data2] # 요일별 제목 리스트 텍스트만 추출

    #week_title_list.extend(title_list) # 단순히 값을 붙이는 경우
    week_title_list.append(title_list) # 요일별로 나눠서 2차원 리스트를 만드는 경우

pprint(week_title_list)

 

사실...

div class="col_inner"을 거치지 않더라도

a class="title"부터 찾아서 제목 추출 가능. 간단하게!

 

네이버 웹툰 썸네일 가져오기

from bs4 import BeautifulSoup as bs
from pprint import pprint
import requests, re, os, errno
from urllib.request import urlretrieve # 이미지 또는 동영상 링크 다운로드

try:
    if not (os.path.isdir('image')): # image 디렉토리가 있는지 확인
        os.makedirs(os.path.join('image'))
except OSError as e:
    if e.errno != errno.EEXIST:
        print("폴더 생성 실패!")
        exit()

# 웹 페이지 열고 소스코드 가져오기
html = requests.get('https://comic.naver.com/webtoon/weekday.nhn')
soup = bs(html.text, 'html.parser')
html.close()

# 요일별 웹툰 영역 추출
data1_list = soup.findAll('div', {'class':'col_inner'})

li_list = []

for data1 in data1_list:
    li_list.extend(data1.findAll('li'))

for li in li_list:
    img = li.find('img') # img 태그 추출
    title = img['title'] # 속성값 추출
    img_src = img['src']
    #print(title, img_src)

    title = re.sub('[^0-9a-zA-Zㄱ-힗]', '', title) # 파일명에 특수기호가 들어있으면 삭제한다
    urlretrieve(img_src, './image/'+title+'.jpg') # 파일경로+파일명+확장자

 

참고

파이썬 레시피 - 웹 활용 입문편

https://wikidocs.net/35947

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net