SlideShare a Scribd company logo
1 of 19
Download to read offline
はじめてのプロ生 
噂に名高いプロ生、どんなところか、そろそろ参加してみようかな。 
先週まで登壇しまくりで、やっと解放された感。プロ生ちゃんでも眺めながら、まったりしよう…
はじめてのプロ生スタンド 
2日しかない… orz
プロ生ちゃんをひろっちゃう! 
プログラミング生放送勉強会第30回2014/11 名古屋ソフトウェアセンターKouji Matsui @kekyo2
自己紹介 
 Kouji Matsui (けきょ) 
 自転車乗りです 
 アーキとかスクラムマスターとか。MS界隈で生息してます。 
 Center CLRというコミュニティやってます。まだ立ち上げたばかりです。
せっかくなので、オリジナルネタを 
プロ生ちゃんの公式サイトから、イラストをダウンロードして表示します。 
手動じゃなくて、自動でやろう! 
ターゲットはこれ!
まずは調べてみよう 
プロ生ちゃんの壁紙は、以下のURLにありますね! http://pronama.azurewebsites.net/pronama/wallpaper/ 
このページのHTMLをダウンロードして、中身を解析 したら、自動でダウンロード出来るかも? 
壁紙はいくつか種類があるよ。ランドスケープ(横置 き)の画像だけ取りたいな。 
Internet Explorerで開いて、F12キーを押してみよ う!開発者ツールが使えるよ。
開発者ツールでHTMLを解析! 
①このボタンをクリックして… 
②画像をクリック 
画像に対応するHTMLの定義が どこにあるかすぐ分かる
HTMLの構造を再確認 
画像はここのdivタグに並んでる 
id属性があるね 
html→body→div(container)→ 
div(row)→div(hl_links)→div→ 
a(liimagelink)→img
目的のタグまでの階層構造 
id属性があると、見分けが付きやすい(100%信用は出来ないので注意)。 プロ生ちゃんサイトは「hl_links」というidで、ランドスケープの画像をまとめているみたい。 
あとは、class属性とタグで区別していくとベター。 
imgタグはサムネイルなので、欲しいのはその直前のaタグのhrefが示すURL。 
html→body→div(container)→div(row)→div(hl_links)→div→a(liimagelink)→img 
準備できたよっ!
HttpClientクラスでHTMLを取得! 
HttpClientクラスを使おう!「NuGet」で簡単インストール! 
HTMLは非同期でダウンロード。大丈夫、スレッドとか操作しないよ。async/awaitでサクッと実現!
SgmlReaderを使ってHTMLをXMLに変換! 
SgmlReaderを使うと、HTMLを解析してXMLリーダーのようにふるまわせることが出来るよ! 
するとすると、XDocumentに変換出来ちゃう。 
XMLになってしまえば、中身を調べる方法は沢山ある!
LINQでaタグを抽出するよ! 
XMLのネストしたタグ構造も、簡単に辿れるよ!
aタグのURLから画像をダウンロードするよ! 
画像のダウンロードもHttpClientで! 
インメモリで画像をデコードして、ImageSourceに変換するよ! 
ワーカースレッドで動かしているから、 非同期メソッドを同期的に待機してるよ
画面に表示! 
XAMLの強力な機能「データバインディング」を使えば、コレクションにAddするだけ!
デモ
高速化! 
非同期なんだから、並列でダウンロードさせたいよね! 
Task.WhenAllを使って、全ての Taskを同時に待つよ 
(地味にLINQ使ってるよ) 
処理全体を非同期で! 
URL 
URL 
URL 
URL 
非同期Task 
非同期Task 
非同期Task 
非同期Task Task.WhenAll
デモ
まとめ 
ウェブサイトからHTMLをダウンロードしてきて、中身を解析する事を「スク レイピング」といいます。 
.NETの世界では、「SgmlReader」クラスを使ってXDocumentに変換すると、 簡単にHTMLを解析できちゃうよ。 
XDocumentの解析は、LINQでサクサクと! 
HTMLや画像のダウンロードは、「HttpClient」クラスを使うよ。 
便利なライブラリは、「NuGet」で簡単インストール! 
ワーカースレッドなし!非同期でダウンロードサクサク!!
プロ生ちゃんマジ天使!! 
ご清聴ありがとうございました! 
サンプルコードはGitHubに上げてあります。 https://github.com/kekyo/Pronama.ScrapingViewer.git 
スライドはブログに掲載します。 http://www.kekyo.net/

More Related Content

What's hot

秘伝:クラウドに開発環境をえいっ!と構築する方法
秘伝:クラウドに開発環境をえいっ!と構築する方法秘伝:クラウドに開発環境をえいっ!と構築する方法
秘伝:クラウドに開発環境をえいっ!と構築する方法Masahiko Hashimoto
 
モンスターストライクにおける監視システムのあれこれ
モンスターストライクにおける監視システムのあれこれモンスターストライクにおける監視システムのあれこれ
モンスターストライクにおける監視システムのあれこれYusuke Shirakawa
 
『JUnit実践入門』写経・実践会 in 横浜 #2
『JUnit実践入門』写経・実践会 in 横浜 #2『JUnit実践入門』写経・実践会 in 横浜 #2
『JUnit実践入門』写経・実践会 in 横浜 #2shinyaa31
 
来週11/27(日) OSC広島のご紹介
来週11/27(日) OSC広島のご紹介来週11/27(日) OSC広島のご紹介
来週11/27(日) OSC広島のご紹介Yoshitake Takata
 
Linuxデスクトップのお手軽セミナー 〜クラウドとかも使いこなしちゃえ〜
Linuxデスクトップのお手軽セミナー 〜クラウドとかも使いこなしちゃえ〜Linuxデスクトップのお手軽セミナー 〜クラウドとかも使いこなしちゃえ〜
Linuxデスクトップのお手軽セミナー 〜クラウドとかも使いこなしちゃえ〜Masahiko Hashimoto
 
Mtddc Tokyo Lt2010 oscar
Mtddc Tokyo Lt2010 oscarMtddc Tokyo Lt2010 oscar
Mtddc Tokyo Lt2010 oscarNaoaki Onozaki
 
スパース性に基づく機械学習 2章 データからの学習
スパース性に基づく機械学習 2章 データからの学習スパース性に基づく機械学習 2章 データからの学習
スパース性に基づく機械学習 2章 データからの学習hagino 3000
 
『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3shinyaa31
 
通信対戦ゲームを作った話
通信対戦ゲームを作った話通信対戦ゲームを作った話
通信対戦ゲームを作った話mipsparc
 
すごいぞVuetify!! 〜ポートフォリオを作ってみた〜
すごいぞVuetify!! 〜ポートフォリオを作ってみた〜すごいぞVuetify!! 〜ポートフォリオを作ってみた〜
すごいぞVuetify!! 〜ポートフォリオを作ってみた〜SHOYAYAMAMOTO
 
RubyGemsで公開されているライブラリをモンキーパッチした話
RubyGemsで公開されているライブラリをモンキーパッチした話RubyGemsで公開されているライブラリをモンキーパッチした話
RubyGemsで公開されているライブラリをモンキーパッチした話SHOYAYAMAMOTO
 
WebMatrix3でwebプログラミング入門 (2013/08/03)
WebMatrix3でwebプログラミング入門 (2013/08/03)WebMatrix3でwebプログラミング入門 (2013/08/03)
WebMatrix3でwebプログラミング入門 (2013/08/03)T. Kodaka
 
cocos2d-xを勉強し始めるまで
cocos2d-xを勉強し始めるまでcocos2d-xを勉強し始めるまで
cocos2d-xを勉強し始めるまでYosuke Fujii
 
文系学生対象!! エンジニアと働きたい「非エンジニア」勉強会
文系学生対象!! エンジニアと働きたい「非エンジニア」勉強会文系学生対象!! エンジニアと働きたい「非エンジニア」勉強会
文系学生対象!! エンジニアと働きたい「非エンジニア」勉強会Kazuki Higashiguchi
 
ゼロからのエンジニアが開発マネージャーになるまで
ゼロからのエンジニアが開発マネージャーになるまでゼロからのエンジニアが開発マネージャーになるまで
ゼロからのエンジニアが開発マネージャーになるまでYusuke Shirakawa
 
おもわずハマるゲームのUI&UX
おもわずハマるゲームのUI&UXおもわずハマるゲームのUI&UX
おもわずハマるゲームのUI&UXUX MILK
 
マスコットアプリ後夜祭&常駐アプリを作ろう
マスコットアプリ後夜祭&常駐アプリを作ろうマスコットアプリ後夜祭&常駐アプリを作ろう
マスコットアプリ後夜祭&常駐アプリを作ろうpmw1415
 

What's hot (18)

秘伝:クラウドに開発環境をえいっ!と構築する方法
秘伝:クラウドに開発環境をえいっ!と構築する方法秘伝:クラウドに開発環境をえいっ!と構築する方法
秘伝:クラウドに開発環境をえいっ!と構築する方法
 
モンスターストライクにおける監視システムのあれこれ
モンスターストライクにおける監視システムのあれこれモンスターストライクにおける監視システムのあれこれ
モンスターストライクにおける監視システムのあれこれ
 
『JUnit実践入門』写経・実践会 in 横浜 #2
『JUnit実践入門』写経・実践会 in 横浜 #2『JUnit実践入門』写経・実践会 in 横浜 #2
『JUnit実践入門』写経・実践会 in 横浜 #2
 
来週11/27(日) OSC広島のご紹介
来週11/27(日) OSC広島のご紹介来週11/27(日) OSC広島のご紹介
来週11/27(日) OSC広島のご紹介
 
Linuxデスクトップのお手軽セミナー 〜クラウドとかも使いこなしちゃえ〜
Linuxデスクトップのお手軽セミナー 〜クラウドとかも使いこなしちゃえ〜Linuxデスクトップのお手軽セミナー 〜クラウドとかも使いこなしちゃえ〜
Linuxデスクトップのお手軽セミナー 〜クラウドとかも使いこなしちゃえ〜
 
Mtddc Tokyo Lt2010 oscar
Mtddc Tokyo Lt2010 oscarMtddc Tokyo Lt2010 oscar
Mtddc Tokyo Lt2010 oscar
 
スパース性に基づく機械学習 2章 データからの学習
スパース性に基づく機械学習 2章 データからの学習スパース性に基づく機械学習 2章 データからの学習
スパース性に基づく機械学習 2章 データからの学習
 
『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3
 
通信対戦ゲームを作った話
通信対戦ゲームを作った話通信対戦ゲームを作った話
通信対戦ゲームを作った話
 
すごいぞVuetify!! 〜ポートフォリオを作ってみた〜
すごいぞVuetify!! 〜ポートフォリオを作ってみた〜すごいぞVuetify!! 〜ポートフォリオを作ってみた〜
すごいぞVuetify!! 〜ポートフォリオを作ってみた〜
 
RubyGemsで公開されているライブラリをモンキーパッチした話
RubyGemsで公開されているライブラリをモンキーパッチした話RubyGemsで公開されているライブラリをモンキーパッチした話
RubyGemsで公開されているライブラリをモンキーパッチした話
 
WebMatrix3でwebプログラミング入門 (2013/08/03)
WebMatrix3でwebプログラミング入門 (2013/08/03)WebMatrix3でwebプログラミング入門 (2013/08/03)
WebMatrix3でwebプログラミング入門 (2013/08/03)
 
cocos2d-xを勉強し始めるまで
cocos2d-xを勉強し始めるまでcocos2d-xを勉強し始めるまで
cocos2d-xを勉強し始めるまで
 
文系学生対象!! エンジニアと働きたい「非エンジニア」勉強会
文系学生対象!! エンジニアと働きたい「非エンジニア」勉強会文系学生対象!! エンジニアと働きたい「非エンジニア」勉強会
文系学生対象!! エンジニアと働きたい「非エンジニア」勉強会
 
ゼロからのエンジニアが開発マネージャーになるまで
ゼロからのエンジニアが開発マネージャーになるまでゼロからのエンジニアが開発マネージャーになるまで
ゼロからのエンジニアが開発マネージャーになるまで
 
Narrative
NarrativeNarrative
Narrative
 
おもわずハマるゲームのUI&UX
おもわずハマるゲームのUI&UXおもわずハマるゲームのUI&UX
おもわずハマるゲームのUI&UX
 
マスコットアプリ後夜祭&常駐アプリを作ろう
マスコットアプリ後夜祭&常駐アプリを作ろうマスコットアプリ後夜祭&常駐アプリを作ろう
マスコットアプリ後夜祭&常駐アプリを作ろう
 

More from Kouji Matsui

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理Kouji Matsui
 
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Kouji Matsui
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewKouji Matsui
 
What's Functional?
What's Functional?What's Functional?
What's Functional?Kouji Matsui
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTEKouji Matsui
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculatorKouji Matsui
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhereKouji Matsui
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of ReferenceKouji Matsui
 
Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成Kouji Matsui
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonadKouji Matsui
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.Kouji Matsui
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and TaskKouji Matsui
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITKouji Matsui
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:codeKouji Matsui
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPSKouji Matsui
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basicsKouji Matsui
 
continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN LinkingKouji Matsui
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホンKouji Matsui
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組みKouji Matsui
 

More from Kouji Matsui (20)

パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理パターンでわかる! .NET Coreの非同期処理
パターンでわかる! .NET Coreの非同期処理
 
Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018Making archive IL2C #6-55 dotnet600 2018
Making archive IL2C #6-55 dotnet600 2018
 
Matrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overviewMatrix signal controller and BrainPad overview
Matrix signal controller and BrainPad overview
 
Fun with BrainPad
Fun with BrainPadFun with BrainPad
Fun with BrainPad
 
What's Functional?
What's Functional?What's Functional?
What's Functional?
 
Pitfall for WioLTE
Pitfall for WioLTEPitfall for WioLTE
Pitfall for WioLTE
 
How to make the calculator
How to make the calculatorHow to make the calculator
How to make the calculator
 
Write common, run anywhere
Write common, run anywhereWrite common, run anywhere
Write common, run anywhere
 
Locality of Reference
Locality of ReferenceLocality of Reference
Locality of Reference
 
Nespのコード生成
Nespのコード生成Nespのコード生成
Nespのコード生成
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.You will be assimilated. Resistance is futile.
You will be assimilated. Resistance is futile.
 
How to meets Async and Task
How to meets Async and TaskHow to meets Async and Task
How to meets Async and Task
 
Beachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JITBeachhead implements new opcode on CLR JIT
Beachhead implements new opcode on CLR JIT
 
Async deepdive before de:code
Async deepdive before de:codeAsync deepdive before de:code
Async deepdive before de:code
 
Thread affinity and CPS
Thread affinity and CPSThread affinity and CPS
Thread affinity and CPS
 
Async DeepDive basics
Async DeepDive basicsAsync DeepDive basics
Async DeepDive basics
 
continuatioN Linking
continuatioN LinkingcontinuatioN Linking
continuatioN Linking
 
真Intermediate languageのキホン
真Intermediate languageのキホン真Intermediate languageのキホン
真Intermediate languageのキホン
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
 

プロ生ちゃんをひろっちゃう!