-
웹 크롤링 - BeautifulSoup 기초 개념빅데이터/BeautifulSoup 2021. 12. 9. 09:44
01 웹 크롤링 및 스크래핑 개요
- 웹 크롤링 (Web Crawling)
웹 크롤러가 정해진 규칙에 따라 복수 개의 웹 페이지를 브라우징하는 작업 - 웹 스크래핑 (Web Scraping)
웹 페이지 상에서 원하는 콘텐츠 정보를 컴퓨터로 하여금 자동으로 추출 및 수집하는 기술
(주로 웹페이지의 구성요소의 콘텐츠나 속성값을 읽어와서 작업이 이루어 짐(HTML/CSS 등)) - Python에서는 BeautifulSoup/Scrapy를 주로 많이 씀
02 Crawling 저작권
- 모든 사이트가 크롤링을 허용하는것은 아니다. 각각의 사이트에서 크롤링 봇이나 사람이 아닌것에 대한 접근이 있으면 사이트에서 차단을 하게 된다.
- 이때 차단과 관계없이 크롤링을 진행하도록 가능하게 하는것이 'User-agent' 상태. 이를 바꿔주면 사람이 크롤링 하는 것 처럼 만들 수 있다.
(자세한 사항은 다음 링크 참조:https://blog.naver.com/kiddwannabe/221185808375)
03 웹페이지 구성 기술
- 모든 웹페이지의 기본은 HTML/CSS로 이루어진다. 즉 마크업 언어로 이루어져 있고 이는 태그를 사용하여 작성이 되어 진다.
- 웹페이지 크롤링/스크래핑을 통해 데이터를 추출시에는 추출하려는 콘텐츠의 태그를 찾아서 속성의 값이나 콘텐츠 부분을 추출하여야 한다.
- HTML은 보통 각각의 영역에 큰 태그로 이루어 진다 (<head>, <body>, <p> 등등)
- CSS는 HTML을 꾸며주는 언어로 큰 태그안에 속성으로 표시가 된다 (<h2 id="t1">, <p class=""> 등등)
- JS 언어도 있다. JS는 HTML/CSS로 이루어진 웹페이지를 동적으로 표현하기 위한 언어이다.
04 웹 콘텐츠 요청
- urllib 패키지
URL 문자열과 웹 요청에 관련된 모듈들을 제공
주요 urllib 모듈 2가지 urllib.request - URL 문자열을 가지고 요청 기능 제공 - URL문자열을 가지고 HTTP 요청 수행 - 웹 서버로부터 받은 응답을 래핑하는 객체 - 응답 헤더나 응답 바디의 내용을 추출하는 메서드 제공 urllib.parse - URL 문자열을 파싱하여 해석하는 기능 제공 - urllib.parse.urlencoded() → 딕셔너리 형태로 지정된 값을 정해진 규격의 'Query' 문자열 또는 파라미터 문자열로 리턴
- urllib을 사용하여 이미지 다운로드
from urllib.request import urlretrieve url="https://imgnews.pstatic.net/image/477/2021/08/03/0000312553_001_20210803133918005.jpg?type=w647" savename = "C:\devtools\pythonworkspace/image00.jpg" urlretrieve(url, savename) print("Saved")
- urllib을 사용하여 일기예보 뽑기
from urllib.request import urllib.parse API = "https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?" values = {'stnId':'159'} params = urllib.parse.urlencode(values) url = API + params print("url=", url) url= https://www.weather.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=159 data = urllib.request.urlopen(url).read() text = data.decode('utf-8') print(text) <?xml version="1.0" encoding="utf-8" ?> <rss version="2.0"> <channel> <title>기상청 육상 중기예보</title> <link>http://www.kma.go.kr/weather/forecast/mid-term_06.jsp</link> <description>기상청 날씨 웹서비스</description> <language>ko</language> <generator>기상청</generator> <pubDate>2021년 12월 09일 (목)요일 06:00</pubDate> <item> <author>기상청</author> <category>육상중기예보</category> <title>경상남,북도 육상 중기예보 - 2021년 12월 09일 (목)요일 06:00 발표</title> ...
- API 특성상 각 지역의 기상예보를 받고싶으면 API 주소 + 지역번호가 들어가야 하므로 API 세팅
- urlencoded() 를 쓰기 위하여 딕셔너리값 설정 (values)
- 파리미터로 넘기는 값 설정(params)
- 최종 URL 완성
- urllib.request.urlopen().read()를 써서 내용을 읽어 옴
- 최종적으로 decode()를 하여 utf-8로 변경
05 RQUESTS 활용
- urllib과 큰 차이는 없으나 주로 requests를 많이 사용 한다. 그 이유는 requests.get()의 활용 때문
- HTTP 프로토콜과 관련된 기능을 지원
- requests의 대표 함수는 아래와 같다
HTTP 요청을 서버에 보내고 응답을 받아오는 기능을 주로 지원한다.&nbsp;
- requests 실습
import requests params = {'catagory':'여행', 'page':100} url = "http://unico2013.dothome.co.kr/crawling/exercise.php" r = requests.get(url, params = params) r.encoding = "utf-8" print(r.text) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <h1>전달된 카테고리와 페이지가 없네요!!</h1> </body> </html>
import urllib.request import urllib.parse params = urllib.parse.urlencode({'category': '역사 ', 'page':25}) url = "http://unico2013.dothome.co.kr/crawling/exercise.php?%s" % params print(url) with urllib.request.urlopen(url) as f: print(f.read().decode('utf8')) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>TEST</title> </head> <body> <h1 style='color : red'>카테고리 : 역사 </h1> <h2 style='color : blue'>페이지 : 25</h2> </body> </html>
'빅데이터 > BeautifulSoup' 카테고리의 다른 글
웹 크롤링 - BeautifulSoup+Pandas를 이용한 데이터 분석 2 (0) 2021.12.11 웹 크롤링 - BeautifulSoup+Pandas를 이용한 데이터 분석 (0) 2021.12.11 BeautifulSoup 03 - Basics of data science tasks (2) - 위키피디아 영화 관련 스크래핑 (0) 2021.12.08 BeautifulSoup 03 - Basics of data science tasks (1) - 위키피디아 영화 관련 스크래핑 (0) 2021.12.01 BeautifulSoup 02 - Code Navigation/Exercise - 2 (0) 2021.11.28 - 웹 크롤링 (Web Crawling)