クローリング&スクレイピング with Python(1)


クローリングとスクレイピング

○クローリングとは(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の使い方を詳述します

○「今日は何の日」を取得するWEBページ

○「今日は何の日」のURLは以下です、このページから情報を取得します。
以下のWEBページから情報を取得します:
    https://zatsuneta.com/category/anniversary09.html
「祝日の場合」HTMLコードのイメージは以下となっています:

「今日はどんな日」の場合のHTMLコードイメージは以下です:









○コードの説明
○情報の取得元: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

著者:志村佳昭(株式会社トリニタス 技術顧問)