python
웹 스크랩핑(크롤링)
Strong_H
2021. 11. 18. 23:18
# Web Scraping
필요한 모듈
1. requests
2. beautifulsoup
모듈을 설치하는 방법
Terminal 에서 pip install 모듈명 으로 설치 하거나,
File | Settings | Project: 프로젝트명 | Project Interpreter에 들어가면 현재 설치된 모듈을 확인 할 수 있다.

여기에서 원하는 모듈명을 검색해서 설치 할 수도 있다.

> 설치한 모듈의 함수 등 동작내용을 확인하기 위해 해당 모듈명으로 검색해서 제작자가 정리해놓은 사용법을 확인해야 한다.
<pre style="font-family: 굴림체; font-size: 9pt;">import requests # requests 모듈 사용 선언
URL = 'https://naver.com'
response = requests.get(URL) # 요청 (requests의 get 함수 사용)
response.status_code # http 응답코드
response.text # response 데이터값 html 전체 코드를 저장
print(response.status_code)</pre>
출력 : 200
requests 모듈의 get 함수를 사용해서 요청
get() - GET으로 요청을 보내는 함수
post() - POST로 요청을 보내는 함수
response.text를 프린트 하면 URL의 전체 html코드가 출력됨.
# 결과값을 받은뒤 내가 원하는 값을 빼오는 방법은 ?
1. 정규식 (일정한 조건에 대해 부합하는 대상만 빼오는것)
2. DOM접근 (최상위 도큐먼트로부터 하나씩 하위도큐먼트로 검색해가는 방식)
DOM으로 접근해 값을 빼오는것을 도와주는 모듈 = BeatifulSoup
사용할 함수
find - 태그 기준으로 검색 # <>
find_all - 태그 전부 가져오기
import requests
from bs4 import BeautifulSoup
lottoDic = {}
for i in range(1,2):
URL = 'https://dhlottery.co.kr/gameResult.do?method=byWin&drwNo=' + str(i)
res = requests.get(URL)
bsObject = BeautifulSoup(res.text, 'html.parser')
nums = bsObject.find('div', class_='num win')
numberArray = [] # 반복문이 돌때마다 배열(리스트)를 초기화 한다.
for number in nums.find_all('span'): # span을 모두 찾는다
numberArray.append(number.text) # 배열에 로또넘버를 추가한다
lottoDic[i] = numberArray # 딕셔너리에 i번째 키값에 접근해 리스트를 저장
print(lottoDic)
출력
{1 : ['10', '23', '29', '33', '37', '40']}
로또번호 출력사이트의 소스

모듈을 불러온뒤
lottoDic 딕셔너리를 생성해주고
회차별 당첨번호를 보여주는 사이트에서
가장 맨뒤의 번호가 해당 회차의 당첨번호를 출력해주는 사이트임을 확인하고
1~851까지 반복문을 돌리면 모두 가져올 수 있을것으로 생각되어서 str(i) 문자열로 바꿔준 i를 대입
res에 get방식으로 URL을 가져오고,
beautifulsoup의 find함수로 클래스 명이 num win인것 중에 div 태그를 빼온다
빼온 태그 중에서 span을 모두 빼온다
그안의 텍스트 값만 가져오기 위해 number.text를 numberArray에 추가한다.
# 회고
처음 진행할때 약간 어렵게 느껴졌었으나, 몇번 혼자서 복습해보니 생각보다 쉽게 느껴졌다.
단지 익숙하지 않아서 헤메거나, 오류가 발생할뿐 높은 난이도의 이해를 요구하는 작업은 아니라고 생각한다.
어떤 아이디어로 정보를 캐와야할지 생각보다 떠오르는게 없다.
우체국 등기번호조회(?) 자동화시켰던것처럼 어떤 상황에 처해야 필요에 의해 생각이 날런지.. 싶다