ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Scrap the website
    python 2021. 2. 6. 18:30

    Scrap the website

    requests, beautifulsoup을 이용하여 웹사이트에서 원하는 정보 긁어오기

     

    작년에 파이썬 기본 문법 정도만 대충 훑고 다시는 거들떠보지도 않았다. 왜냐면 이후 수업에서 파이썬을 안 썼기 때문이다. (ㅎㅎ) 사실 파이썬을 처음 접했을 때 (C에 비해) 너무너무 쓰기 편하고 직관적이라 나중에 더 공부해야지 해야지 하다가 이제야 다시 손 좀 대본다.
    작년에 텐서플로우로 머신러닝 프로젝트를 하면서 데이터셋이 없어서 직접 웹사이트를 긁어왔어야 했는데, 제대로 공부 안 하고 스크랩해오려다가 고생만 잔뜩 하고 결국 오픈된 데이터 셋 하나 구해서 겨우 해결했던 기억이 있다. 사실 실제로 웹 크롤러를 만드는 건 더더 많은 공부가 필요하고 꽤나 깊이 있는 내용이다.
    https://velog.io/@mowinckel/%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81-I

     

    🏭 '웹 크롤러' 좀 그만 만들어라

    아무튼 그만 만들어라.

    velog.io

     

     

    구글에 웹 스크ㄹ 이라고만 쳐도 정말 많은 글들이 올라와 있다. 가장 많이 사용하는 방법은 크게 두 가지인데, 하나는 selenium을 이용하는 것이고, 두 번째는 requests와 beautifulsoup를 이용하는 것이다. 지금 다룰 내용은 후자이다.

     

    웹은 크게 정적 페이지와 동적 페이지로 나눌 수 있다. 직관적으로 알 수 있듯이 정적 페이지는 페이지에 접속하면 해당 페이지의 소스코드를 그대로 불러오고, 동적 페이지는 페이지에 접속하면 유저의 움직임에 따라 소스코드가 변화한다. 따라서 스크랩할 때에도 다르게 접근해줘야한다. 정적 페이지는 URL에 따라 데이터가 달라지므로 URL에 데이터를 요청하는 requests 모듈을 이용하고, 동적 페이지는 web driver api를 통해 운영체제에 설치된 브라우저를 제어하는 selenium(간단히 말해 웹을 테스트하기 위한 자동화 도구로, JS로 렌더링이 완료된 후 결과물에 접근할 수 있기 때문에 동적으로 불러와지는 내용을 불러올 수 있다)을 이용한다.

     

     

    (+) API, 프레임워크, 라이브러리

    이 세 가지가 뭔가 대충 알 것 같지만 정확히 잘 모르겠는.. 그런 개념들이었다

    특히 프레임워크랑 라이브러리가 정확히 어떤 차이점인지 궁금했었다.

    API(application programming interface): 응용 프로그램에서 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 해주는 인터페이스이다. 음 필요한 부분을 요청하여 응답을 받는 역할을 해준다고 생각하면 쉬울 것 같다. 뭔가 내용을 담고 있는게 중요하다기보다 말 그대로 접근 권한을 부여받아 서비스 간의 다리 역할을 해주는 인터페이스!

    바로 이해되는 그림

    라이브러리(library): 활용 가능한 도구들의 집합이다. 필요할 때 호출하여 사용한다.

    프레임워크(framework): 소프트웨어의 특정 문제를 해결하기 위해 제공하는 여러 클래스와 컴포넌트로 구성되어 있다. 이 집합, 정해진 규칙 안에서 프로그래머가 필요한 코드를 짜넣으며 완성해 나가야 한다.

     

     

    requests, beautifulsoup

    requests

    python으로 HTTP 호출할 때 가장 많이 사용되는 라이브러리로, 웹페이지의 html문서를 문자열로 가져온다.

    import requests
    requests.get("URL")

    이렇게 URL에 접속하면 status_code 200이 응답되는 것을 확인할 수 있을 것이다.

    requests 라이브러리는 어떤 method의 HTTP 요청을 하는지에 따라 해당하는 이름의 함수를 사용하면 된다.

    requests.get()
    requests.post()
    requests.put()
    requests.delete()

     

    beautifulsoup

    request로 가져온 html 문자열을 python이 이해하는 구조로 변환해준다.

    import requests
    from bs4 import BeautifulSoup
    
    result = requests.get("URL")
    soup = BeautifulSoup(result.text, "html.parser")

    requests로 가져온 데이터는 문자열 형태의 html이고, 이를 tag, id, class로 객체화 시켜주는 것이 beautifulsoup이다.

     

     

    find, find_all, select, select_one

    beautifulsoup의 method 중 많이 사용되는 것이 바로 find와 select이다.

    find는 html tag를 통해 원하는 부분을 찾고, select는 css를 통해 원하는 부분을 찾는다.

    a = soup.find("p")
    b = soup.find("p",{"class":"main"})
    c = soup.find("p",{"class":"main"})["att"]

    tag는 이름과 tag 안의 속성들, 그리고 속성값을 사용하여 찾을 수 있다.

    find_all은 말그대로 해당되는 모든 tag들을 리스트로 반환하고, find는 해당되는 첫 번째 tag만 가져온다. 리스트로 반환되지는 않는다. (select와 select_one도 마찬가지)

    a = soup.select("a")
    b = soup.select_one("a")["href"]
    c = soup.select("a")[3]

    select는 CSS selector로 tag를 찾는다. select_one은 해당되는 첫 번째 tag만 가져온다. 

     

     

dotori..