크롤러를 개발하다 보면 가장 중요한 부분은 불법 요청자로 판별되어 차단을 당하지 않는 것이다. 해당 웹 서버에 부담이 되는 많은 요청은 지양을 하는 것이 좋지만, 비즈니스를 위해 필요할 경우가 많다. 그럴 경우에 사용할 수 있는 방법 하나를 공유하고자 한다. User-Agent란 유저 에이전트는 웹 크롤러와 같은 웹 클라이언트가 서버에 HTTP 요청을 보낼 때 함께 보내는 정보이다. 해당 요청이 어떤 종류의 소프트웨어나 애플리케이션에서 온 것인지를 식별하기 위해 사용하고, 적합한 응답을 제공한다. 브라우저의 종류와 버전 : 예) Chrome/94.0.4606.81 등 운영체제 정보 : 예) windows10, macOS, Linux 등 디자이스 종류 : 모바일 장치인지 데스크톱 컴퓨터인지 식별 유저 에이..
프로그래밍/Crawling
사이트를 크롤링할 때 소스코드 내부에 있는 데이터를 json으로 파싱 하려고 할 때 잦은 에러를 마주한다... 1. 너무 JSON형식이 맞는데 처음부터 안 되는 경우 requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0) response_text = response.content.decode('utf-8') -> 응답받은 content or text를 디코드 해준다. 2. 잘가져온거 같은데 중간에서 자꾸 에러가 나는 경우 ValueError: Expecting , delimiter: line 1 column 532 (char 531) try: result_data = json.loads(result_data) excep..
문제상황 네이버 맵에서 셀레니움을 사용하여 동적크롤링으로 식당 정보들을 수집하려고 한다. 개발자 도구에서는 원하는 데이터 값이 보이는데 class_name, xpath 온갖 방법을 써도 객체 자체를 못 얻어오길래 다른 방법도 시도해보고 얼레벌레 이틀을 꼬박 매달렸다. 그런데 추출이 되지 않았던 이유는 바로 해당 태그들이 iframe안에 있기 때문이었다. 해결방법 추출하고 싶은 데이터의 위쪽으로 살펴보다 보면 iframe이라는 부모 태그를 찾을 수 있을 것이다. iframe의 id를 찾았다면 셀리니움 드라이버에서 프레임을 변경하여 안쪽 태그를 추출할 수 있다. driver.switch_to.frame('이름') #네이버 맵 만약 id를 잘 모르겠다면 모든 속성을 뽑아내서 살펴볼 수 있다. # 프레임 살펴보..
문제상황 크롤링을 할때 사이트에 접근만 했을뿐인데 403에러가 나는 경우가 있을 것이다. 이것은 https주소를 가지고 있는, 보안이 조금 더 강한 사이트일 경우 발생할 수 있는데 알려져있지않은 부정 접근을 차단하는 것이다. 해결방법 해결방법으로는 request객체의 header에 '내가 누구야!' 라는 정보를 넣어주면 되는데 # 웹 주소가 https 이므로 ssl 패키지 이용 # html = urlopen(url) #403번 에러 발생(부정접근으로 차단-알려진 agent를 헤더에 추가해서 전달하면 됨) # 헤더를 추가하려면 일반적으로 Request(get_url,headers={key:value}) import ssl context = ssl._create_unverified_context() # 암호..
#필요 패키지 임포트 import selenium from selenium import webdriver import pandas as pd from bs4 import BeautifulSoup import numpy as np from selenium.webdriver.common.by import By url='https://www.opinet.co.kr/user/main/mainView.do' driver = webdriver.Chrome('./driver/chromedriver') driver.get(url) 1. XPATH를 이용해서 동적 클릭하기 # 싼 주유소 찾기 - 지역별 메뉴 추출 xpath = '//*[@id="header"]/div/ul/li[1]/ul/li[1]/a' menu = d..
Selenium 패키지 모듈 이용한 동적 크롤링 셀레니움 설치 selenium webdriver라는 API를 통해 운영체제에 설치된 웹 브라우저를 제어하는 함수를 포함한 패키지 써드파티 라이브러리이기 때문에 따로 설치 해줘야 함 pip install selenium 필요 패키지 # 패키지 임포트 import selenium from selenium import webdriver import pandas as pd import numpy as np from bs4 import BeautifulSoup from selenium.webdriver.common.by import By selenium은 브라우저를 컨트롤하는 기능이기 때문에 webdriver 프로그램을 사용 webdriver는 브라우저 종류에 따라..
문제상황크롤링을 하려 requests.get(url)을 하다가 아래 에러를 만나본적이 있을것이다.('Connection aborted.', ConnectionResetError(10054, '현재 연결은 원격 호스트에 의해 강제로 끊겼습니다', None, 10054, None))이 에러는 요청한 서버에서 나를 자동화봇으로 보고 연결을 끊는 상황이다.해결방법이때 bot이 아닌 정상적인 요청임을 증명해야한다.크롤링하려는 페이지에서 개발자도구 > Network 에 들어가서 새로고침을 해보자.이처럼 제일 처음에 들어온 패킷이 있을것이다. 해당 패킷을 눌러서 살펴보면 Request Headers 부분에 user-agent 속성에 Mozilla 어쩌구하는 값이 있을것이다.이 값은 브라우저 정보를 나타내는 것인데 오..
이 게시글은 데이터사이언스엔지니어링_전문가 과정을 수강하며 복습을 위해 정리한 글입니다. 네이버 뉴스 크롤링 세번째 게시글입니다. 앞선 게시글을 본 후 보는 것을 추천드립니다. [WebCrawling] 네이버 뉴스 메뉴 크롤링 2022.ver 이 게시글은 데이터사이언스엔지니어링_전문가 과정을 수강하며 복습을 위해 정리한 글입니다. 포털사이트 크롤링 소스내에서 특정 문자열(data)을 자칭하는 선택자 얻기(크롬 개발자도구 사용) seojeong-99.tistory.com [WebCrawling] 네이버 뉴스 섹션 토픽 크롤링 2022.ver 이 게시글은 데이터사이언스엔지니어링_전문가 과정을 수강하며 복습을 위해 정리한 글입니다. 이전 게시글을 통해 네이버 -> 뉴스 -> 각 섹션 url을 얻어왔을 것이다...