クローリングとスクレイピング
○クローリングとは(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
著者:志村佳昭(株式会社トリニタス 技術顧問)







