뉴스 크롤링하기

반응형
    반응형

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

     

    외신 "삼성 갤럭시Z플립 3월 23만대 판매..전달보다 56.1% 증가"

    (서울=연합뉴스) 이한승 기자 = 삼성전자의 폴더블폰 갤럭시 Z플립의 3월 판매량이 전달보다 50% 이상 증가한 것으로 나타났다. 샘모바일 등 미국 IT전문매체는 5일(현지시각) 삼성 갤럭시 Z플립이

    news.v.daum.net

    다음 뉴스를 가지고 크롤링을 해보겠습니다.

     

    뉴스 제목 크롤링

    뉴스 제목을 크롤링하는 방식은 다음과 같습니다.

    1. requests 모듈로 기사의 링크를 가져옵니다. 
    2. BeautifulSoup으로 Html을 파싱해옵니다.
    3. 뉴스 제목에 해당하는 tag를 파싱한 곳에서 찾습니다.
    4. 찾은 tag에서 get_text()를 이용해 text를 가져옵니다.

    위 방법을 토대로 다음과 같이 코드를 작성합니다.

    import requests
    from bs4 import BeautifulSoup
    url = 'https://news.v.daum.net/v/20200506153410306'
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text)
    news_title = soup.select_one('h3.tit_view')
    news_title.get_text()

    제목이 나오는 것을 볼 수 있습니다. 여기서 select_one 은 딱 한개만 찾을 때 쓰는 매소드이고 get_text()는

    다음 tag를 보면 <>외신 "삼성 갤럭시z플립~~~</> 으로 되어있는데 여기서 value값을 가져오는 매소드입니다.

    h3.tit_view는 직접 찾아야하는데 위 뉴스가 뜬 해당페이지에서 개발자모드(F12 키 누름)를 켜면 찾을 수 있습니다.

    개발자 모드를 누르면 오른쪽에 어떤 화면이 뜹니다.

     

     

    그러면 위 화살표 모양을 누른 후 뉴스 제목에 갖다대면 파랗게 그려지면서 아래 그림처럼 옆에 태그가 나옵니다. 

    참고로 개발자 모드를 들어갔는데 아무것도 안 뜨면 새로고침해서 다시 데이터를 받아오면 됩니다.

     


    뉴스 본문 크롤링

    뉴스 본문도 뉴스 제목 찾기와 동일한 방법으로 합니다. 좀 더 살펴봐야 할 곳은 본문 선택후의 tag 형태입니다.

    본문을 선택했더니 다음과 같은 tag가 나옵니다. 여기서 우리가 원하는건 p로 엮여져 있는 모든 text입니다.

    그래서 harmonyContainer 에서 p를 찾도록 합니다. for과 select를 이용해 harmonyContainer 에 있는 모든 p로 이루어진 text를 가져오겠습니다. 뉴스제목에서 쓰던 코드를 이미 썼다 생각하고 본문에서 text 가져오는 코드만 쓰겠습니다.

    content = ''
    for p in soup.select('div#harmonyContainer p'):
        content +=p.get_text()
    print(content)

    깔끔하게 본문 내용을 가져온 것을 볼 수 있습니다.

     

    뉴스 댓글 크롤링

    뉴스 댓글은 단순하게 html로 구성되어 있지 않고 ajax로 구현되어 있습니다. 댓글란에서 '더보기' 를 누르면 댓글란만 새로고침되는 것을 볼 수 있는데 이런 구현은 ajax로 가능합니다. 따라서, html을 파싱하는 BeautifulSoup으로는 찾을 수 댓글을 크롤링할 수가 없습니다. 

    그래서 댓글에 해당하는 링크를 찾아야합니다. 개발자 모드에 Network에서 Initiator 가 ajax인 것을 찾아서 눌러서 동일한 댓글이 있는지 확인합니다.

    그래서 Response에서 댓글과 똑같은 문구가 있는 것을 찾아냅니다. 찾았다면 그 링크를 Header에서 찾습니다.

    위 그림에서 파랗게 표시되어 있는 곳이 url입니다. 이 url을 활용하겠습니다. headers는 크롤링을 안 되는 경우에 더 넣어서 크롤링을 할 수 있게 하는 것이고 크롤링이 되지 않는다면 selenium을 활용해야 합니다. 

    url = 'https://comment.daum.net/apis/v1/posts/@20200506153410306/comments?parentId=0&offset=0&limit=3&sort=RECOMMEND&isInitial=true'
    
    headers = {
            'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb3J1bV9rZXkiOiJuZXdzIiwiZ3JhbnRfdHlwZSI6ImFsZXhfY3JlZGVudGlhbHMiLCJzY29wZSI6W10sImV4cCI6MTU4ODgwNzcwNywiYXV0aG9yaXRpZXMiOlsiUk9MRV9DTElFTlQiXSwianRpIjoiNDg0OWNlMGEtNDk2YS00MGQ5LWE5ZGUtMDRlMGMwMzllMmU5IiwiZm9ydW1faWQiOi05OSwiY2xpZW50X2lkIjoiMjZCWEF2S255NVdGNVowOWxyNWs3N1k4In0.yFLBDHykRwOinGGWPD3GXPw08O3aGueevxoRvSTddKI',
            'Origin': 'https://news.v.daum.net',
            'Referer': 'https://news.v.daum.net/v/20200506153410306',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36'
    }
    resp = requests.get(url, headers=headers)
    resp.json()

    이렇게 댓글을 가져왔습니다.

    댓글 정리는 추후에 json 다룰 때 포스팅하도록 하겠습니다. 감사합니다.

    댓글

    Designed by JB FACTORY

    ....