SlideShare a Scribd company logo
1 of 14
Download to read offline
COMMON LISPによる
WEBスクレイピング技法
SATOSHI IMAI
Created: 2017-09-25 Mon 19:26
1 世はまさにビッグデータ解析時代
データをどう集めるかが問題
自前のデータを集めるのは大変
Web上に公開されているデータを半自動的に収集する
ロボットを作る
日本の著作権法ではデータ解析目的の複製はOK
サイトのルート直下にあるrobots.txtに従おう
アクセス頻度は常識的な範囲で
2 WEBスクレイピングとは
Webをクローリングし、必要な情報を切り出すことでデータ
を収集すること
APIが用意されているものは素直に使おう
Twitter、FacebookなどはOAuth認証が必要
3 WEBスクレイピングに必要なもの
HTTPクライアント
dexador、drakma
HTML/XMLパーサ
plump
CSSセレクタ
clss
OAuth認証 (TwitterなどのAPIを使う場合)
cl-oauth
4 日経新聞から現在の日経平均株価
を取得
(ql:quickload :dexador)
(ql:quickload :plump)
(ql:quickload :clss)
(ql:quickload :cl-ppcre)
(defparameter article-html (dex:get "http://www.nikkei.com/markets/kabu/"))
(defparameter parse-tree (plump:parse article-html))
(defparameter sub-tree (aref (clss:select "span.mkc-stock_prices" parse-tree) 0))
(print (plump:text (aref (plump:children sub-tree) 0)))
4.1 同じことをPYTHONでやろうとすると
import urllib.request
from bs4 import BeautifulSoup
url = "http://www.nikkei.com/markets/kabu/"
response = urllib.request.urlopen(url)
data = response.read()
soup = BeautifulSoup(data, "html.parser")
span = soup.find_all("span")
nikkei_heikin = ""
for tag in span:
try:
string_ = tag.get("class").pop(0)
if string_ in "mkc-stock_prices":
nikkei_heikin = tag.string
break
except:
pass
print(nikkei_heikin)
5 ロイターの記事から本文を取得
(defparameter article-html (dex:get "http://jp.reuters.com/article/idJPL3N0U325520141219"))
(defparameter body-class
(aref (nth-value 1 (ppcre:scan-to-strings "(ArticleBody_body_.*?)"" article-html)) 0))
(defparameter parse-tree (plump:parse article-html))
(defparameter sub-tree (aref (clss:select (format nil ".~A" body-class) parse-tree) 0))
(defun node-text (node)
(flet ((cat (strs) (reduce (lambda (s1 s2) (concatenate 'string s1 s2)) strs)))
(let ((text-list nil))
(plump:traverse node
(lambda (node) (push (plump:text node) text-list))
:test #'plump:text-node-p)
(cat (nreverse text-list)))))
(print (node-text sub-tree))
6 連番でない画像を上から順番にダ
ウンロード
連番ならこうすればいい
wget http://example.com/H1000{00..99}.JPG
連番でなく、ページの特定の場所にあるような画像ならパ
ースが必要
例: http://logofaves.com/
6.1 連番でない画像を上から順番にダウンロー
ド(2)
.boxesクラスの部分木を取ってきて、さらにIMGタグを探し、
URLでフィルタをかける
(defparameter article-html (dex:get "http://logofaves.com/"))
(defparameter parse-tree (plump:parse article-html))
(defparameter sub-trees (clss:select "img" (aref (clss:select ".boxes" parse-tree) 0)))
(defparameter urls
(remove-if-not
(lambda (url)
(cl-ppcre:scan "^http://logofaves.com/wp-content/uploads/" url))
(map 'list (lambda (node)
(gethash "src" (plump:attributes node)))
sub-trees)))
(loop for i from 0
for url in urls
do (dex:fetch url (format nil "/tmp/logo-~3,'0d.jpg" i)))
7 APIから収集
cl-oauthを使ってTwitterのAPIから取得する
8 CL-OAUTHでOAUTH1.0認証
認証の流れ
コンシューマトークンを作る
それを認証サーバに送りリクエストトークンを取得する
認証用URLにアクセス、ユーザアカウントでログイン
コールバックURLにGETパラメータ付きでリダイレクトされ
る
アクセストークンを作る
9 コールバックURLに指定するために
NINGLEでサーバを立てる
ningleは軽量ウェブアプリケーションの一つ
ページは単なるLispの関数
ここでアクセストークンを設定する
10 CL-OAUTH越しにTWITTER APIにア
クセスする
JSONデータが得られるのでcl-jsonでパース
ツイートやユーザLispの構造体に入れる
11 おわり
ありがとうございました

More Related Content

What's hot

initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
Takashi Takizawa
 

What's hot (20)

Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくったCommon Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
 
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
AWS Security JAWS 経済的にハニーポットのログ分析をするためのベストプラクティス?
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ組み込みLinuxでのGolangのススメ
組み込みLinuxでのGolangのススメ
 
Apache Hadoopに見るJavaミドルウェアのcompatibility(Open Developers Conference 2020 Onli...
Apache Hadoopに見るJavaミドルウェアのcompatibility(Open Developers Conference 2020 Onli...Apache Hadoopに見るJavaミドルウェアのcompatibility(Open Developers Conference 2020 Onli...
Apache Hadoopに見るJavaミドルウェアのcompatibility(Open Developers Conference 2020 Onli...
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414
 
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtcヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
ヤフーのAIプラットフォーム紹介 ~AIテックカンパニーを支えるデータ基盤~ #yjtc
 
Play with UEFI
Play with UEFIPlay with UEFI
Play with UEFI
 
initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
 
Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境Portacle : Common Lispのオールインワン開発環境
Portacle : Common Lispのオールインワン開発環境
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
What's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDBWhat's New in MySQL 5.7 InnoDB
What's New in MySQL 5.7 InnoDB
 
1. acqua
1. acqua 1. acqua
1. acqua
 
開発者におくる Power BI を使う時に考えるべきアーキテクチャ ~ データを溜めるのは誰だ? ~
開発者におくる Power BI を使う時に考えるべきアーキテクチャ ~ データを溜めるのは誰だ? ~開発者におくる Power BI を使う時に考えるべきアーキテクチャ ~ データを溜めるのは誰だ? ~
開発者におくる Power BI を使う時に考えるべきアーキテクチャ ~ データを溜めるのは誰だ? ~
 
MySQL 5.7の罠があなたを狙っている
MySQL 5.7の罠があなたを狙っているMySQL 5.7の罠があなたを狙っている
MySQL 5.7の罠があなたを狙っている
 
trippieceの2億円資金調達プロセス 先生:小泉 文明
trippieceの2億円資金調達プロセス 先生:小泉 文明trippieceの2億円資金調達プロセス 先生:小泉 文明
trippieceの2億円資金調達プロセス 先生:小泉 文明
 
Rakutenとsreと私 yanagimoto koichi
Rakutenとsreと私 yanagimoto koichiRakutenとsreと私 yanagimoto koichi
Rakutenとsreと私 yanagimoto koichi
 
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜
ソフトウェアでのパケット処理あれこれ〜何故我々はロードバランサを自作するに至ったのか〜
 
Javaのプログラムはどうやって動いているの? JVM編
Javaのプログラムはどうやって動いているの? JVM編Javaのプログラムはどうやって動いているの? JVM編
Javaのプログラムはどうやって動いているの? JVM編
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 

Similar to Lispmeetup #56 Common lispによるwebスクレイピング技法

Web事例からみたセマンティックウェブ/野田 健夫
Web事例からみたセマンティックウェブ/野田 健夫Web事例からみたセマンティックウェブ/野田 健夫
Web事例からみたセマンティックウェブ/野田 健夫
kurubushionline
 
はじめてのWeb of Things
はじめてのWeb of ThingsはじめてのWeb of Things
はじめてのWeb of Things
Saki Homma
 

Similar to Lispmeetup #56 Common lispによるwebスクレイピング技法 (20)

Web事例からみたセマンティックウェブ/野田 健夫
Web事例からみたセマンティックウェブ/野田 健夫Web事例からみたセマンティックウェブ/野田 健夫
Web事例からみたセマンティックウェブ/野田 健夫
 
はじめてのWeb of Things
はじめてのWeb of ThingsはじめてのWeb of Things
はじめてのWeb of Things
 
コピー自動生成プロダクトでDataflowを導入した話
コピー自動生成プロダクトでDataflowを導入した話コピー自動生成プロダクトでDataflowを導入した話
コピー自動生成プロダクトでDataflowを導入した話
 
はじめてのWeb of Things
はじめてのWeb of ThingsはじめてのWeb of Things
はじめてのWeb of Things
 
ロボット管理プラットフォーム「 RoboticBase 」の紹介
ロボット管理プラットフォーム「 RoboticBase 」の紹介ロボット管理プラットフォーム「 RoboticBase 」の紹介
ロボット管理プラットフォーム「 RoboticBase 」の紹介
 
[db tech showcase Tokyo 2018] #dbts2018 #A22 『最高のデータプラットフォームを、最短でつくる方法』
[db tech showcase Tokyo 2018] #dbts2018 #A22 『最高のデータプラットフォームを、最短でつくる方法』[db tech showcase Tokyo 2018] #dbts2018 #A22 『最高のデータプラットフォームを、最短でつくる方法』
[db tech showcase Tokyo 2018] #dbts2018 #A22 『最高のデータプラットフォームを、最短でつくる方法』
 
db techshowcase 2018 最⾼のデータプラットフォームを、 最短でつくる⽅法
db techshowcase 2018 最⾼のデータプラットフォームを、 最短でつくる⽅法db techshowcase 2018 最⾼のデータプラットフォームを、 最短でつくる⽅法
db techshowcase 2018 最⾼のデータプラットフォームを、 最短でつくる⽅法
 
ITweekキーノート CEO玉川講演 IoTビジネス最前線
ITweekキーノート CEO玉川講演 IoTビジネス最前線ITweekキーノート CEO玉川講演 IoTビジネス最前線
ITweekキーノート CEO玉川講演 IoTビジネス最前線
 
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化
SORACOM Technology Camp 2018 ベーシックトラック3 | 今日から始めるセンサーデータの可視化
 
PythonによるWebスクレイピング勉強会
PythonによるWebスクレイピング勉強会PythonによるWebスクレイピング勉強会
PythonによるWebスクレイピング勉強会
 
Embedded Webで加速するWeb of Things
Embedded Webで加速するWeb of ThingsEmbedded Webで加速するWeb of Things
Embedded Webで加速するWeb of Things
 
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.
 
Bpstudy20180725
Bpstudy20180725Bpstudy20180725
Bpstudy20180725
 
Lt20190129
Lt20190129Lt20190129
Lt20190129
 
Data API + AWS = (CMS どうでしょう 札幌編)
Data API + AWS =  (CMS どうでしょう 札幌編)Data API + AWS =  (CMS どうでしょう 札幌編)
Data API + AWS = (CMS どうでしょう 札幌編)
 
PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門PythonによるWebスクレイピング入門
PythonによるWebスクレイピング入門
 
ストリーミング視聴解析の基本とその応用 IPv4・IPv6デュアルソース
ストリーミング視聴解析の基本とその応用 IPv4・IPv6デュアルソースストリーミング視聴解析の基本とその応用 IPv4・IPv6デュアルソース
ストリーミング視聴解析の基本とその応用 IPv4・IPv6デュアルソース
 
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web serviceYAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
 
bitbankフロントエンド開発について
bitbankフロントエンド開発についてbitbankフロントエンド開発について
bitbankフロントエンド開発について
 
キャバァーン! サツバツエアアイオー弐〇壱弐
キャバァーン! サツバツエアアイオー弐〇壱弐キャバァーン! サツバツエアアイオー弐〇壱弐
キャバァーン! サツバツエアアイオー弐〇壱弐
 

More from Satoshi imai

Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類
Satoshi imai
 
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common LispによるディープラーニングLispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Satoshi imai
 

More from Satoshi imai (8)

lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装
lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装
lispmeetup #73 Common Lispで関係データ学習-スパース非負値テンソル分解の実装
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
 
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
Lispmeetup #50 cl-random-forest: Common Lispによるランダムフォレストの実装
 
Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類Lispmeetup48 cl-online-learningによる文書分類
Lispmeetup48 cl-online-learningによる文書分類
 
Lispmeetup #45 Common Lispで音声合成
Lispmeetup #45 Common Lispで音声合成Lispmeetup #45 Common Lispで音声合成
Lispmeetup #45 Common Lispで音声合成
 
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common LispによるディープラーニングLispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
 
Lisp meetup #29 cl-online-learningの紹介
Lisp meetup #29 cl-online-learningの紹介Lisp meetup #29 cl-online-learningの紹介
Lisp meetup #29 cl-online-learningの紹介
 

Lispmeetup #56 Common lispによるwebスクレイピング技法