-
Python webCrawling 웹크롤링이란? requests / BeautifulSoup / select_one /Python 2022. 7. 18. 14:15반응형
big data
디지털 환경에서 생성되는 수치, 문자, 이미지, 영상 데이터를
모두 포함하는 대규모 데이터
Five v
데이터 분석 과정
1. 데이터 수집 & 저장
- 웹페이지 , iot, open api 등
- RDBMS & NOSQL
2. 데이터 처리 & 분석
- hive, mahout 등
3. 데이터 시각화 & 응용
- 그래프 등
수집 데이터 형태
1. 정형
- 데이터 베이스의 정해진 규칙에 맞게 데이터를 들어간 데이터 중 수치 만으로 의미 파악이 쉬운 데이터
ex) RDBMS, EXCEL 등
2. 반정형
- 고정된 필드에 저장된 데이터는 아니지만, 메타 데이터 및 스키마를 포함하는 데이터
ex) XML, HTML, JSON , CSV등
3. 비정형
- 고정된 필드에 저장되어 있지 않는 데이터
ex) SNS, 영상, 이미지, 음성, 텍스트 등
웹 크롤링? (Web Crawling)
- 웹 사이트의 내용에 접근하여 원하는 정보를 추출해 내는 행위
웹 페이지에서 데티어 수집할 떄 생각할 것들
- web page가 어떤 구조(HTML)로 되어있는지
- 어떻게(CSS Selector) 원하는 데이터를 추출할 것인지
웹 크롤링의 순서
1. 웹사이트의 html문서 요청
2. 크롤러를 이용하여 데이터 추출
3. 추출한 데이터를 가공 및 저장
웹 크롤링을 위한 라이브러리
1. requests
- 접근할 웹 페이지의 데이터를 요청/응답 받기 위한 라이브러리
2. BeautifulSoup
- html 문서에서 원하는 데이터를 추출하기 쉽게 해주는 라이브러리
requests 라이브러리
- 웹 페이지의 HTML문서를 요청/응답받기 위한 라이브러리
페이지 가져오기
import requests as req --라이브러리를 사용하기 위한 추가
#구글 홈페이지로 테스트 url = 'https://www.google.co.kr' # url에 https가 꼭 붙어야한다. req.get(url) # Response [200]이 나와야 정상적인 응답 이외의 코드는 오류 res = req.get(url) res.text #문자열 타입의 HTML문서 데이터
돈가스검색
선택한 부분이 검색어가 들어가는 부분이다.
저 부분을 지우고 >> get(url)사용하기
gl_search_url = 'https://www.google.co.kr/search?&sxsrf=ALiCzsYmG9b2vJeVLl_B6Uua8n3J4WVJYA%3A1658110693026&ei=5cLUYsaSAcedseMPgMOhoAw&ved=0ahUKEwiGmezWr4H5AhXHTmwGHYBhCMQQ4dUDCA4&uact=5&oq=%EC%B9%98%EC%A6%88%EB%8F%88%EA%B0%80%EC%8A%A4&gs_lcp=Cgdnd3Mtd2l6EAMyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAoyBAgAEAo6BAgAEEc6CggAEB4QBxAKECo6CggAEB4QDxAHEAo6BAgjECc6BQgAEIAEOgcIABCABBAKOggIABAeEAcQCkoECEEYAEoECEYYAFCtuQFYkMQBYNjGAWgCcAJ4AYABjQGIAasGkgEDMS42mAEAoAEByAEKwAEB&sclient=gws-wiz' #url가져오는변수명 = req.get(url변수, params={"추가할객체":"검색할단어"}) res = req.get(gl_search_url, params={"q":"돈까스"}) res.text
BeautifulSoup 라이브러리
- 응답받은 HTML문서 내의 데이터를 추출할 수 있는 라이브러리
1. 문자열 HTML >> 파이썬 객체로 변환
2. HTML객체를 반환하는 함수를 이용하여 데이터 수집import requests as req from bs4 import BeautifulSoup as bs nv_url = 'https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%ED%83%80%EC%BD%94%EC%95%BC%EB%81%BC&oquery=%ED%83%80%EC%BD%94%EC%95%BC%EB%81%BC&tqi=hWgbedprvmZssDVmtjZssssssU4-299136' #타코야끼 검색 url res = req.get(nv_url) #bs(변환할 데이터, 변환방식) : 문자열 html문서 >> 파이썬 객체로 변환 # 변환방식 : lxml > html.parser > html5lib html = bs(res.text, 'lxml')
원하는 부분 가져오기
태그 사용
#변환한데이터변수명.select_one('태그명').text html.select_one('title').text
클래스 선택자 사용
#select_one(css선택자) : 선택자와 일치한 하나의 html객체를 반환
# 클래스 선택자를 이용하여 데이터 수집 # 양쪽 끝 공백제거 : strip() html.select_one('a.lnk_head').text.strip()
같은 선택자의 인덱스로 가져오기
# select (CSS선택자) : 선택자와 일치한 모든 html객체를 반환(리스트)
adList = html.select('a.lnk_head') adList[14].text
선택자 다 가져오기 (for)
for s1 in adList: print(s1.text.strip()) for i in range(15): print(adList[i].text.strip())
실습
import requests as req #웹페이지 요청/응답 라이브러리 from bs4 import BeautifulSoup as bs #응답받은 데이터 추출 라이브러리 header = { 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' } # 요청하는 브라우저의 정보를 설정 news_url = 'https://n.news.naver.com/mnews/article/031/0000686189?sid=101' # url res = req.get(news_url, headers=header) # url로 서버와 연결 html = bs(res.text, 'lxml') #HTML문서 >> 파이썬객체로 변환 head = html.select_one('.media_end_head_headline').text # 선택자를 이용해 데이터 하나 가져오기 newsList = html.select_one('#dic_area').text # 선택자를 이용해 데이터 가져오기 print(head,"\n") # header출력 print(newsList) #newList출력
반응형'Python' 카테고리의 다른 글
Python Pandas Series 배열 (0) 2022.08.03 Python Selenium 환경설정 다운로드 (0) 2022.07.21 Python 파이썬 기초 Selenium 로딩 기다리기 (0) 2022.06.07 Python 파이썬 기초 class 부모 클래스 상속 (0) 2022.05.27 Python 파이썬 기초 코드 테스트 unit assert 사용 (0) 2022.05.20