웹 크롤링 안될 때 해결법(네이버/다음/구글 크롤링 차단 해결)
본문 바로가기

주식 자동매매 강의/중급반(시황 및 차트 구현)

웹 크롤링 안될 때 해결법(네이버/다음/구글 크롤링 차단 해결)

반응형

 웹 크롤링 관련 강의를 마쳤으나, 추가 강의를 하도록 하겠습니다. 웹 크롤링이 안될 때 해결법을 말씀드리겠습니다. 당연한 거지만 네이버 같은 웹사이트에서 자신만의 데이터를 못 가져가게 막아 놓았더군요.

 

1. 기존 강의 복습과 문제점 설명

 아래 코드를 확인해 보시면 urlopen으로 간단히 우리가 원하는 사이트에서 원하는 값을 가져오는 것을 말씀 드렸습니다. 이 부분은 네이버 첫 화면일 경우 가능하고 세부적으로 들어가 더 디테일한 값을 가져오려고 할 때 애러가 발생하게 됩니다.

 복습 강의 : 링크를 클릭하세요

from urllib.request import urlopen
from bs4 import BeautifulSoup

response = urlopen("https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=%ED%99%98%EC%9C%A8/")  # 크롤링하고자하는 사이트
soup = BeautifulSoup(response, "html.parser")  # html에 대하여 접근할 수 있도록

value = soup.find("span", {"class": "spt_con dw"})
print(value)

value2 = value.text.split()       # split(구분좌)

print(value2)

a = value2[0][2:10]       # 환율값
b = value2[1][4:11]       # 증가/하락
c = value2[2][1:7]        # 증가/하락 비율

print(a)
print(b)
print(c)
반응형

아래 그림처럼 인버스의 자세한 값을 가져오려고 하면 반드시 에러가 발생합니다. 그 이유는 네이버가 웹 스크레핑을 차단해서 파이썬을 통해 urlopen()으로 생으로 접속하게 되면 해당 주소가 없는 주소라고 결과를 보내기 때문입니다.

 

네이버에서 제공하는 자세한 값
네이버에서 제공하는 자세한 값

 이러한 차단 방식은 http 패킷 해더에 브라우저 정보(User-Agent)가 존재하는지 확인하는 방식입니다. 따라서, 우리는 urlopen() 방식이 아닌 http 요청 패킷에 웹브라우저 정보를 보내주어야 원하는 정보를 얻어 올 수 있습니다(네이버는 대규모 크롤링을 방지하기 위해 최소한의 방어막을 만들어 놓았습니다).

 

2. 해결 방법 : 패킷 해더에 Uesr-agent 정보 삽입하기

 해결방법은 생각보다 간단합니다. 우선 위에서 사용하였던 urlopen() 함수는 더 이상 사용하지 않습니다. 우선 코드를 확인해 보겠습니다.

코드 확인
코드 확인

 (1) 관련 함수를 가져 옵니다. 혹시 설치가 되지 않으신 분들은 pip install bs4와 pip install requests를 하십시오.

 (2) save 1 = [] : save1에 우리가 크롤링 데이터를 전부 저장합니다.

 (3) 가장 주요한 부분입니다.

   - url : url 주소를 반드시  f" 여기에 입력하세요 "

   - req : 해더 생성 부분입니다. headers에 User-agent는 Mozila/5.0으로 설정하였습니다. 원칙적으로는 더 디테일하게  적어야 되나 Mozila/5.0만 적으셔도 됩니다. 혹시 디테일하게 적으실 분들은 아래 더 포스팅해 놓겠습니다.

 우선 링크된 사이트에 접속하세요 : 링크

 사이트에 접속하시면 아래와 같이 화면이 뜹니다. 그러면 아래 빨간색 네모칸 부분을 복사 붙여 넣기 하시면 되고 붙여 넣기 할 부분은 Mozila/5.0에 넣으시면 됩니다. 이렇게 하시면 완벽합니다.

User-agent
User-agent

   - soup : 기존 강의와 동일하여 원하는 사이트에서 lxml로 데이터를 가져옵니다.

 (4) value_a = soup.find_all("span", {"class": tah p11}) : 우리가 크롤링한 데이터 soup 에서 원하는 부분을 찾습니다. find를 하시면 1개의 값만 찾고 find_all을 하시면 관련 모든 데이터를 가져옵니다. 그리고 아래 그림과 같이 span 태그의 tah p11 클래스 데이터를 모두 가져와서 가공합니다.

네이버 tah p11 데이터
네이버 tah p11 데이터

 (5) 가져온 데이터를 단순히 전시하는 것입니다.

 

3. 코드 및 결론

 네이버/다움/구글 등 다양한 사이트에서는 자신만의 노하우로 단순 크롤링하지 못하게 막아 두었습니다. 하지만 해더에 User-agent만 넣는다면 그러한 문제는 쉽게 해결될 수 있습니다. 아래 코드를 공유해 드리니 많이들 참고하시기 바랍니다. 감사합니다.

from bs4 import BeautifulSoup      # 크롤링 사이트의 값을 가져오는 함수
import requests

save1 = []   # 관련 값 다 저장하기

code = '530053'

url = f"https://finance.naver.com/item/frgn.naver?code={code}"
req = requests.get(url, headers={'User-agent': 'Mozilla/5.0'})
soup = BeautifulSoup(req.text, "lxml")  # html에 대하여 접근할 수 있도록

value_a = soup.find_all("span", {"class": "tah p11"})

for title in value_a:
    save1.append(title.get_text())


print(save1)

a9 = save1[0]  # 풋 값
c9 = save1[2]  # 풋 증가량

print(a9)
반응형

.link_tit