DevSSOM

파이썬 크롤링 실습 - 여러 페이지의 기사 제목 수집하기 본문

Python/크롤링

파이썬 크롤링 실습 - 여러 페이지의 기사 제목 수집하기

데브쏨 2021. 6. 28. 18:40
반응형

여러 페이지의 기사 제목 수집하기

 

스포츠동아의 연예부 기사 제목 부분을 크롤링하는 실습.

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

 

스포츠동아

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

sports.donga.com

 

이 사이트는 URL의 쿼리 부분에서 p의 값에 따라 페이지가 결정됨. 한 페이지에 기사가 20개씩 있기 때문에 p=1이면 1페이지, p=21이면 2페이지와 같은 식으로 페이지마다 20개씩 증가하게 됨.

 

1페이지일 때
2페이지일 때

URL을 문자열의 덧셈 연산으로 만들 수도 있지만, requests.get 함수의 params 매개변수로 쿼리 변수를 추가할 수도 있음. 하지만 이번에는 각 기사로 이동할 수 있는 href를 수집하는 방법을 사용해보기. href는 a 태그의 속성으로 있기 때문에 크롤링된 a 태그에 접근해서 얻을 수 있음. a['href'] 이렇게.

 

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    return None
    


def main() :
    answer = []
    url = "https://sports.donga.com/ent"
    
    for i in range(0, 5):
        req = # requests.get 메소드를 호출
        soup = BeautifulSoup(req.text, "html.parser")
        
        answer += crawling(soup)

    # crawling 함수의 결과를 출력
    print(answer)


if __name__ == "__main__" :
    main()

 

 

>>>

 

구글 검사로 HTML을 확인해보면, 기사들의 제목은 <a>태그에 있고, 상위 태그로는 <span class="tit"> 태그, 더 상위 태그로는 <ul class="list_news">가 있음.

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환

    ul = soup.find("ul", class_="list_news")
    
    for span in ul.find_all("span", class_="tit"):
    	print(span.get_text())

기사 제목들이 리스트 안에 들어가게 만들어주기 위해서

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    
    ul = soup.find("ul", class_="list_news")
    
    result = []
    
    for span in ul.find_all("span", class_="tit"):
        result.append(span.get_text())
    
    return result

 

그리고, 페이지마다 p가 20씩 증가하는 쿼리를 적용하기 위해서

req = requests.get(url, params={'p' : i*20+1})

 

최종 코드

import requests
from bs4 import BeautifulSoup

def crawling(soup) :
    # soup 객체에서 추출해야 하는 정보를 찾고 반환
    
    ul = soup.find("ul", class_="list_news")
    
    result = []
    
    for span in ul.find_all("span", class_="tit"):
        result.append(span.get_text())
    
    return result


def main() :
    answer = []
    url = "https://sports.donga.com/ent"
    
    for i in range(0, 5):
        req = requests.get(url, params={'p' : i*20+1})
        soup = BeautifulSoup(req.text, "html.parser")
        
        answer += crawling(soup)

    # crawling 함수의 결과를 출력
    print(answer)


if __name__ == "__main__" :
    main()

 

 

 

728x90
반응형
댓글