코딩 초보의 정리글입니다. 0편부터 보세요.
썰이 너무 길었다. 이제 두들겨보자.
VS Code를 열고, 워크스페이스가 자동으로 열리지 않는다면 저장했던 파일을 찾아 열고, 만들어놨던 빈 파일을 클릭해 연다.
파이썬에는 URL을 읽고 처리하는 urllib이라는 기본 라이브러리가 있고, 이 모듈 안에 request라는 모듈이 있으며, 그 안에서 urlopen이라는 함수를 이용해 http 전송 요청을 보낼 수 있...지만 아무도 그렇게 하지 않는다.
파이선 공식 문서의 urllib.request 항목을 보면,
더 고수준 HTTP 클라이언트 인터페이스로 Requests 패키지를 권장합니다.
라고 쓰여있다. 우리가 설치할 첫 패키지다.
VSCode 하단 패널에 Terminal 탭을 클릭하자. 하단 패널이 없다면 Ctrl+`를 입력하면 열린다. 먹히지 않으면 상단 메뉴의 View에서 Terminal을 클릭하면 된다.
파이썬 인터프리터가 제대로 설정되어 있다면 가상환경이 저절로 실행될 것이다. 그렇지 않다면 본인이 직접 실행한다. 당장은 크게 중요하지 않다. 정 거슬리면 인터프리터를 다시 설정하고, VS Code 공식문서에 안내되어 있는 가상환경 설정 항목을 보면 된다.
셸에서 pip install requests
을 입력하자. 설치가 다 되면 아직도 비어있는 문서로 돌아가자.
requests 패키지는 아래 구문으로 호출한다.
import requests
이 구문이 실행되면 requests라는 모듈을 쓸 수 있게 된다.
호출할 URL을 찾아보자. 평소에 보던 것을 그냥 가져오는 게 가장 편할 것이다. 다만 기억할 게 하나 있다.
모든 사이트는 루트 경로에 robots.txt 파일을 둔다. 해당 파일은 방금 우리가 시작했던 것처럼, 사람이 아닌 게 접근했을 때 가도 되는 곳과 가면 안되는 곳을 정의해 둔 파일이다.
네이버의 robots.txt는 어떻게 되어 있을까. 브라우저 주소창에 naver.com/robots.txt
를 입력해보자. 보통은 웹브라우저로 열리지만 네이버의 경우에는 해당 파일이 바로 다운로드된다. 메모장으로 열어보면,
User-agent: *
Disallow: /
Allow : /$
라고 되어 있다. 한줄씩 보자.
User-agent: *
http 호출을 하려고 하는 당사자를 가르킨다. *는 '모두'를 뜻하는 연산자다. 해당 파일은 사람 이외의 것(봇)을 대상으로 하므로 모든 봇이 해당된다.
Disallow: /
허용하지 않는 사이트를 가르킨다. /
는 루트를 의미한다. 즉, 루트에서부터 시작해 어떤 접근도 허용하지 않는다는 말이다. 그러니, 사실 네이버 사이트를 상대로 웹 크롤링과 스크래핑을 알려주는 모든 블로그들은 기본적으로 robots.txt에 정의된 룰을 무시하고 있다. 무시한다고 호출이 안되는 것은 아니다. 다만, 이걸 알고 하는 것과 모르고 하는 것은 다르다.
Allow : /$
허용하는 곳은 /$
, 즉 루트 자체인 네이버 메인 화면이라는 뜻이다. 그래서 네이버는 모든 봇들에게 '메인 페이지는 호출을 허용한다'라고 말하고 있다.
네이버는 큰 사이트이므로 안에 수많은 별개 페이지가 있을 것이다. 앞서 살펴봤던 네이버 영화 쪽은 별도의 robots.txt를 가지고 있다. movie.naver.com/robots.txt
를 보면,
User-agent: *
Disallow: /
아무것도 허용하지 않는다. 네이버 페이지 여기저기 테스트 해봐도 대부분이 다 이런 식이다.
그래서 https://www.goodreads.com/quotes
과 같이 테스트를 해도 무방하도록 허용해준 사이트를 찾아서 기본적인 호출을 해볼 것을 권하는 강좌들이 있다.
그럼 어떤 페이지를 호출해볼 것인가? 사실 아무도 robots.txt는 신경쓰지 않는다. 나도 신경쓰지 않는다. 그러니 자기가 실제 스크래핑해보고 싶은 주소를 기준으로 할 것이다. 난 네이버 뉴스로 정했다. 왜냐하면 나중에 네이버 검색 API도 써볼 건데, 뉴스가 제일 적당해보여서다.
다음 글로 넘어가야할 것 같지만, '두들겨 보자'고 했으니 코드를 써놓고 넘어가자.
import requests
url = "https://news.naver.com"
r = requests.get(url)
print(r)
미리 얘기하지만, 저 코드의 결과는
<Response [403]>
다. 에러가 반환된 것인데, 다음 편으로.
(추가)
raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
이후 네이버에서 다시 업데이트를 한 모양인지, 위 문구를 포함한 실행 에러 화면으로 전환된다.
'취미코딩 > hobby' 카테고리의 다른 글
파이썬으로 업무 자동화까지 <10> BeautifulSoup 02 (0) | 2020.12.20 |
---|---|
파이썬으로 업무 자동화까지 <9> BeautifulSoup 01 (0) | 2020.12.20 |
파이썬으로 업무 자동화까지 <8> requests 3 (2) | 2020.12.19 |
파이썬으로 업무 자동화까지 <7> requests 2 (0) | 2020.12.14 |
파이썬으로 업무 자동화까지 <5> HTTP (0) | 2020.12.11 |
파이썬으로 업무 자동화까지 <4> PIP (0) | 2020.12.10 |
파이썬으로 업무 자동화까지 <3> 에디터 (0) | 2020.12.09 |
파이썬으로 업무 자동화까지 <2> 재미 느끼기 (0) | 2020.12.09 |