파이썬 잘하는 성님들~ 웹크롤링 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일 고민해 보았는데 도저히 감을 잡을 수가 없습니다. 오늘밤에는 부디 숙면을... ㅠㅠ
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
소스를 좀 봤는데 이런 경우는 보통 보안 때문에 걸립니다. 이런 중요한 데이터를 AJAX로 내려줄 때는 보통 크롤링 방지 보안처리가 들어갑니다.
- 해당 API에
HTTP
요청을POST
로 보내야 한다든가,Authorization
등의 특정 헤더가 필요하다든가, 특정 쿠키/세션이 유효해야 한다든가 하는 조건들이 있을 수 있습니다. 이 경우에는 다른 건 몰라도 쿠키값은 보이니 세션 체크를 할 것 같습니다. - 이밖에도 리퍼러나 User-agent를 체크해서, "떳떳하고 정상적인 절차를 거쳐 웹조회를 하는 과정인지"를 체크하는 루틴이 있을 수 있습니다. 이 사례를 보니까 리퍼러도 존재하고, 사용자 에이전트 부분도 체크할 가능성이 있네요.
며칠 전부터 계속 같은 정보를 가져오려고 시도하시는 것 같은데, 혹시 전자공시시스템 공식 API를 아시나요? 저라면 이런 경우에는 정말 진지하게 이걸 써볼 생각을 해보겠습니다. 위 댓글에서 다른 분이 지적해 주셨듯이, 원하시는 크롤링이 성공한다고 하더라도 기술적 제한이 있을 뿐 아니라 법률/행정적인 문제도 발생할 수 있습니다.
- 해당 API에
댓글 입력