塩見周子の徒然日記

自分のことを塩見周子と思い込んでいるオタクです

Pythonでスクレイピング 0-1,1-1/urllib

https://www.amazon.co.jp/Pythonによるスクレイピング-開発テクニック-BeautifulSoup-scikit-learn-TensorFlowを使ってみよう/dp/4802610793

コマンドラインから実行してるけど普通にjupyter notebook入れた方が早いと思いました。まる。


0-1

スクレイピング:Webサイトの情報を抽出すること。HTML形式で作られているWebの情報を抽出するための工夫や、広告などの不要な情報を除くためのサイトの構造解析、それに、ログイン必要なサイトの情報を抽出するための工夫などが必要。
・クローリング:プログラムがWebサイトを巡回して、情報をダウンロードすること。

機械学習ではデータを収集、抽出することが大事。その上で、これらの技術が必要。


1-1

PythonでWebサイトのデータを取得するために「urllib」を使う(urllibライブラリと書いてあったけどlibがライブラリじゃね?)

・ウェブサイトからファイルをダウンロードする方法×2

[手法1] urllib.requestモジュールの中のurlretrieve()を使う。urlretrieve(第一引数, 第二引数)の第一引数は取得したいファイルのurlを、第二引数はセーブ先ファイルの名前をつけてあげる。

import urllib.request as req #いちいちurllib.requestとか書いてるのは面倒なのでreqにする

url = '(ここにファイルのurlが入る)'
savename = '(適当な名前をつけて保存)'

req.urlretrieve(url, savename)

[手法2] urllib.requestモジュールの中のurlopen()を使う。直接ファイルに保存するのではなく、データがPythonのメモリ上に保存される。メモリ上に保存→明示的にファイルに保存、という2ステップを踏まないとファイルに保存できない。
⭐︎with構文:開始と終了時にしなければならない作業を実行する(e.g.ファイルのオープン、クローズ/通信開始、終了)。例えば、with open〜と書けば、close()と明示的に書かなくてもclose()の処理も行ってくれる。

import urllib.request as req

url = '(ここにファイルのurlが入る)'
savename = '(適当な名前)'

#ダウンロード、urlopen()でURLリソースを開き、read()で読み取る
mem = req.urlopen(url).read()

#fはセーブしたファイルを「w:書き込み」「b:バイナリ」で開いたもの。fにmem(メモリー上に保存されたファイル)を書き込む
with open(savename, mode='wb') as f:
  f.write(mem)


・ウェブサイトからデータを取得(XML、HTML)

・IP確認APIにアクセスして情報を取得

import urllib.request as req

#データ取得
url = "http://api.aoikujira.com/ip/ini"
data = req.urlopen(url).read()

#取得データをUTF-8(ぱっと見読める形)に変換
text = data.decode('utf-8')
print(text) #表示

・任意のパラメータをつけてリクエストを送信、それに対する情報を受け取る

ア:郵便番号をパラメータとして送り、それに対応する住所を得る

import urllib.request as req
import urllib.parse as parse #parseは「解析」の意、これからparserなどが出てくる

API = 'http://api.aoikujira.com/zip/xml/get.php' #このAPIにアクセス予定

#変数設定
values = {
    'fmt': 'xml', #ここではxmlに指定、他にもhtmlとかいろいろできる
    'zn':  '1100001' #検索したい郵便番号を入れる
}
params = parse.urlencode(values) #変数をURLに登場する形に成形(e.g.「fmt=xml」)

url = API + '?' + params #URLの形はAPIで指定したアドレス+はてな+変数
print('url=', url)

#データダウンロード
data = req.urlopen(url).read()
text = data.decode('utf-8')
print(text) #表示

イ:文字を入力して、それが入ってる百人一首の句を探す

import sys
import urllib.request as req
import urllib.parse as parse

#sys.argv変数でコマンドラインから単語を読む。sys.argv[0]はスクリプト名、sys.argv[1]にコマンドライン引数が入る。入力として何もなければ(len(sys.argv)<1)USAGE(使い方)を表示
keyword = sys.argv[1]
if len(sys.argv) <= 1:
    print('USAGE: hyakunin.py (keyword)')
    sys.exit()

#パラメータをURLエンコード。コマンドラインじゃなくてもここのkeyword弄れば適当に検索はできる
API = 'http://api.aoikujira.com/hyakunin/get.php'
query = {
    'fmt': 'ini',
    'key': 'keyword'
}
params = parse.urlencode(query)
url = API + '?' + params
print('url=', url)

#データをダウンロードして表示
with req.urlopen(url) as r:
    b = r.read()
    data = b.decode('utf-8')
    print(data)