웹 크롤링 입문- 특정 URL에서 데이터 가져오기
2020. 7. 24. 20:45ㆍPython
** 참고 : "파이썬 레시피 - 웹 활용 입문편" by.반원
https://wikidocs.net/book/2965
** 목차
0. 필요한 라이브러리 설치
1. 특정한 데이터 크롤링
2. 특정한 여러 데이터 크롤링
3. 웹페이지의 이미지 데이터 다운로드
0. 필요한 라이브러리 설치
Python을 이용하여 웹을 크롤링하기 위해서는 다음과 같은 도구가 필요하다.
* requests : 웹페이지 데이터를 가져오는 모듈
* BeautifulSoup4 : 가져온 웹페이지를 분석하여 원하는 정보를 추출하는 모듈
[ Cmd창 ]
$ pip install requests
$ pip install BeautifulSoup4
1. 특정한 데이터 크롤링
네이버에 '날씨'라고 검색했을 때의 웹페이지를 크롤링하여
미세먼지와 초미세먼지 지수를 출력하는 코드
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. 특정한 여러 데이터 크롤링
요일별로 웹툰 제목을 크롤링하여
리스트에 저장하여 출력하는 코드
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 파일에 다운로드하는 코드
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 |