WEBサイト内のリンクを10秒で一括取得する方法(WEBスクレイピング初級)

Programming

今回は、Pythonを仕様して指定したWEBサイト内の入っている全てのリンクを一瞬で取得してCSVファイルにまとめる方法を紹介します。

この方法を使用すれば面倒なデータ集めの作業を全て自動化する事が可能です。しかも一度覚えて、プログラムを作っておけばその後も使います事が出来るので、頻繁にデータ集めが必要な方にとっては長い期間役に立つかと思います。

PythonでWEBスクレイピング

初めに、Pythonを使用するにはdockerなどを使った仮想環境が必要になります。
「docker 環境構築」などと調べれば出てくるのでその通りの手順で作業して下さい。

また今回はJupyterLabと言われる対話型開発環境(IDE)を使用して作業していきます。

PythonでWEBスクレイピングするためには以下のプログラムを順番に実行して下さい


①初めにPythonライブラリであるBeautifulSoup、pandas、timeをインポートします。

# WEBスクレイピング
from bs4 import BeautifulSoup
import requests
import pandas as pd
import time

②リンクを取得したいWEBサイトのページURLをurl変数の中に入れます。r変数でurlをリクエストして、time.sleepで3秒間の余韻を持たせます。

# 取得したいWEBサイトを「url」で指定
url = 'https://ktlog.net'
r = requests.get(url)
time.sleep(3)

③soup変数の中にBeautifulSoupを使ってr変数に入れたURLのHTML文書を解析します。この状態でprint関数を使用すればページ内の全てのHTML文書が返されます。

# 全てのHTMLを取得
soup = BeautifulSoup(r.text, 'html.parser')

④必要なHTMLだけを取得したいので、contents変数の中にsoup.findを使ってHTML文書の中のclass="row"が付いた場所のコンテンツ内容のみを取得します。

# 指定したclassの中のHTMLを取得
contents = soup.find(class_="row")

⑤さらに今回はサイト内のリンクを取得したいため④で指定した箇所の中にあるaタグリンクを取得します。

# 指定したclassの中のHTMLを全て取得(class_=を外してHTMLタグでもOK)
get_a = contents.find_all("a")

するとaタグの中身だけが取得されます。


⑥次にlen関数を使って⑤で取得したget_aの個数を調べてます。(今回の場合は6個でした)

# 上のHTML数を数えてる
len(get_a)

⑦alinksの変数に上で指定した回数分、href内のリンクを取得する処理を実行するプログラムを指定します。try&exceptの書き方でエラーになった場合はスキップされる様にします。

# 上の回数分hrefの中身を取得ループ。エラーが起きたらスキップする
alinks = []
for i in range(len(get_a)):
    try:
        link_ = get_a[i].get("href")
        alinks.append(link_)
    except:
        pass

alinksの中身を確認してみるとこの通りリンクのみが抽出されているのが分かります。


⑧alinksをalinksのデータフレーム型に格納します。

# データフレーム型に格納
df = pd.DataFrame(alinks)
df

⑨最後にalinksのデータフレームをto_csv関数を使ってダウンロードします。

# CSVで保存
df.to_csv('WEBリンク一覧/result.csv', index=False, encoding='utf-8-sig')

①〜⑨を全て実行すると②で指定したURLのaタグリンクが全て取得されCSVとして保存されます。


こんな感じでPythonを使えばWEBサイト内のリンクを全て取得することが出来ます。この数字が1000になっても100000になっても一度の処理で全て取得されます。

例えば、私の場合はあるサイトのリンク内の全てのタイトルを取得して、そのタイトルと検索結果の相関性を調べるデータを作成する際に、らいとる部分を今回の技術を使って一括で取得しました。

このように非常に便利な技術で、業務効率化に使えるので、是非覚えて活用してみて下さい。

ProgrammingPython,WEB

Posted by KT