얼레벌레

[크롤링] Request header와 BeautifulSoup 본문

취업/KT AIVLE SCHOOL

[크롤링] Request header와 BeautifulSoup

__Lucie__ 2022. 8. 8. 20:37

동적 페이지 크롤링 - 실습 위주

직방의 원룸 매물 정보 크롤링하기

  • 프로세스
    1. 동 이름으로 위도 값과 경도 값 가져오기.
    2. 위도 값과 경도 값을 geohash 값으로 변환하기.
      • geohash 란?
        위도 값, 경도 값을 가지고 지도에 찍으면 점으로 찍힘 (당연)
        그런데 우리가 보통 직방 어플이나 네이버 지도 어플을 보면 점이 아닌 범위로 나옴
        ex) 강남구 역삼동 찍었을 때 점으로 나오는 게 아니라 그 주변이 범위로 나옴
        이렇게 변환해주는 것이 geohash
    3. geohash 값을 가지고 매물 아이디들을 가져오기
    4. 매물 아이디를 가지고 매물 정보 수집
  • 실제 코딩
  • 모듈 파일로 만들어보자. (.py)
    • 매직 커맨드를 이용한다.
    • 모듈 파일을 만들 때에는 코드에 포함되어 있는 패키지도 같이 선언해 주어야 한다.
    • 매직 커맨드는 가장 위에 있어야 한다. (위에 주석도 오면 안됨)
  • 만든 모듈 파일 사용하기

 

Request Headers

이번에 할 예제는 요청 시 headers 값 설정에 유의해야 하는 예시이다.

우리가 크롤링을 할 때 서버쪽에 요청을 보낸다.

그러면 서버의 백엔드 쪽에서 (필수는 아니지만) headers를 확인한다. 

headers에 있는 값이 정상적인 값(정상적인 루트로 왔다)이라면 알맞은 파일로 응답을 하겠지만,

정상적인 값이 아니라면 파일을 보내지 않는다.

그래서 우리는 크롤링에서 요청을 할 때 헤더 값을 실제 우리의 값이 아니라, 임의로 변경해 보낼 수 있다.

 

headers 값에는 크게 user-agent 값과 referer 값이 있다.

  • user-agent
    • HTTP 요청을 보내는 디바이스/브라우저 등 사용자 소프트웨어의 식별 정보를 담고 있다.
  • referer
    • 클라이언트가 A사이트에서 이벤트를 발생시켜 B사이트를 요청했다고 하면,
      서버는 B사이트를 띄워줘야 한다.
      이 때 B 사이트 요청 전의 url 값 (여기서는 A 사이트의 url)이 바로 referer 값이다.
    • 활용
      내가 웹사이트를 하나 만들었음.
      그러면 내가 만든 이 서비스를 페북에도 홍보하고 트위터에도 홍보하고 인스타에도 홍보하고 네이버에도 홍보함.
      페북에 있던 / 트위터에 있던 / 인스타에 있던 / 네이버에 있던 클라이언트가 클릭해서 내 서비스로 들어오는 것임.
      그러면 웹에서는 요청된 referer가 페북/트위터/인스타/네이버 마다 다름.
      => 이렇게 유입되는 서비스에 대한 카운트를 할 수 있음

다음 사이트에서 환율 정보 수집하기

  • 프로세스
    1. 웹 서비스 분석 : URL 얻어내기
    2. requests를 통해 json 형태 response 가져오기
    3. json 형태의 string 데이터를 DataFrame으로 전환
  • 코드

 

정적 페이지 크롤링

정적 페이지를 크롤링하기 위해서는 html 구조(태그 종류)와 CSS selctor에 대한 정보가 필요하다.

동적 페이지와 다르게, 정적 페이지는 가져오는 데이터가 html 형태이기 때문이다.

브라우저 사용 언어

웹 페이지는 기본적으로 HTML문서로 이루어져 있다.

  1. HTML : 텍스트 정보나 레이아웃 위치 등을 정함
  2. CSS : 스타일
  3. Javascript: 이벤트

크롤링을 할 때 CSS selector를 이용하는 이유는,

CSS selector는 기본적으로 HTML의 특정 태그(원하는 태그)에 스타일을 적용하고자 할 때 사용한다.

크롤링 할 때는 갖고 오고싶은 데이터를, 태그를 선택하는 방법인 CSS selector를 이용해서 가져온다.

 

HTML

HTML은 웹 문서를 작성하는 언어이다.

  • 구성 요소
    • Document : 한 페이지를 나타내는 코드
    • Element : 하나의 레이아웃
    • Tag : Element 종류를 정의한다, 시작 태그와 끝 태그가 있다.
      • 종류
        <p> 한 줄의 문자열
        <span> 한 블럭의 문자열
        <ul>, <li> 리스트(목록) 문자열
        <a> 링크, href 옵션: 이동할 페이지, target="_blink" 옵션: 새로운 탭에 띄움
        <img> 이미지
        <iframe> 외부 url 링크에 해당하는 웹페이지 출력
        <div> 레이아웃
        <table> 행열 데이터
    • Attribute: 속성값, 시작 태그에서 태그의 기능을 정의한다.
      • id : element를 지정하는 값, 페이지에서 유일한 값
      • class: element를 지정하는 값, 페이지 내에서 여러 개 사용 가능
      • attr : id, class를 제외한 나머지 속성 값
    • Text: 시작태그와 끝 태그 사이의 문자열
  • HTML의 구성요소들은 계층적 구조를 갖는다.
  • Element는 계층적 구조를 갖는다.

CSS selector

CSS 스타일을 적용시키려고(본래 용도) HTML element를 선택하는 방법으로, 6가지 방법이 있다.

  1. Element Tag 이름으로 선택하기.
    • 아무 것도 안붙이고 그냥 태그 이름으로 선택 
    • ex) span
  2. tag의 id 값으로 선택하기.
    • id 값 앞에 #붙이기.
    • ex) #kt
  3. tag의 class 값으로 선택하기.
    • class 값 앞에 .붙이기.
    • ex) .kt
  4. tag의 attr 값으로 선택하기.
    • 대괄호 안에 attr 속성을 다 넣기
    • ex) [value="no1"]
  5. 여러 개의 element 값 선택하기.
    • not selector : 여러 개 중에 특정 태그는 선택 하지마.
      ex) .no:not(.no2) => 'no' 클래스 선택할건데, 'no2' 클래스는 빼고 선택해
    • nth-child(x) : x번째 엘리먼트 중에서 해당 태그인 엘리먼트를 가져와.
      ex) .py:nth-child(3) => 3번째 엘리먼트인데 .py 클래스를 갖는 엘리먼트를 선택해.
    • , : 여러 개 병렬 선택
      ex) .py1, .py3 => 'py1' 클래스랑 'py3' 클래스 선택해. 
  6. 계층적으로 element 선택하기.
    • > : 한 단계 아래 태그
      ex) .wrap > p => 'wrap' 클래스 한단계 아래있는 p태그 선택해.
    • (공백) : 아래에 있는 모든 태그
      ex) .wrap p => 'wrap' 클래스 아래에 있는 모든 p태그 선택해.

 

실습 - BeautifulSoup 사용

우리가 파이썬에서 CSS selector를 사용해서 태그를 선택하려면 도구가 필요하다.

그걸 가능하게 해주는 도구가 BeautifulSoup 패키지이다. (select, select_one 함수 사용)

  • 프로세스
    1. 웹 서비스 분석해 url 가져오기.
    2. 해당 url로 requests 요청해서 html 형태의 string 파일 받기.
    3. html 형태의 string 파일에서,
      beautifulsoup 객체를 통한 CSS selector를 이용해 데이터 가져오기.