スクレイピング vs API
可能ならAPIを利用しよう
APIを提供しているようなサービスはだいたいスクレイピングを禁止している
/robots.txtを見ればプログラムによるアクセスを許可しているかがわかる
スクレイピングによるアクセスが頻繁すぎてアクセス先に負荷をかけると
BAN・訴訟・逮捕もありえるので注意
Slide 6
Slide 6 text
前期教養のお知らせ
http://www.c.u-tokyo.ac.jp/zenki/news/index.html
の構造を調べてみよう
Windowsの人
F12キー か Ctrl + Shift + I
Macの人
⌘ + option + I
if文
>>> if 1 > 2:
... print(‘1 is greater than 2.’)
... else:
... print(‘1 is not greater than 2.’)
...
1 is not greater than 2.
Slide 18
Slide 18 text
in演算子 bool演算子
>>> if 2 in [1, 2, 3]:
... print(‘2 in [1, 2, 3] == True’)
2 in [1, 2, 3] == True
>>> ‘工業’ in ‘東京工業大学’ and ’工業’ not in ‘東京大学’
True
Slide 19
Slide 19 text
for文
>>> members = [‘scott’, ‘Virgil’, ‘Alan’, ‘Gordon’, ‘John’]
>>> for member in members:
... print(member)
...
Scott
Virgil
Alan
Gordon
John
Slide 20
Slide 20 text
こんなforはやめよう
>>> for i in range(len(members)):
>>> print(members[i])
for文の中でインデックスを使いたいときは?
>>> for i, member in enumerate(members):
... print(str(i+1) + ‘: ‘ + member)
...
1: Scott
2: Virgil
3: Alan
4: Gordon
5: John
ライブラリのインポート
import tkinter
import tkinter as tk
import tkinter.filedialog
from tkinter import ttk, filedialog
from tkinter.filedialog import (FileDialog as FD,
askdirectory as ad,
N, NS, NSEW)
プログラムのソースコード
from urllib.request import urlopen
from bs4 import BeautifulSoup
url = 'http://www.c.u-tokyo.ac.jp/zenki/news/index.html'
html = urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
div = soup.find('div', id='newslist2')
dds = div.find_all('dd')
for dd in dds:
print(dd.a.text)
Slide 29
Slide 29 text
その気になればimport以外は1行で書ける
from urllib.request import urlopen
from bs4 import BeautifulSoup
print(‘\n’.join(dd.a.text for dd in BeautifulSoup(urlopen('http://www.c.u-tokyo.ac.jp/zenki/news/index.html'), 'html.parser').find('div', id='newslist2').find_all('dd')))
Slide 30
Slide 30 text
プログラムを1文ずつ解説します
Slide 31
Slide 31 text
from urllib.request import urlopen
urllibパッケージのrequestモジュールからurlopen関数をインポートする
urllibパッケージは標準ライブラリなので最初から入っている
Slide 32
Slide 32 text
from bs4 import BeautifulSoup
bs4モジュールからBeautifulSoupクラスをインポートする
日付とお知らせをセットで出力
for dt, dd in zip(div(‘dt’), div(‘dd’)):
print(dt.text + ‘, ‘ + dd.a.text)
zip
複数のリストをまとめてforで参照できる関数
Slide 48
Slide 48 text
1年生向けのお知らせだけ出力
for dt, dd in zip(div(‘dt’), div(‘dd’)):
if ‘firstyear’ in dt(‘img’)[1][‘src’]:
print(dd.a.text)
Slide 49
Slide 49 text
結果をファイルに保存
from pathlib import Path
︙
︙
dds = div.find_all(‘dd’)
with Path(‘result.txt’).open(‘w’) as f:
for dd in dds:
f.write(dd.a.text + ‘\n’)
pathlib
ファイルパスをスマートに扱える標準モジュール