반응형
27. 웹 스크레이핑
27.1 웹 스크래핑의 개념
27.1.1 웹 스크레이핑(web scraping)
웹 사이트 상에서 원하는 부분에 위치한 정보를 컴퓨터로 하여금 자동으로 추출하여 수집하도록 하는 기술
27.1.2 웹 크롤링(web crawling)
자동화 봇(bot)인 웹 크롤러(web crawler)가 정해진 규칙에 따라 복수 개의 웹 페이지를 브라우징하는 작업
27.2 웹 스크래핑을 위한 라이브러리
27.2.1 BeautifulSoup
27.2.2 scrapy
# 이미지 다운로드 방법1
import urllib.request
# daum 사이트의 로고에서 마우스 우클릭 - 이미지 주소 복사
url = "https://t1.daumcdn.net/daumtop_chanel/op/20170315064553027.png"
savename = "d:/data/images/daum.png"
# url이 가리키는 주소에 접근해서 해당 자원을 로컬 컴퓨터에 저장하는 코드
urllib.request.rurlretrieve(url, savename)
print("저장되었습니다...!")
# 지정된 디렉토리에 다운로드 됨
# 매개변수를 추가하여 인터넷 리소스를 요청하는 방법
import urllib.request
import urllib.parse
API = "http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp"
# url에 특수문자, 한글이 포함된 경우 URL 인코딩이 필요함
# 지역번호 : 전국 108, 서울/경기 109, 강원 105, 충북 131, 충남 133,
# 전북 146, 전남 156, 경북 143, 경남 169, 제주 184
values = { 'stnId': '108' } # 전국 옵션
# values = { 'stnId': '109' } # 서울/경기
params = urllib.parse.urlencode(values)
# 요청 전용 URL 생성
url = API + "?" + params
print("url=", url)
# 다운로드
data = urllib.request.urlopen(url).read()
text = data.decode("utf-8")
print(text)
# 스크래핑(scraping) : 웹사이트에서 원하는 정보를 추출하는 것
# BeautifulSoup : HTML 파싱 라이브러리
# 사이트 : https://www.crummy.com/software/BeautifulSoup/
# pip install beautifulsoup4
from urllib.request import urlopen
from bs4 import BeautifulSoup
# stackoverflow 메인 페이지의 타이틀 텍스트 읽기
html = urlopen('https://stackoverflow.com/')
bs = BeautifulSoup(html.read(), 'html.parser')
print(bs.h1)
# 네이버 금융에서 환율 정보 가져오기
from bs4 import BeautifulSoup
import urllib.request as req
# HTML 가져오기
url = "http://info.finance.naver.com/marketindex/"
res = req.urlopen(url)
# HTML 분석하기
soup = BeautifulSoup(res, "html.parser")
# 원하는 데이터 추출
price = soup.select_one("div.head_info > span.value").string
print("usd/krw =", price)
4) pdf 문서 읽기
6) 로그인이 필요한 사이트에서의 데이터 수집
로그인이 필요한 사이트에서는 쿠키, 세션 등의 인증수단이 필요하여 웹 스크래핑 코드상에서 추가로 처리해야 할 작업이 생긴다.
웹 브라우저의 개발자 도구(F12)의 Network 탭을 보면 어떤 url에서 로그인 관련 인증이 처리되는지 볼 수 있다(예를 들면 login_check.do).
# 로그인을 하지 않아 세션이 없는 상태이므로 장바구니 목록이 보이지 않음
# 이런 경우에는 세션을 생성하는 코드가 필요함
import requests
result = requests.get("http://localhost/jsp02/cart_servlet/list.do")
print(result.text)
# jsp02 사이트를 구동한 후 로그인 페이지 테스트
# shop/cart_list.jsp 에서 일부 코드 수정
# <td><span>${row.product_name}</span></td> => <span>으로 상품이름을 감싼다.
# 로그인을 위한 모듈
import requests
from bs4 import BeautifulSoup
params = {'userid': 'park', 'passwd': '1234'}
session = requests.Session()
s = session.post("http://localhost/jsp02/login_servlet/login.do", params)
print("세션아이디: ", s.cookies.get_dict())
res = session.get("http://localhost/jsp02/cart_servlet/list.do")
soup =
반응형