requests 모듈(get 방식 크롤링)

반응형
    반응형

    크롤링을 하는데 꼭 필요한 모듈이 requests 모듈입니다. 웹사이트를 내 공간으로 불러들여야 코딩작업을 할 수 있는데 requests로 불러올 수 있습니다. 웹크롤링의 시작이고 반드시 해야 하는 작업중에 하나입니다.

     

    HTTP 전달 방식

    http는 크게 get 방식과 post 방식으로 나뉩니다.

    간단하게 구분을 하자면

    get 방식은 링크를 보면 www.naver.com/~~~ 로 뒤에 무언가가 붙어서 주소로써 나오는 것들을 말하고

    post 방식은 주소로 보이지 않고 창에 나오는 것들을 말합니다.

    아이디나 비밀번호도 주소에 나온다면 큰 문제기 때문에 방식을 바꿔서 전송을 합니다.

     

    Get 방식 크롤링

    get 방식은 url만 알아내면 금방 가져올 수 있습니다. 

    아무 기사를 크롤링 해봅시다.

    https://news.v.daum.net/v/20200130031705653

     

    [IF] 쓸수록 달아오르는 로봇·스마트폰, 땀 흘려 熱 식힌다

    로봇손이 펄펄 끓는 물에서 유리컵을 집어 올린다. 로봇 손가락은 사람 피부처럼 부드러운 고분자 재질이어서 자칫 눌어붙을 수 있다. 그런데도 아무 변화가 없다. 손가락 표면에서 흐르는 물이 온도가 높아지는 것을 막아주기 때문이다.로봇이나 스마트폰이 사람처럼 땀을 흘려 열을 조절할 수 있는 날이 다가오고 있다. 사람이 사냥감을 쫓아 장거리를 이동할 수 있었던

    news.v.daum.net

    이 기사를 파이썬으로 불러오려고 합니다.

    F12 를 누르면 개발자 모드가 나옵니다.

    그러면 옆에 뭔가가 뜹니다. 거기서 type이 document 인걸 찾아서 클릭을 하면 다음과 같이 나옵니다.

    Request URL이 사이트 주소가 되는데 우리가 원래 보던 주소와 같을 수도 있고 다를 수도 있습니다.

    파이썬으로 불러오기 위해 이 주소를 가져옵니다.

    requests.get('https://news.v.daum.net/v/20200130031705653')

    200번이 나온다면 정상연결 되었다는 의미입니다. 그런데 이걸 가져오려는게 아니라 text를 가져와야 합니다.

    간단합니다. 

    resp = requests.get('https://news.v.daum.net/v/20200130031705653')
    resp.text

     

    resp 라 정의하고 text를 넣겠습니다. 그러면 html이 하나 나오는 것을 볼 수 있습니다. 다 된 겁니다. 

    request로 내용을 가져왔습니다. 이 데이터를 다루는 건 beautiful soup 로 하면 되겠습니다.

     

    크롤링이 잘 안 될 때

    위에서처럼 해도 잘 안 되는 경우가 있습니다. 그 이유는 코딩으로 하면 사람이 한 것 같은 느낌이 안 들기 때문에 데이터전송을 차단해버리는 경우가 종종 있습니다. 그럴 때는 request headers 에 있는 내용을 하나씩 headers 에 추가해서 넣으면 됩니다. 보통 referer이나 user-agent 의 내용을 넣으면 되는데 안되면 다 하나씩 넣어봅니다.

    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'}
    resp = requests.get(url, headers= headers)

     

    Post 방식 크롤링

    post는 주소로 나타나지 않기 때문에 get 방식처럼 간단하지는 않습니다. post방식으로 전송하는 하는 이유는 다양합니다. 정보를 알려주면 안된다거나 정보를 알려주기 싫어서 그렇습니다. 사용자의 개인정보 보호를 위해서 정보를 숨기고 전송하거나 기껏 만든 데이터를 그냥 막 쓰게 놔둘수는 없어서 post로 보냅니다.

    간단한 post 요청은 requests.post(url)로 합니다.

    다만 여기다가 data 와 header를 조금 넣어주어야 됩니다.

    request headers에 있는 내용을 dict으로 작성합니다. 다 쓸 필요는 없고 user-agent, referer 정도를 넣으면 됩니다.

    data는 form_data 라는 곳이 있는데 거기에 내용을 dict로 작성합니다.

     

    url = 'https://logins.daum.net/accounts/login.do?slevel=1'
    data = { 'url':'https://www.daum.net/','weblogin':'1', 'fuid':'bu31fsyjKNcY4PIHtL7t6juEA5sohim3Kp0H0AA4oAQcVPiVhdX4R0Zl8gw5rmFFkxHPpoba5u-YkQmM11sAn9-YnAgFqXchnypDJJjVNw9Z7X7Wg',
             'id' :'asdf', 'pw':'asdf', 'ipSecurity':'checked'}
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'}
    requests.post(url, data=data, header=headers)

    이런 식으로 하면 나오긴합니다. 지금 페이지는 다음 로그인 페이지라서 다른 방식으로 해야하긴 하지만 다음과 같은 방식으로 하면 간단한 post방식은 됩니다. 

    post 방식을 크롤링을 하려면 Beautiful soup 이나 selenium을 사용해야 하는 경우가 있어서 자세한 방법은 추후에 따로 포스팅을 하도록 하겠습니다.

     

     

    댓글

    Designed by JB FACTORY

    ....