Published 2020. 12. 24. 18:45
728x90
반응형

뉴스 기사 정보 찾기

한 페이지의 뉴스 기사 정보 추출하기

naver.py

import requests
from bs4 import BeautifulSoup

URL = "https://search.naver.com/search.naver?&where=news&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&sm=tab_pge&sort=1&photo=0&field=0&reporter_article=&pd=6&ds=2020.06.23&de=2020.12.20&docid=&nso=so:dd,p:6m,a:all&mynews=0"

def extract_naver_pages():
    result = requests.get(URL)

    soup = BeautifulSoup(result.text, "html.parser")

    # find로 찾은 결과를 sc_page_inner 변수에 넣고 리스트를 만들어 pages 변수에 넣어주기
    sc_page_inner = soup.find("div", {"class": "sc_page_inner"})  #페이징이 있는 클래스 찾기

    links = sc_page_inner.find_all('a')  #페이지를 알기 위해 모든 a태그 찾기 (여기서 pages는 list임)
    pages = []

    for link in links:
        pages.append(int(link.string))

    max_page = pages[-1]
    return max_page

def extract_naver_news(last_page):
    news = []
    for page in range(last_page):
        result = requests.get(f"{URL}&start={page*10}&refresh_start=0")
        soup = BeautifulSoup(result.text, "html.parser") #result에서 html을 파싱해주기
        results = soup.find_all("div", {"class":"news_wrap api_ani_send"}) #news_wrap api_ani_send이라는 class를 모두 찾기
        print(results)
    return news

 


추출한 페이지 정보에서 title정보 추출하기

naver.py

import requests
from bs4 import BeautifulSoup

URL = "https://search.naver.com/search.naver?&where=news&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&sm=tab_pge&sort=1&photo=0&field=0&reporter_article=&pd=6&ds=2020.06.23&de=2020.12.20&docid=&nso=so:dd,p:6m,a:all&mynews=0"

def extract_naver_pages():
    result = requests.get(URL)

    soup = BeautifulSoup(result.text, "html.parser")

    # find로 찾은 결과를 sc_page_inner 변수에 넣고 리스트를 만들어 pages 변수에 넣어주기
    sc_page_inner = soup.find("div", {"class": "sc_page_inner"})  #페이징이 있는 클래스 찾기

    links = sc_page_inner.find_all('a')  #페이지를 알기 위해 모든 a태그 찾기 (여기서 pages는 list임)
    pages = []

    for link in links:
        pages.append(int(link.string))

    max_page = pages[-1]
    return max_page

def extract_naver_news(last_page):
    news = []
    #for page in range(last_page):
    result = requests.get(f"{URL}&start={0*10}&refresh_start=0")
    soup = BeautifulSoup(result.text, "html.parser")
    results = soup.find_all("div", {"class":"news_wrap api_ani_send"})
    #print(results)
    for result in results:  #results는 html list이고, soup을 사용했으니까 soup의 list이기도 함
        title = result.find("a", {"class": "news_tit"})["title"] # 뉴스 title정보 출력
        print(title)
    return news

 


기사 링크 추출하기

naver.py

import requests
from bs4 import BeautifulSoup

URL = "https://search.naver.com/search.naver?&where=news&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90&sm=tab_pge&sort=1&photo=0&field=0&reporter_article=&pd=6&ds=2020.06.23&de=2020.12.20&docid=&nso=so:dd,p:6m,a:all&mynews=0"

def extract_naver_pages():
    result = requests.get(URL)

    soup = BeautifulSoup(result.text, "html.parser")

    # find로 찾은 결과를 sc_page_inner 변수에 넣고 리스트를 만들어 pages 변수에 넣어주기
    sc_page_inner = soup.find("div", {"class": "sc_page_inner"})  #페이징이 있는 클래스 찾기

    links = sc_page_inner.find_all('a')  #페이지를 알기 위해 모든 a태그 찾기 (여기서 pages는 list임)
    pages = []

    for link in links:
        pages.append(int(link.string))

    max_page = pages[-1]
    return max_page

def extract_news(html):
    title = html.find("a", {"class": "news_tit"})["title"] # 뉴스 title 정보 
    company = html.find("a", {"class": "info press"}).text # 신문사 정보
    link = html.find("a")["href"]  # 링크 주소
    return {
        'title': title, 
        'company': company,
        'link': link} #dictionary 생성

def extract_naver_news(last_page):
    news = []
    for page in range(last_page):
        print(f"Scrapping page {page}")
        result = requests.get(f"{URL}&start={page*10}&refresh_start=0") # 뉴스 기사 정보
        soup = BeautifulSoup(result.text, "html.parser")
        results = soup.find_all("div", {"class":"news_wrap api_ani_send"})
    for result in results:  #results는 html list이고, soup을 사용했으니까 soup의 list이기도 함
        news_info = extract_news(result)
        news.append(news_info) # news_info를 news배열에 담기
    return news

 


find와 find_all의 차이

find는 첫번째 찾은 결과를 가져옴

find_all은 리스트 전부를 가져옴

 

 

strip()

strip() 공백 제거
strip([chars]) 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거
lstrip([chars])  인자로 전달된 문자를 String의 왼쪽에서 제거
rstrip([chars])  인자로 전달된 문자를 String의 오른쪽에서 제거

 

 

.text와 .string 차이

.string 태그 하위에 문자열을 객체화 함

문자열이 없으면 None을 반환
.text는 하위 자식태그의 텍스트까지 문자열로 반환(유니코드 형식)
즉, 하위태그에 텍스트까지 문자열로 파싱할 경우 .text를 사용하는 것이 좋음

다만, 정확한 파싱을 위해서 선택자로 잘 접근해서 .string을 사용하는 걸을 선호하는 개발자들이
외국에는 더 많은 듯함 ➡ 잘 판단해서 사용하기

반응형

'프로그래밍 > Python' 카테고리의 다른 글

자료형 - 숫자형  (0) 2021.01.07
Web Scraping3(CSV 파일에 저장하기)  (0) 2020.12.25
Web Scraping1  (0) 2020.12.23
web Scrapping을 위한 requests와 BeautifulSoup 설치  (0) 2020.12.23
개발환경 세팅  (0) 2020.12.23
복사했습니다!