개발 강좌/크롤링 강좌

크롤링 02 | 파이썬을 통하여 html를 불러오자.

건유1019 2020. 11. 29. 12:00

이번 강좌에서는 파이썬을 통하여 html를 불러오는 다양한 방법을 알아보고자 합니다.

 

우선 시작하기전에 알아두어야 할 것이 있습니다. http에는 두 가지 프로트콜이 존재합니다. GET과 POST 방식으로, 각각 "GET=가져오다." "POST=부치다." 라는 뜻이 있습니다. 대부분의 웹사이트에서는 GET 방식을 사용하여, 사이트를 불러오며 GET은 어떠한 정보를 가져와서 조회하기 위해서 사용되는 방식입니다. 반대로 POST는 데이터를 서버로 제출하여 추가 또는 수정하기 위해서 사용하는 방식입니다. 이것을 알아두시고 이제부터 시작해보도록 하겠습니다.


1. Requests 를 사용하여 html을 가져오자!

requests를 대부분 크롤링할 때 사용합니다. requests가 제일 사용하기 간단하기 때문입니다.

우선 requests 모듈을 불러와야 합니다.

import requests

코드를 우선 적어주시기 바랍니다. 그다음 특정 웹사이트에서 html값을 불러와야 하는데, 저는 어제 날씨 정보를 불러온 

https://search.naver.com/search.naver?query=강남구+날씨를 기준으로 하겠습니다.

 

위에 HTML 프로토콜 방식 두 가지 중에 우리는 값을 불러오기 위해 GET 방식을 사용할 것입니다.

따라서 requests.get을 사용해주시면 됩니다.

resp = reqeusts.get("https://search.naver.com/search.naver?query=강남구+날씨")

이 코드를 추가해줍니다. resp라는 변수 안에 웹 사이트에서 불러온 값을 저장합니다.

그리고 html 특성상 정상적으로 들어왔는지 먼저 확인해 주어야 합니다.

print(resp.status_code)

를 통하여 정상적으로 들어왔는지 확인하는 방법은 200이라는 것이 들어오면 정상적으로 불러온 것입니다.

이제 html을 불러오는 방법으로는 resp.text를 통하여 불러올 수 있습니다.

if resp.status_code == 200:
   	html = resp.text
	print(html)

정상적으로 들어왔다면 html 변수를 만들어서 html값을 저장하고 출력합니다. 이렇게 하여 requests를 사용하는 방법을 알아보았습니다.


2. aiohttp를 사용하여 html을 가져와보자!

aiohttp는 두 가지 용도가 있습니다. 특정 값을 불러오는 클라이언트 용도와 아피치, nginx 같이 웹 클라이언트 역할을 해주는 서버 용도의 두 가지가 있지만 우리는 클라이언트를 사용할 것입니다. aiohttp는 비동기로 작동하며, asyncio가 필요하기 때문에 함수를 만들어 비동기로 이용할 것입니다.

import aiohttp
import asyncio

async def main():
	return 0

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

우선 기본적으로 이렇게 작성해줍니다. asyncio는 비동기 모듈로 디스코드 봇 강의를 보셨다면 익숙하실 겁니다. request와 차이점은 requests는 값이 불러와질 때까지 모든 시스템이 멈추는 단점이 있지만, aiohttp(비동기)를 사용한다면 그 함수만 불러와질때까지 잠시 멈추며 동시에 다른 함수는 정상적으로 구동됩니다.

 

<정확한 비동기의 뜻> asyncio는 고성능 네트워크 및 웹 서버, 데이터베이스 연결 라이브러리, 분산 작업 큐 등을 제공하는 여러 파이썬 비동기 프레임워크의 기반으로 사용됩니다. (출처)

 

그리고 우리는 main()에 코드를 넣을 겁니다. 우선 클라이언트 세션을 열어주어야 합니다. 

클라이언트 세션을 열어준다는 것은 크롬 등 웹 브라우저를 여는 것과 같은 것입니다.

async def main():
    async with aiohttp.ClientSession() as session:
    	return 0
        

우선 "async with aiohttp.ClientSession() as session:"를 적어서 session이라는 변숫값 안에 aiohttp 클라이언트를 넣어줍니다. 

async def main():
    async with aiohttp.ClientSession() as session:
    	async with session.get("https://search.naver.com/search.naver?query=강남구+날씨") as resp:
    		return 0
        

그리고 세션을 통하여 requests와 똑같이 이용하실 수 있습니다. 다른 점은 as resp를 이용하여 resp 안에 세션을 저장합니다. 그리고 html 특성상 정상적으로 들어왔는지 확인해주는 것도 똑같이 할 수 있습니다.

async def main():
	async with aiohttp.ClientSession() as session:
		async with session.get("https://search.naver.com/search.naver?query=강남구+날씨") as resp:
			print(resp.status)

이렇게 확인할 수 있으며, 200이 반환되면 정상적으로 반환된 겁니다. 이제 html을 불러오는 방법으로는 resp.text()를 통하여 불러올 수 있습니다. requests와 차이점은 ()를 무조건 추가해주셔야 합니다.

async def main():
	async with aiohttp.ClientSession() as session:
		async with session.get("https://search.naver.com/search.naver?query=강남구+날씨") as resp:
			if resp.status == 200:
				html = resp.text()
				print(html)

이렇게 하면 비동기 형식으로 html이란 변수에 값을 저장하고 html 값을 정상적으로 출력할 수 있습니다. 이렇게 하여 aiohttp를 사용하여 불러오는 방법에 대해 알아보았습니다.


이렇게 해서 오늘은 두 가지 방법을 알아보았는데요. 다음 시간에는 bs4를 이용홰서 html값을 정리하여 출력해보는 것을 해보겠습니다!