파이썬 잘하는 성님들~ 웹크롤링 webdriver사용 안 하는 방법연구성애자입니다.

조회수 1620회

안녕하세요.

네이버 증권에서 재무정보 받아오는 크롤링을 하고 있는데요.

웹페이지의 재무정보가 동적페이지로부터 가져오고 있어, 직접 파싱하는 것은 불가능한 것 같습니다.

웹드라이버 셀리움을 사용하면 될 것 같기는 한데, 이 방법은 브라우져 띄우는 시간 때문에 아무래도 속도가 느려질 것 같다는 생각이 듭니다. 이도저도 안되면 최후의 방법으로 셀리움을 사용하겠지만 보다 빠른 구동방법을 찾고 싶습니다.

웹드라이버 셀리움말고 가능한 방법이 있을까요? 아시는 성님 있으시면 책이나 링크나 아이디어 공유 좀 부탁드립니다. 혹시 시간에 여유가 있으시다면 초보가 이해할 수 있게 설명해주시면 채택 및 내공 100드릴게요~

코드는 아래를 참조하세요

from bs4 import BeautifulSoup
import requests

url = 'https://companyinfo.stock.naver.com/v1/company/c1010001.aspx?cmp_cd=095570'
html = requests.get(url).text

encparam = result8[1].strip().replace('\'','')
id = result7[1].strip().replace('\'','')

print('첫번째 url: ',url)

url2 = 'https://companyinfo.stock.naver.com/v1/company/ajax/cF1001.aspx?cmp_cd=095570&fin_typ=0&freq_typ=A&encparam=' + encparam + '&id=' + id

result2 = soup.findAll('tbody')

print('두번째 url: ',url2)

buchae1 = pp.split('부채총계') 
jabon1 = pp.split('자본총계')  

print('부채총계: ', buchae1[1].split(',')[1])
print('자본총계: ', jabon1[1].split(',')[1])

첫번째 url을 브라우져로 열고 두번째 url을 열면 정상작동하는데,

바로 두번재 url로 재무정보를 파싱하면 오류가 나고, 두번째 url로 들어가보면 빈 페이지가 뜹니다.

분명히 첫번째 url에서 읽어오는 값을 바탕으로 두번째 url을 불러오는데 안 되는 이유가 뭘까요...

3일 고민해 보았는데 도저히 감을 잡을 수가 없습니다. 오늘밤에는 부디 숙면을... ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 첫 번째 URL에서 가져오는 id 값이 잘 못 된거 같은데... id값이 특정 태그의 id값에 박혀 있습니다. 그런데 크롤링을 방지하려고 저렇게 ㄴㅇㅂ에서 노오력 하는데 굳이 하셔야 할까요. 크롤링 까지는 문제가 안 되지만 그것을 기반으로 수집한 데이터를 배포하면 문제가 될 수 있음을 주의하세요. doodoji 2018.9.12 15:16

1 답변

  • 소스를 좀 봤는데 이런 경우는 보통 보안 때문에 걸립니다. 이런 중요한 데이터를 AJAX로 내려줄 때는 보통 크롤링 방지 보안처리가 들어갑니다.

    • 해당 API에 HTTP 요청을 POST로 보내야 한다든가, Authorization 등의 특정 헤더가 필요하다든가, 특정 쿠키/세션이 유효해야 한다든가 하는 조건들이 있을 수 있습니다. 이 경우에는 다른 건 몰라도 쿠키값은 보이니 세션 체크를 할 것 같습니다.
    • 이밖에도 리퍼러나 User-agent를 체크해서, "떳떳하고 정상적인 절차를 거쳐 웹조회를 하는 과정인지"를 체크하는 루틴이 있을 수 있습니다. 이 사례를 보니까 리퍼러도 존재하고, 사용자 에이전트 부분도 체크할 가능성이 있네요.

    며칠 전부터 계속 같은 정보를 가져오려고 시도하시는 것 같은데, 혹시 전자공시시스템 공식 API를 아시나요? 저라면 이런 경우에는 정말 진지하게 이걸 써볼 생각을 해보겠습니다. 위 댓글에서 다른 분이 지적해 주셨듯이, 원하시는 크롤링이 성공한다고 하더라도 기술적 제한이 있을 뿐 아니라 법률/행정적인 문제도 발생할 수 있습니다.

    • 네. 답변주셔서 감사합니다. 도움말씀 주신 부분을 바탕으로 다시 만들어 보겠습니다~ 알 수 없는 사용자 2018.9.12 20:04

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)