웹 크롤링 입문- 특정 URL에서 데이터 가져오기

2020. 7. 24. 20:45Python

** 참고 : "파이썬 레시피 - 웹 활용 입문편" by.반원
https://wikidocs.net/book/2965

** 목차
0. 필요한 라이브러리 설치
1. 특정한 데이터 크롤링
2. 특정한 여러 데이터 크롤링
3. 웹페이지의 이미지 데이터 다운로드

 

0. 필요한 라이브러리 설치

Python을 이용하여 웹을 크롤링하기 위해서는 다음과 같은 도구가 필요하다.

* requests :  웹페이지 데이터를 가져오는 모듈

* BeautifulSoup4 :  가져온 웹페이지를 분석하여 원하는 정보를 추출하는 모듈

 

[ Cmd창 ]

$ pip install requests

$ pip install BeautifulSoup4

 

 

1. 특정한 데이터 크롤링

네이버에 '날씨'라고 검색했을 때의 웹페이지를 크롤링하여

미세먼지와 초미세먼지 지수를 출력하는 코드

크롤링할 '날씨' 검색결과 화면과 html 코드

from bs4 import BeautifulSoup as bs
import requests

# html로 작성된 웹페이지 코드를 반환
# html언어 구조: <태그 속성=속성값> 텍스트 </태그>
html = requests.get('https://search.naver.com/search.naver?query=날씨')
soup = bs(html.text,'html.parser')

# find(태그, {속성: 속성값})
# 처음 매칭된 1개의 값만 반환
data1 = soup.find('div',{'class':'detail_box'})

# findAll(태그)
# 매칭된 모든 값을 리스트 형태로 반환
data2 = data1.findAll('dd')

# 미세먼지 지수 출력
fine_dust = data2[0].find('span',{'class':'num'}).text
print(fine_dust)

# 초미세먼지 지수 출력
ultra_fine_dust = data2[1].find('span',{'class':'num'}).text
print(ultra_fine_dust)

 

 

2. 특정한 여러 데이터 크롤링

요일별로 웹툰 제목을 크롤링하여

리스트에 저장하여 출력하는 코드

크롤링할 네이버 웹툰 화면과 html 코드

from bs4 import BeautifulSoup
from pprint import pprint
import requests

html = requests.get("http://comic.naver.com/webtoon/weekday.nhn")
soup = BeautifulSoup(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]
    ## 1차원으로 저장하려면 extend
    week_title_list.extend(title_list)
    ## 요일별로 2차원 리스트로 저장하려면 append
    # week_title_list.append(title_list) 

pprint(week_title_list)

 

 

3. 웹페이지의 이미지 데이터 다운로드

웹툰 표지 경로를 크롤링하여

image 파일에 다운로드하는 코드

다운로드할 네이버 웹툰 화면과 html 코드

from bs4 import BeautifulSoup
from pprint import pprint
import requests, re, os
from urllib.request import urlretrieve

# 다운로드 폴더 생성
try:
    if not (os.path.isdir('image')):
        os.makedirs(os.path.join('image'))
except OSError as e:
    if e.errno != errno.EEXIST:
        print("폴더 생성 실패!")
        exit()

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

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

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

for data1 in data1_list:
    # 제목+썸내일 영역 추출하여 li_list와 병합
    li_list.extend(data1.findAll('li'))

# 각각 썸네일과 제목 추출하기
for li in li_list:
    img = li.find('img')
    title = img['title']
    img_src = img['src']
    
    # title에서 '[^0-9a-zA-Zㄱ-힗]'영역 내의 문자가 아닌 것은 ''로 치환
    title = re.sub('[^0-9a-zA-Zㄱ-힗]', '', title)
    
    # urlretrieve(이미지 url주소, 파일경로+파일명+확장자명)
    urlretrieve( img_src , './image/'+title+'.jpg')
반응형

'Python' 카테고리의 다른 글

아파치 스파크 Spark 란?  (0) 2021.11.03
온라인 Python IDE  (0) 2021.10.26
scikit-learn 라이브러리  (0) 2021.08.02
lambda 함수 사용하는 방법  (0) 2021.07.28
List Comprehension  (0) 2021.01.03