어두운 proxyscrape 로고

Web Scraping for News Articles using Python– Best Way In 2024

Python, 1월-03-20235분 읽기

뉴스는 전 세계에서 무슨 일이 일어나고 있는지 알 수 있는 가장 좋은 방법입니다. 데이터 엔지니어에게 뉴스 기사는 엄청난 양의 데이터를 수집할 수 있는 가장 좋은 방법 중 하나입니다. 더 많은 데이터는 더 많은 인사이트를 의미하며, 그래야만 기술을 혁신하고 인류를 그 어느 때보다 더 높은 수준으로 끌어올릴 수 있습니다. 하지만 뉴스가 너무 많아 모든 데이터를 수동으로 수집하는 것은 인간적으로 불가능합니다. 그렇다면 데이터를 자동으로 가져오는 가장 좋은 방법은 무엇일까요? 정답은 바로 파이썬을 이용한 뉴스 기사 웹 스크래핑입니다.

이 글에서는 여러 신문의 최신 뉴스 기사를 스크랩하여 텍스트로 저장하는 웹 스크레이퍼를 만들어 보겠습니다. 다음 두 단계를 통해 전체 프로세스가 어떻게 수행되는지 심층적으로 분석해 보겠습니다.

  1. 웹 페이지와 HTML에 대한 표면 수준의 소개입니다.
  2. Python과 BeautifulSoup이라는 유명한 라이브러리를 사용한 웹 스크래핑.

파이썬을 사용하여 뉴스 기사에 대한 웹 스크래핑을 수행하는 방법에 대해 자세히 알아보려면 원하는 섹션으로 자유롭게 이동하세요.

목차

웹 페이지 및 HTML에 대한 표면 수준 소개

웹사이트나 웹페이지에서 중요한 정보를 철회하려면 해당 웹사이트가 어떻게 작동하는지 아는 것이 중요합니다. 웹 브라우저(크롬, 파이어폭스, 모질라 등)를 사용하여 특정 URL로 이동하면 해당 웹 페이지는 세 가지 기술의 조합으로 이루어집니다,

HTML(하이퍼텍스트 마크업 언어): HTML은 웹페이지의 콘텐츠를 정의합니다. 웹사이트에 콘텐츠를 추가하기 위한 표준 마크업 언어입니다. 예를 들어 웹사이트에 텍스트, 이미지 또는 기타 콘텐츠를 추가하려는 경우 HTML을 사용하면 쉽게 추가할 수 있습니다.

CSS(캐스케이딩 스타일 시트): 웹 페이지 스타일 지정에 사용됩니다. CSS는 특정 웹사이트에 표시되는 모든 시각적 디자인을 처리합니다.

자바스크립트: 자바스크립트는 웹페이지의 두뇌입니다. 자바스크립트는 모든 로직 처리와 웹 페이지 기능을 처리합니다. 따라서 콘텐츠와 스타일을 대화형으로 만들 수 있습니다.

이 세 가지 프로그래밍 언어를 통해 웹페이지의 측면을 만들고 조작할 수 있습니다.

이 글을 위해 웹 페이지와 HTML의 기본을 알고 계실 거라고 생각합니다. div, 태그, 제목 등과 같은 일부 HTML 개념은 이 웹 스크레이퍼를 만드는 동안 매우 유용할 수 있습니다. 모든 것을 알 필요는 없지만 웹 페이지 디자인의 기본 사항과 그 안에 정보가 어떻게 포함되어 있는지만 알면 됩니다.

파이썬에서 BeautifulSoup을 사용하여 뉴스 기사 웹 스크래핑하기

파이썬에는 웹 페이지에서 정보를 스크랩할 수 있는 여러 패키지가 있습니다. 웹 스크래핑을 위한 가장 유명하고 사용하기 쉬운 Python 라이브러리 중 하나인 BeautifulSoup을 계속 사용하겠습니다.

BeautifulSoup은 URL의 HTML 콘텐츠를 파싱하고 태그와 레이블을 사용하여 액세스하는 데 가장 적합합니다. 따라서 웹사이트에서 특정 텍스트 조각을 추출하는 데 편리합니다.

단 3~5줄의 코드만으로 인터넷에서 원하는 웹사이트의 모든 유형의 텍스트를 추출할 수 있어 사용하기 쉬우면서도 강력한 패키지임을 알 수 있습니다.

아주 기본적인 것부터 시작하겠습니다. 라이브러리 패키지를 설치하려면 Python 배포판에 다음 명령을 입력합니다,

pip 설치 beautifulsoup4

또한 '요청 모듈'은 페이지의 HTML 코드를 BeautifulSoup에 제공하기 때문에 사용할 것입니다. 설치하려면 파이썬 배포판에 다음 명령을 입력합니다,

pip 설치 요청

이 요청 모듈을 사용하면 웹 페이지에서 HTML 코드를 가져와 BeautfulSoup 패키지를 사용하여 탐색할 수 있습니다. 작업을 훨씬 쉽게 만들어주는 두 가지 명령은 다음과 같습니다.

find_all(엘리먼트 태그, 속성): 이 함수는 태그와 속성을 매개변수로 받아 웹페이지에서 모든 HTML 요소를 찾을 수 있게 해줍니다. 이 함수는 같은 유형의 모든 요소를 식별합니다. 대신 find()를 사용하여 첫 번째 요소만 가져올 수 있습니다.

get_text(): 지정된 요소를 찾으면 이 명령을 사용하여 내부 텍스트를 추출할 수 있습니다.

웹 페이지의 HTML 코드를 탐색하고 스크랩하려는 요소를 찾으려면 페이지를 마우스 오른쪽 버튼으로 클릭하거나 Ctrl+F를 눌러 '요소 검사' 옵션을 사용하면 됩니다. 그러면 웹페이지의 소스 코드를 볼 수 있습니다.

관심 있는 요소를 찾으면 요청 모듈이 포함된 HTML 코드를 가져오고, 해당 요소를 추출하기 위해 BeautifulSoup을 사용합니다.

이 기사에서는 EL Paris 영자 신문과 함께 진행합니다. 첫 페이지에서 뉴스 기사 제목을 스크랩한 다음 텍스트를 스크랩할 것입니다.

뉴스 기사의 HTML 코드를 살펴보면 첫 페이지의 기사가 다음과 같은 구조로 되어 있는 것을 확인할 수 있습니다,

The title has <h2> element with itemprop=”headline” and class=”articulo-titulo” attributes. It has an href attribute containing the text. So we will now extract the text using the following commands:

요청 가져오기 
bs4에서 BeautifulSoup 가져오기

요청 모듈을 사용하여 HTML 콘텐츠를 가져오면 이를 커버페이지 변수에 저장할 수 있습니다:

# 요청
r1 = requests.get(url)
r1.status_code
 
# 커버페이지에 표지 콘텐츠를 저장합니다.
커버페이지 = r1.content

다음으로 수프 변수를 정의하겠습니다,

# 수프 만들기
soup1 = BeautifulSoup(coverpage, 'html5lib')

다음 코드 줄에서 찾고자 하는 요소를 찾겠습니다,

# 뉴스 식별
커버페이지_뉴스 = soup1.find_all('h2', class_='articulo-titulo')

final_all을 사용하면 모든 발생을 가져옵니다. 따라서 각 항목이 뉴스 기사로 구성된 목록을 반환해야 합니다,

텍스트를 추출하기 위해 다음 명령을 사용합니다:

커버페이지_뉴스[4].get_text()

속성 값(이 경우 링크)에 액세스하려면 다음 명령을 사용할 수 있습니다,

coverpage_news[4]['href']

이렇게 하면 링크를 일반 텍스트로 가져올 수 있습니다.

여기까지 모든 개념을 이해했다면 원하는 콘텐츠를 웹 스크랩할 수 있습니다.

다음 단계는 href 속성을 사용하여 각 뉴스 기사의 콘텐츠에 액세스하고, 소스 코드를 가져와 HTML 코드에서 단락을 찾은 다음, 마지막으로 BeautifulSoup을 사용하여 해당 단락을 가져오는 것입니다. 위에서 설명한 것과 동일한 프로세스이지만 뉴스 기사 콘텐츠를 식별하는 태그와 속성을 정의해야 합니다.

전체 기능에 대한 코드는 아래에 나와 있습니다. 코드에 주석이 달려 있으므로 각 줄을 따로 설명하지는 않겠으며, 주석을 읽으면 명확하게 이해할 수 있습니다.

number_of_articles = 5

# 콘텐츠, 링크 및 제목에 대한 빈 목록 만들기
news_contents = []
list_links = []
list_titles = []
 
np.arange(0, number_of_articles)  n에대해:
    
   # 뉴스 기사만(앨범과 다른 것들도 있음)
   if "inenglish" 가 coverpage_news[n].find('a')['href']  없으면:  
       계속
    
   # 기사 링크 가져오기
   link = coverpage_news[n].find('a')['href']
    list_links.append(link)
    
   # 제목 가져오기
    title = coverpage_news[n].find('a').get_text()
    list_titles.append(title)
    
   # 콘텐츠 읽기(단락으로 나뉘어 있음)
    article = requests.get(link)
    article_content = article.content
    soup_article = BeautifulSoup(article_content, 'html5lib')
    body = soup_article.find_all('div', class_='articulo-cuerpo')
    x = body[0].find_all('p')
    
   # 단락 통합하기
    list_paragraphs = []
   for p in np.arange(0, len(x)):
        paragraph = x[p].get_text()
        list_paragraphs.append(paragraph)
        final_article = " ".join(list_paragraphs)
        
    news_contents.append(final_article)

추출한 글을 다음과 같이 입력해 보겠습니다:

  • 모델을 입력할 데이터 세트(df_features).
  • 제목과 링크(df_show_info)가 포함된 데이터 집합입니다.

# df_features
df_features = pd.DataFrame(
     {'Article Content': news_contents 
    })
 
# df_show_info
df_show_info = pd.DataFrame(
    {'Article Title': list_titles,
     'Article Link': list_links})
df_features

df_show_info

더 나은 사용자 경험을 정의하기 위해 스크립트가 뉴스를 가져오는 데 걸리는 시간도 측정할 것입니다. 이를 위한 함수를 정의한 다음 호출하겠습니다. 다시 말씀드리지만 코드에 주석이 달려 있으므로 모든 코드 줄을 설명하지는 않겠습니다. 명확하게 이해하려면 해당 코멘트를 읽어보시면 됩니다.

def get_news_elpais():
    
    # url definition
    url = "https://elpais.com/elpais/inenglish.html"
    
    # Request
    r1 = requests.get(url)
    r1.status_code
 
    # We'll save in coverpage the cover page content
    coverpage = r1.content
 
    # Soup creation
    soup1 = BeautifulSoup(coverpage, 'html5lib')
 
    # News identification
    coverpage_news = soup1.find_all('h2', class_='articulo-titulo')
    len(coverpage_news)
    
    number_of_articles = 5
 
    # Empty lists for content, links and titles
    news_contents = []
    list_links = []
    list_titles = []
 
    for n in np.arange(0, number_of_articles):
 
        # only news articles (there are also albums and other things)
        if "inenglish" not in coverpage_news[n].find('a')['href']:  
            continue
 
        # Getting the link of the article
        link = coverpage_news[n].find('a')['href']
        list_links.append(link)
 
        # Getting the title
        title = coverpage_news[n].find('a').get_text()
        list_titles.append(title)
 
        # Reading the content (it is divided in paragraphs)
        article = requests.get(link)
        article_content = article.content
        soup_article = BeautifulSoup(article_content, 'html5lib')
        body = soup_article.find_all('div', class_='articulo-cuerpo')
        x = body[0].find_all('p')
 
        # Unifying the paragraphs
        list_paragraphs = []
        for p in np.arange(0, len(x)):
            paragraph = x[p].get_text()
            list_paragraphs.append(paragraph)
            final_article = " ".join(list_paragraphs)
 
        news_contents.append(final_article)
 
    # df_features
    df_features = pd.DataFrame(
         {'Content': news_contents 
        })
 
    # df_show_info
    df_show_info = pd.DataFrame(
        {'Article Title': list_titles,
         'Article Link': list_links,
         'Newspaper': 'El Pais English'})
    
    return (df_features, df_show_info)

파이썬을 사용한 뉴스 기사 웹 스크래핑에 가장 적합한 프록시는 무엇인가요?

ProxyScrape 는 온라인에서 가장 인기 있고 신뢰할 수 있는 프록시 제공업체 중 하나입니다. 세 가지 프록시 서비스에는 전용 데이터센터 프록시 서버, 주거용 프록시 서버, 프리미엄 프록시 서버가 있습니다. 그렇다면 파이썬을 사용한 뉴스 기사 웹 스크래핑에 가장 적합한 HTTP 프록시 솔루션은 무엇일까요? 이 질문에 답하기 전에 각 프록시 서버의 기능을 살펴보는 것이 가장 좋습니다.

전용 데이터센터 프록시 는 분석 목적으로 다양한 서버에서 대량의 데이터(크기 기준)를 스트리밍하는 등 고속 온라인 작업에 가장 적합합니다. 이는 조직이 단시간에 대량의 데이터를 전송하기 위해 전용 프록시를 선택하는 주된 이유 중 하나입니다.

전용 데이터센터 프록시는 무제한 대역폭 및 동시 연결, 간편한 통신을 위한 전용 HTTP 프록시, 보안 강화를 위한 IP 인증 등 다양한 기능을 제공합니다. 99.9%의 가동 시간으로 어떤 세션 중에도 전용 데이터센터가 항상 작동하므로 안심할 수 있습니다. 마지막으로 ProxyScrape 은 우수한 고객 서비스를 제공하며 영업일 기준 24~48시간 이내에 문제를 해결할 수 있도록 도와드립니다. 

다음은 주거용 프록시입니다. 주거용 프록시는 모든 일반 소비자가 사용하는 프록시입니다. 주된 이유는 주거용 프록시의 IP 주소가 ISP에서 제공하는 IP 주소와 유사하기 때문입니다. 즉, 대상 서버의 데이터에 액세스할 수 있는 권한을 평소보다 쉽게 얻을 수 있습니다. 

ProxyScrape의 또 다른 기능은 로테이팅 기능입니다. 로테이팅 프록시를 사용하면 주거용 프록시가 IP 주소를 동적으로 변경하여 대상 서버가 프록시 사용 여부를 확인하기 어렵기 때문에 계정이 영구적으로 차단되는 것을 방지할 수 있습니다. 

그 외에도 무제한 대역폭과 동시 연결, 전용 HTTP/s 프록시, 프록시 풀에 있는 700만 개 이상의 프록시를 통해 언제든지 세션에서 프록시, 보안 강화를 위한 사용자 이름 및 비밀번호 인증, 마지막으로 국가 서버 변경 기능 등 다양한 기능이 있습니다. 사용자 아이디 인증에 국가 코드를 추가하여 원하는 서버를 선택할 수 있습니다. 

마지막은 프리미엄 프록시입니다. 프리미엄 프록시는 전용 데이터센터 프록시와 동일합니다. 기능은 동일하게 유지됩니다. 가장 큰 차이점은 접근성입니다. 프리미엄 프록시에서는 프록시 목록(프록시가 포함된 목록)을 ProxyScrape네트워크의 모든 사용자가 사용할 수 있습니다. 그렇기 때문에 프리미엄 프록시는 전용 데이터센터 프록시보다 비용이 저렴합니다.

그렇다면 파이썬을 사용하는 뉴스 기사 웹 스크래핑에 가장 적합한 HTTP 프록시 솔루션은 무엇일까요? 정답은 "주거용 프록시." 이유는 간단합니다. 위에서 말했듯이 주거용 프록시는 순환 프록시로, 일정 기간 동안 IP 주소가 동적으로 변경되므로 짧은 시간 내에 많은 요청을 전송하여 IP 차단을 받지 않고 서버를 속이는 데 유용할 수 있습니다. 

다음으로 가장 좋은 방법은 국가를 기준으로 프록시 서버를 변경하는 것입니다. IP 인증 또는 사용자 이름 및 비밀번호 인증 끝에 국가 ISO_CODE를 추가하기만 하면 됩니다. 

추천 읽기:

  1. YouTube 댓글 스크랩 - 간단한 5단계
  2. 2023년 최고의 파이썬 웹 스크래핑 도구 상위 8가지

자주 묻는 질문:

1. What is the best way to scrape news articles using python?
The python library is called “BeautifulSoup” and can automatically scrape data from any news article. The only requirement would be a basic knowledge of HTML for locating the HTML tag from the page source code that contains the data that needs to be scraped.
2. Is it okay to scrape news articles from the website?
답은 웹사이트의 이용 약관에 따라 다릅니다. 그러나 대부분의 뉴스 기사는 모든 정보가 의도적으로 공개되어 있기 때문에 스크랩할 수 있습니다. 스크래핑 방법이 데이터나 웹사이트 소유자에게 피해를 주지 않는 한 모든 공개 데이터를 스크랩할 수 있습니다.
3. How do I scrape Google News using Python?
"BeautifulSoup"이라는 파이썬 라이브러리의 도움으로 파이썬을 사용하여 Google 뉴스 또는 모든 뉴스 기사를 스크랩할 수 있습니다. 대상 서버에서 IP 차단을 방지하기 위해 라이브러리와 신뢰할 수 있는 주거용 프록시를 설치합니다.

마무리

이 글에서는 웹 페이지 흐름 디자인과 구조의 기본을 이해함으로써 웹 스크래핑의 기초를 살펴봤습니다. 또한 뉴스 기사에서 데이터를 추출하여 직접 체험해 보았습니다. 웹 스크래핑은 올바르게 수행하면 놀라운 일을 할 수 있습니다. 예를 들어, 추출된 데이터를 기반으로 카테고리를 예측하고 사용자에게 요약을 보여줄 수 있는 완전히 최적화된 모델을 만들 수 있습니다. 가장 중요한 것은 요구 사항을 파악하고 페이지 구조를 이해하는 것입니다. Python에는 원하는 데이터를 추출하기 위한 매우 강력하면서도 사용하기 쉬운 라이브러리가 있습니다. 덕분에 웹 스크래핑이 매우 쉽고 재미있어졌습니다.  

이 코드는 이 특정 웹페이지에서 데이터를 추출할 때 유용하다는 점에 유의하세요. 다른 페이지에서 이 작업을 수행하려면 해당 페이지의 구조에 따라 코드를 최적화해야 합니다. 하지만 일단 식별하는 방법만 알면 프로세스는 완전히 동일합니다.

이 글에서는 파이썬을 사용한 뉴스 기사 웹 스크래핑의 실용적인 접근 방식에 대해 자세히 설명하고자 합니다. 한 가지 기억해야 할 것은 웹 스크래핑에는 프록시가 절대적으로 필요하다는 것입니다. 프록시는 대상 서버의 IP 차단을 방지하는 데 도움이 됩니다. ProxyScrape 는 파이썬 프로젝트를 사용하는 뉴스 기사 웹 스크래핑을 위한 훌륭하고 안정적인 주거용 프록시를 제공합니다.