Pythonを使ったニュース記事のWebスクレイピング-2024年における最善の方法

パイソン, Jan-0420235分で読める

ニュースは、世界中で何が起きているかを知る最良の方法だ。データ・エンジニアにとって、ニュース記事は超現実的な量のデータを収集する素晴らしい方法のひとつだ。より多くのデータはより多くの洞察を意味し、それこそが我々のテクノロジーを革新し、人類をかつてない高みへと導く唯一の方法なのだ。しかし

ニュースは、世界中で何が起きているかを知る最良の方法だ。データ・エンジニアにとって、ニュース記事は超現実的な量のデータを収集する素晴らしい方法のひとつだ。より多くのデータはより多くの洞察を意味し、それこそが我々のテクノロジーを革新し、人類をかつてない高みへと導く唯一の方法なのだ。しかし、ニュースの量は多く、すべてのデータを手作業で取得するのは人間には不可能だ。データを自動的に取得する最善の方法は何か?その答えは、パイソンを使ったニュース記事のウェブスクレイピングだ。

この記事では、さまざまな新聞から最新のニュース記事をスクレイピングし、テキストとして保存するウェブスクレイパーを作成する。以下の2つのステップを経て、プロセス全体がどのように行われるかを詳しく分析する。

PythonとBeautifulSoupという有名なライブラリを使ったWebスクレイピング。

pythonを使ってニュース記事のウェブスクレイピングを行う方法について詳しく知りたい方は、どのセクションにも自由にジャンプしてください。

目次

表面レベルのウェブページとHTML入門

ウェブサイトやウェブページから重要な情報を引き出すには、そのウェブサイトがどのように機能しているかを知ることが重要である。ウェブブラウザ(Chrome、Firefox、Mozillaなど)を使って特定のURLにアクセスすると、そのウェブページは3つの技術の組み合わせになっている、

HTML(HyperText Markup Language):HTMLはウェブページのコンテンツを定義する。ウェブサイトにコンテンツを追加するための標準的なマークアップ言語です。例えば、テキストや画像、その他のものをウェブサイトに追加したい場合、HTMLはその手助けをします。

CSS(Cascading Style Sheets):ウェブページのスタイリングに使用される。CSSは、特定のウェブサイトで目にするすべての視覚的なデザインを処理します。

JavaScript:JavaScriptはウェブページの頭脳である。JavaScriptはすべてのロジック処理とウェブページの機能を処理します。したがって、コンテンツとスタイルをインタラクティブにすることができます。

これら3つのプログラミング言語によって、ウェブページの側面を作成し、操作することができる。

この記事を書くにあたって、あなたはウェブページとHTMLの基本を知っていると思う。div、タグ、見出しなど、いくつかのHTMLの概念は、このウェブスクレーパーを作成する際にとても役に立つかもしれない。すべてを知っている必要はないが、ウェブページのデザインと情報がどのように含まれているかという基本的なことだけを知っていれば大丈夫だ。

PythonでBeautifulSoupを使ってニュース記事をスクレイピングする

Pythonにはウェブページから情報をスクレイピングできるパッケージがいくつかある。Webスクレイピングのための最も有名で使いやすいPythonライブラリの1つなので、BeautifulSoupを紹介する。

BeautifulSoupはURLのHTMLコンテンツを解析し、タグやラベルを使ってアクセスするのに最適だ。そのため、ウェブサイトから特定のテキストを抽出するのに便利だろう。

たった3-5行のコードで、私たちは魔法をかけることができ、インターネットから選択したウェブサイトのあらゆるタイプのテキストを抽出することができます。

まずは基本から。ライブラリパッケージをインストールするには、以下のコマンドをPythonディストリビューションに入力してください、

pipinstallbeautifulsoup4

また、任意のページのHTMLコードをBeautifulSoupに提供する'requestsモジュール'も使用する。インストールするには、以下のコマンドをPythonディストリビューションに入力してください、

pipinstallリクエスト

このリクエストモジュールによって、ウェブページからHTMLコードを取得し、BeautfulSoupパッケージを使ってナビゲートできるようになる。私たちの作業をより簡単にする2つのコマンドは以下の通りです。

find_all(要素 tag, attribute):この関数はtagとattributeをパラメータとして取り、ウェブページから任意のHTML要素を見つけることができます。この関数は、同じ型の要素をすべて特定します。代わりにfind()を使えば、最初の要素だけを見つけることができます。

get_text():指定した要素を見つけたら、このコマンドで内部のテキストを取り出します。

ウェブページのHTMLコードをナビゲートし、スクレイピングしたい要素を見つけるには、ページ上で右クリックするか、単にCtrl+Fを押すことで「inspect element」オプションを使うことができる。これでウェブページのソースコードを見ることができる。

目的の要素を見つけたら、requestsモジュールでHTMLコードを取得し、それらの要素を抽出するためにBeautifulSoupを使用する。

この記事では、ELパリ英字新聞を使用する。一面からニュース記事のタイトルをスクレイピングし、次に本文をスクレイピングする。

ニュース記事の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:

インポートリクエスト
frombs4importBeautifulSoup

requestsモジュールを使ってHTMLコンテンツを取得したら、それをcoverpage変数に保存することができる:

# リクエスト
r1 = requests.get(url)
r1.status_code
 
# カバーページの内容をcoverpageに保存する
カバーページ = r1.content

次に、スープ変数を定義する、

# スープの作成
soup1= BeautifulSoup(coverpage,'html5lib')

次のコードで、探している要素を見つける、

# ニュースの識別
coverpage_news= soup1.find_all('h2', class_='articulo-titulo')

final_allを使うと、すべての出現回数を取得することになる。したがって、各項目がニュース記事であるリストを返さなければならない、

テキストを抽出するために、以下のコマンドを使用する:

coverpage_news[4].get_text()

属性(ここではリンク)の値にアクセスしたい場合は、以下のコマンドを使うことができる、

coverpage_news[4]['href']

これでリンクをプレーンテキストで取得できる。

ここまでの概念をすべて理解していれば、自分の好きなコンテンツをウェブスクレイピングすることができる。

次のステップでは、href属性でニュース記事の各コンテンツにアクセスし、ソースコードを取得してHTMLコードの段落を見つけ、最後にBeautifulSoupで取得する。上で説明したのと同じプロセスだが、ニュース記事のコンテンツを識別するタグと属性を定義する必要がある。

全機能のコードを以下に示す。コードがコメントされているので、各行を個別に説明することはしない。コメントを読めば明確に理解できるだろう。

記事数=5
# コンテンツ、リンク、タイトルのための空のリスト
news_contents = [] (ニュース・コンテンツ)
list_links = [].
リスト_タイトル = [].
 
forninnp.arange(0, number_of_articles):
    
   # ニュース記事のみ(アルバムなどもある)
   if "inenglish"notincoverpage_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(リンク)
    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 = [].
   forpinnp.arange(0, len(x)):
        パラグラフ = 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)

Pythonを使ったニュース記事のWebスクレイピングに最適なプロキシは?

ProxyScrapeは、オンラインで最も人気があり、信頼性の高いプロキシプロバイダの1つです。3つのプロキシサービスは、専用のデータセンタープロキシサーバ、住宅プロキシサーバ、およびプレミアムプロキシサーバを含む。では、pythonを使ったニュース記事のウェブスクレイピングに最適なHTTPプロキシは何が考えられるでしょうか?その質問に答える前に、それぞれのプロキシサーバーの特徴を見るのが一番です。

データセンター専用プロキシは、分析目的で様々なサーバーから大量のデータ(サイズ的に)をストリーミングするような高速オンライン作業に最適です。これは、組織が短時間で大量のデータを送信するために専用プロキシを選択する主な理由の1つです。

データセンター専用プロキシには、無制限の帯域幅と同時接続、簡単な通信のための専用HTTPプロキシ、より高いセキュリティのためのIP認証など、いくつかの特徴があります。99.9%のアップタイムで、専用データセンターはどのようなセッションでも常に動作しますので、ご安心ください。最後になりますが、ProxyScrape は優れたカスタマーサービスを提供しており、24~48営業時間以内に問題を解決するお手伝いをいたします。 

次に住宅用プロキシである。住宅用プロキシは、すべての一般消費者にとって頼りになるプロキシである。主な理由は、住宅用プロキシのIPアドレスがISPから提供されるIPアドレスに似ているからである。つまり、ターゲットサーバーからそのデータにアクセスする許可を得るのが通常より簡単になる。 

ProxyScrapeの住宅用プロキシのもう一つの特徴は、ローテーション機能です。ローテーションプロキシは、レジデンシャルプロキシが動的にあなたのIPアドレスを変更するため、ターゲットサーバがあなたがプロキシを使用しているかどうかをチェックすることが困難になるため、アカウントの永久BANを回避するのに役立ちます。 

それとは別に、住宅用プロキシの他の機能は次のとおりです。無制限の帯域幅、同時接続、専用のHTTP / sプロキシ、プロキシプール内の700万人以上のプロキシのため、いつでもセッションでプロキシ、より多くのセキュリティのためのユーザー名とパスワード認証、そして最後には、国のサーバーを変更する機能。ユーザー名認証に国コードを追加することで、ご希望のサーバーを選択できます。 

最後のものはプレミアムプロキシである。プレミアムプロキシはデータセンター専用プロキシと同じです。機能は変わりません。主な違いはアクセシビリティです。プレミアムプロキシでは、プロキシリスト(プロキシを含むリスト)はProxyScrape'のネットワーク上のすべてのユーザーが利用できるようになります。そのため、プレミアムプロキシはデータセンター専用プロキシよりも安価です。

では、pythonを使ったニュース記事のウェブスクレイピングに最適なHTTPプロキシは何か?答えは "住宅用プロキシ"だ。理由は簡単だ。前述したように、レジデンシャルプロキシはローテーションプロキシであり、IPアドレスが一定期間にわたって動的に変更されるため、IPブロックを受けることなく、わずかな時間内に多くのリクエストを送信してサーバーをだますのに役立つ。 

次に、国によってプロキシサーバーを変更するのがベストでしょう。IP認証またはユーザー名とパスワードによる認証の最後に、その国のISO_CODEを追加するだけです。 

お勧めの本

YouTubeのコメントをスクレイピングする - 5つの簡単なステップ2023年ベストPythonウェブスクレイピングツールトップ8

よくある質問

1.pythonを使ってニュース記事をスクレイピングする最良の方法は何ですか?
このPythonライブラリは "BeautifulSoup "と呼ばれ、あらゆるニュース記事からデータを自動的にスクレイピングすることができる。唯一の要件は、スクレイピングする必要があるデータを含むページのソースコードからHTMLタグを見つけるためのHTMLの基本的な知識である。
2.ウェブサイトからニュース記事をスクレイピングしてもいいのでしょうか?
答えは、ウェブサイトの規約による。しかし、すべての情報は意図的に公開されているので、ほとんどのニュース記事はスクレイピングできる。あなたのスクレイピング方法がデータやウェブサイトの所有者に害を与えない限り、すべての公開データはスクレイピングできる。
3.Pythonを使ってGoogleニュースをスクレイピングするには?
BeautifulSoup "と呼ばれるPythonライブラリを使えば、Pythonを使ってGoogle Newsやあらゆるニュース記事をスクレイピングすることができる。このライブラリと、ターゲットサーバーからのIPブロックを防ぐための信頼できるレジデンシャルプロキシをインストールしてください。

まとめ

この記事では、Webページのフロー設計と構造の基本を理解することで、Webスクレイピングの基本を見てきた。また、ニュース記事からデータを抽出することで、実際に体験してみた。ウェブスクレイピングは、正しく行えば素晴らしい効果を発揮する。例えば、抽出されたデータをもとに、カテゴリーを予測したり、ユーザーに要約を表示したりすることができる、完全に最適化されたモデルを作ることができる。最も重要なことは、要件を把握し、ページの構造を理解することだ。Pythonには、好みのデータを抽出するための、非常に強力で使いやすいライブラリがいくつかある。そのおかげでウェブスクレイピングはとても簡単で楽しいものになりました。  

重要なのは、このコードはこの特定のウェブページからデータを抽出するのに役立つということだ。他のページからデータを取り出したい場合は、そのページの構造に合わせてコードを最適化する必要がある。しかし、一度識別方法がわかれば、プロセスはまったく同じだ。

この記事では、pythonを使ったニュース記事のウェブスクレイピングの実践的なアプローチについて詳しく説明したい。覚えておくべきことの一つは、ウェブスクレイピングにはプロキシが絶対に必要だということです。これはターゲットサーバーからのIPブロックを防ぐのに役立ちます。 ProxyScrapepythonを使ったニュース記事のWebスクレイピングプロジェクトでは、信頼性の高い住宅用プロキシを提供します。