クローリングとスクレイピング
○クローリングとは(crawlering)
※誤解を恐れずに単純に言うと・・・。
クローリングはWebサイトを巡回することです
具体的には、Webサイトの巡回とhtml情報の取得を行います
○スクレイピングとは(scraping)
スクレイピングは不要な情報を除外して、興味ある情報を取得することです
具体的には、html情報を解析して、興味ある情報の抽出を行うことです
○注意点
収集・抽出したサイトの情報が著作権に違反しない事を確認します
サーバーに負荷を掛けすぎない事を確認します
サイトのルールに従う事(robots.txt)を確認します
Python言語
○Python言語
人気度はGitHUBでは第2位、TOIBE(マイナビ)でも第3位です。
https://ledge.ai/github-python/
https://news.mynavi.jp/article/20210707-1916630/
ライブラリが充実しています、例えば、数学関連、AI関連、クローリング関連等。
順位 | GitHUB評価 | TOIBE(マイナビ)評価 |
---|---|---|
1位 | JavaScript | C言語 |
2位 | Python | Java |
3位 | Java | Python |
4位 | TypeScript | C++ |
5位 | C# | C# |
6位 | PHP | Visual Basic |
7位 | C++ | JavaScript |
8位 | C言語 | PHP |
9位 | Shell | Assembly Language |
10位 | Ruby | SQL |
Python環境をインストールする
○「anaconda」とは
※参考URL:https://creive.me/archives/18354/
「anaconda」は以下の機能をまとめてインストールしてくれます:
○python本体
○パッケージ管理ツール
○開発環境ツール
○「anaconda」をダウンロードします
URLは、https://www.anaconda.com/products/individual
○「anaconda」をインストールします
インストール時に、「python」に環境変数PATHを通す事が重要です。
○「anaconda」インストール後
「スタートメニュー」「ライブラリインストール(pipコマンド)」「インストール済みライブラリ(condaコマンド)」「パッケージインストール状況」
anacondaが便利です
ライブラリインストール
※PATHを通すことです
※Activatiosが必要:https://conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#activating-an-environment
定番の「Hello, World 」 with Python
○定番の「Hello, World 」 with Python
Pythonインタプリタで実行した場合です。
おや簡単ですね、4行目(強調)を入力するだけです。
C:\Users\Public\acer\E 佳昭配下BACKUP\02.python>python Python 3.8.8 (default, Apr 13 2021, 15:08:03) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print("Hello, World with python") Hello, World with python >>>
Pythonの基本
○Pythonの基本
pythonプログラム:wget.pyの実行方法です。
python wget.py
ライブラリのインストール方法、例えばスクレイピング用のライブラリを入手する場合です。
pip install BeautifulSoup
ソースのコードについては、「UTF-8」がお薦めです。1行目に記述します。
「#」が付いていますが、これはコメントではありません。
# coding: utf-8
エディタでUTF-8でソースを保存するには・・・「秀丸エディタ」の場合です:
「ファイル」「名前を付けて保存」・・・
アクセスしたWEBページのHTMLコードを取得するには・・・GoogleChromeブラウザの場合:
表示されたWEBページで「右クリック」「ページのソースを表示」・・・
ダウンロージのURLを知るには・・・GoogleChromeブラウザの場合:
表示されたWEBページで「ダウンロード」(赤丸)にマウスカーソルを合わせると、
下のステータスバーにURL(青丸)が表示されます。
Pythonでクローリング基礎
○wgetコマンドをpythonで実装してみます
Linuxで便利なコマンド「wget」(ブラウザのCUI版)をpythonで実装してみます。
何と4行で処理が記述できてしまいます、もちろんエラー処理組込んでいませんが・・・(~_~*)。
「yahoo.co.jp」にアクセスして、htmlコードをindex.htmlとして保存します。
※ファイルはバイナリモードでそのまま保存しています。
※この「with」を使用すると、ファイルのクローズは自動で行われます。
import urllib.request url = 'http://yahoo.co.jp' with urllib.request.urlopen(url) as u: with open('index.html', 'bw') as o: o.write(u.read())
○nkf等の文字コード判定をpythonで実装してみます
「python detect.py」で実行した画面
完全ではありませんが、どうしても文字コードが特定できない場合に便利です
多分、webページのクローリング等で必要になると思います
結果は辞書型で返されます
※「chardetect」ライブラリを使用していますが、実にシンプルです
# -*- coding: utf-8 -*- import chardet with open("utf8.txt", "rb") as f: print(chardet.detect(f.read())) with open("sjis.txt", "rb") as f: print(chardet.detect(f.read())) with open("euc.txt", "rb") as f: print(chardet.detect(f.read())) with open("jis.txt", "rb") as f: print(chardet.detect(f.read())) '''python detect.py:実行結果 {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''} {'encoding': 'SHIFT_JIS', 'confidence': 0.26666666666666666, 'language': 'Japanese'} {'encoding': 'EUC-JP', 'confidence': 0.2857142857142857, 'language': 'Japanese'} {'encoding': 'ISO-2022-JP', 'confidence': 0.99, 'language': 'Japanese'} '''
Pythonでスクレイピング基礎
○Pythonでスクレイピング基礎
Beatifulsoupライブラリ他
「今日は何の日」を例にBeatifulsoupの使い方を詳述します
○「今日は何の日」のURLは以下です、このページから情報を取得します。
以下のWEBページから情報を取得します:
https://zatsuneta.com/category/anniversary09.html
「祝日の場合」HTMLコードのイメージは以下となっています:
「今日はどんな日」の場合のHTMLコードイメージは以下です:
- 12日: 国際南南協力デー、宇宙の日、 水路記念日、マラソンの日、 鳥取県民の日、秋のメープルもみじの日、豆腐の日、 ...............................................................................
- 13日: 世界法の日、乃木大将の日、 (旧)司法保護記念日、クリスタルジェミーの日、 ...............................................................................
- 14日:メンズバレンタインデー、 ...............................................................................
○コードの説明
○情報の取得元:https://zatsuneta.com/category/anniversary%s.html
このサイトでは、月毎にURLが変わります。
例えば9月の場合は、「anniversary09.html」となります。
○まず定番のクローリング&スクレイピング処理です。
クローリング処理:r = requests.get(url)
スクレイピング処理:soup = BeautifulSoup(r.content, ‘html.parser’)
○「祭日」の情報は<div class=’article’>に存在します:div = soup.find_all(‘div’, class_=’article’)。
さらに局所化すると<ul>内の<li>タグで記載されています:ul = div[0].find_all(‘ul’)
さらに局所化すると、ul[0]番目:for item in ul[0].find_all(‘a’):
同様に、二十四節気については2番目の<ul>に記載されています:ul[1]番目です
○「どんな日」情報は、以下です。
<div class=’article’>内の<ul>タグ内のclass=’anni_list’で記述されています。
○整形について
「day2 = str(day).replace(‘\n’, ”)」にてジャマな改行(‘\n’)を削除する
○使用するライブラリ 以下のコードを先頭に記載します。
1行目は、UTF-8コード宣言です。
2行目は、クローリング用のライブラリです。
3行目は、スクレイピング用のライブラリです。
6行目(強調)は、正規表現用のライブラリです。
# coding: utf-8 import requests import urllib.request from bs4 import BeautifulSoup import re
○「今日は何の日」機能のソースコード
######################################################################## ###今日はどんな日かを取得する ######################################################################## def whatDay(): url="https://zatsuneta.com/category/anniversary%s.html" mailx ="" ##本日の日付をurlに設定します now=str(datetime.datetime.now())[0:10] day = now[5:7] #月を取り出します url = re.sub(r'%s', day, url) ##日付を取り出す dayx = now[8:] if len(dayx) != 2: dayx = "0" + dayx r = requests.get(url) soup = BeautifulSoup(r.content, 'html.parser') ##祝日・休日 div = soup.find_all('div', class_='article') ul = div[0].find_all('ul') mailx += "【今月の祝日】\n" for item in ul[0].find_all('a'): mailx += " " + item.attrs['title'] + ": " + item.attrs['href'] + "\n" mailx += "【今月の二十四節気】\n" for item in ul[1].find_all('a'): mailx += " " + item.attrs['title'] + ": " + item.attrs['href'] + "\n" day_format = " dayx = day_format.format(dayx) dayx = '^' + dayx mailx += "【今日はどんな日】\n" ul1 = div[2].find('ul', class_='anni_list') for day in ul1: day2 = str(day).replace('\n', '') #まず改行(\n)を削除する if re.search(dayx, str(day2)): #先頭 # if re.match(r' for item in day.findAll('a'): #string.findAll()正規表現!⇒OK for item in day.find_all('a'): #.soup表現!⇒OK mailx += " " + item.text + ": " +item.attrs['href'] + "\n" return mailx
著者:志村佳昭(株式会社トリニタス 技術顧問)