注目キーワード

ソースコードあり!URLの中にあるリンク一覧をcsvファイルに出力するPythonプログラム

IT

ライバルサイトの調査、作成したブログのリンク状況など、張っているリンクの一覧がほしいと思うことがあると思います。それを実現するため、Pythonでリンク一覧を取得するサンプルプログラムを作成してみた。

実際のソースコードは、記事の後半で公開します。

 

Pythonでリンク一覧を取得するプログラム

プログラムの流れ

 

やっていることはざっくり以下の通りです。

(1)コマンドラインからURLを取得する

(2)入力したURLにアクセスしてhtmlデータをダウンロードする

(3)htmlデータを解析する

(4)(3)のデータから「href」部分を取得してリンク(URL)を作成(csv書き出し用にメモリー上に保存しておく)する

(5)(4)で作成したリストをcsvに書き出します。

 

プログラムを動かす上で必要になるもの

プログラムを動かすとき以下のものがインストールされている必要があります。

・Python3(環境設定も含む)

・BeautifulSoup

・urlparse

 

ソースコード

実際のソースコードを記載します。

 

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
from urllib.parse import urlparse
from datetime import datetime
import csv
import sys
import urllib.request as req

u"""
指定したWEBサイトのリンクリスト取得ツール
結果はCSVファイル(ファイル名:linkList_日時.csv」)に出力します。
第1引数 調べる階層 最小1より(現在は未実装)
第2引数 調べるサイトのURL(ダブルクフォーテーションで括る)
"""

LinkColumnName = ['no', 'リンク名','URL']


def get_link_lists(url):
    linkLists = []

    res = req.urlopen(url)
    soup = BeautifulSoup(res, 'html.parser')

    for s in soup.find_all("a"): 
        wordDict = {}

        #リンク取得
        link = s.get("href")

        if(link[0] == '/'):
            parsed_url = urlparse(url)
            link = parsed_url.scheme + "://" +parsed_url.netloc + link
        
        wordDict[LinkColumnName[0]] = 0
        wordDict[LinkColumnName[1]] = s.text
        wordDict[LinkColumnName[2]] = link

        #追加
        linkLists.append(wordDict)

        #出力
        print(s.text + "  "+  link) 


    return linkLists;


if __name__ == '__main__':

    #ネットからデータ取得
    param = sys.argv
    if (len(param) == 0):
        print ("Usage: $ python " + param[0] + " number")
        quit()
    if(len(param) < 3):
        print ("入力データが足りないです 第一引数:調べる階層  第2引数:URL")
        quit()      


    #調べる深度depthを取得する
    depth = param[1]

    #url取得
    url = param[2]


    #リンクリスト取得
    linkLists = get_link_lists(url)


    #CSVファイル書き込み
    filename = "linkList_" + datetime.now().strftime("%Y%m%d") + ".csv"
    with open(filename, 'w') as csv_file:
        fieldnames = LinkColumnName
        writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
        writer.writeheader()

        #データ分出力する
        index = 0
        for data in linkLists:
            writer.writerow({LinkColumnName[0]:index, LinkColumnName[1]: data[LinkColumnName[1]], LinkColumnName[2]: data[LinkColumnName[2]]})
            index +=1

 

 

コードは、GitHubにも公開されています。

https://github.com/jshirius/web_tool/blob/master/analysis_link_lists.py

使い方

コマンドラインで以下のように入力します。

python analysis_link_lists.py 1(現時点ではダミー) [対象のURL]

 

成功すると実行したディレクトリにcsvファイルが出力されます。

 

リンク取得ができないケース

Googleの検索結果のように、サイトアクセス後、Javascriptによってデータを読み込むタイプのページには、使用することができません。理由は、サイトアクセスしたときは解析対象のデータがサーバーから読み込まれていないためです。

 

まとめ

いかがですか?リンク一覧は、意外に使う機会が多いと思います。

Pythonには、htmlの解析ライブラリーなど役立つものが多いので、今後も、Pythonを使う機会が増えそうです。