DevSSOM

파이썬 크롤링 실습 - 뉴스기사 링크 수집하기 본문

Python/크롤링

파이썬 크롤링 실습 - 뉴스기사 링크 수집하기

데브쏨 2021. 6. 29. 19:53
반응형

뉴스 기사의 href 수집하기

이전 실습에서 진행된 페이지가 1,2,3 — 으로 구성된 웹 사이트 형태도 있지만, 단일 페이지에 여러 가지 링크가 있는 경우가 있음. 스포츠동아 뉴스에서는 기사를 클릭하면 해당 기사를 볼 수 있는 url로 이동할 수 있는데, 이런 url로 이동하는 링크들을 수집해보기.

 

https://sports.donga.com/ent?p=1&c=02

 

스포츠동아

스포츠동아는 정보와 재미를 함께 즐길 수 있는 신문을 지향하고, 새로운 사회 트렌드와 독자의 목소리를 반영해 신속하고 정확한 뉴스를 전달합니다.

sports.donga.com

 

HTML 태그 중, 연동된 href를 수집하여 리스트형 변수 list_href에 담아 출력하는 실습임. get_href는 soup 객체를 받아서, 뉴스 기사들로 접근할 수 있는 href 링크를 리스트에 담아 반환해야 함.

 

어떤 태그가 갖고 있는 속성들은 딕셔너리의 형태로 저장됨. 예를 들어, a 태그가 href, onclick의 속성을 갖고 있다면 그 속성들은 아래와 같이 표현됨.

{"href" : ... , "onclick" : ...}

어떤 태그 a의 속성 href에 바로 접근하는 방법은 대괄호 안에 속성 이름을 명시하는 것.

a = soup.find("a")
a["href"]

 

전체 속성을 담고 있는 딕셔너리를 확인하기 위해서는 attrs 속성으로 확인할 수 있습니다.

a.attrs

 

import requests
from bs4 import BeautifulSoup

def get_href(soup) :
    # soup에 저장되어 있는 각 기사에 접근할 수 있는 href들을 담고 있는 리스트를 반환
    return None

def main():
    list_href = []

    url = "https://sports.donga.com/ent?p=1&c=02"
    result = requests.get(url)
    soup = BeautifulSoup(result.text, "html.parser")

    list_href = get_href(soup)
    print(list_href)

if __name__ == "__main__":
    main()

 

 

 

>>>

 

이전 글에서와 마찬가지로 웹 페이지에서 구글 검사로 HTML 태그를 확인해보면, <a>태그 안에 뉴스 기사의 href가 있고, 그 상위로 <span class="tit">, <ul class="list_news">가 있음. 이대로 <a>태그를 찾는 코드를 써보면

def get_href(soup) :
    # soup에 저장되어 있는 각 기사에 접근할 수 있는 href들을 담고 있는 리스트를 반환
    
    ul = soup.find("ul", class_="list_news")
    
    for span in ul.find_all("span", class_="tit"):
        print(span.find("a").attrs)

.attrs를 활용해서 <a> 태그가 어떤 속성값들을 담고 있는지 확인.

그러면 href 속성이 있다고 결과가 뜸. 그럼 이 href들을 얻기 위해서 a["href"]를 활용.

def get_href(soup) :
    # soup에 저장되어 있는 각 기사에 접근할 수 있는 href들을 담고 있는 리스트를 반환
    
    ul = soup.find("ul", class_="list_news")
    
    for span in ul.find_all("span", class_="tit"):
        print(span.find("a")["href"])

결과값들을 리스트 안에 담아주기 위해서 코드를 수정

def get_href(soup) :
    # soup에 저장되어 있는 각 기사에 접근할 수 있는 href들을 담고 있는 리스트를 반환
    
    ul = soup.find("ul", class_="list_news")
    
    result = []
    
    for span in ul.find_all("span", class_="tit"):
        result.append(span.find("a")["href"])
        
    return result

 

 

최종 코드

import requests
from bs4 import BeautifulSoup

def get_href(soup) :
    # soup에 저장되어 있는 각 기사에 접근할 수 있는 href들을 담고 있는 리스트를 반환
    
    ul = soup.find("ul", class_="list_news")
    
    result = []
    
    for span in ul.find_all("span", class_="tit"):
        result.append(span.find("a")["href"])
        
    return result
       
def main():
    list_href = []

    url = "https://sports.donga.com/ent?p=1&c=02"
    result = requests.get(url)
    soup = BeautifulSoup(result.text, "html.parser")

    list_href = get_href(soup)
    print(list_href)

if __name__ == "__main__":
    main()
728x90
반응형
댓글