Webページからhtmlソースを取得する方法

3,329 views
Skip to first unread message

あいこ

unread,
May 25, 2014, 8:46:20 PM5/25/14
to android-g...@googlegroups.com
みなさま初めまして、あいこと申します。

件名の通り、Webページからhtmlソースを取得する方法についてお伺い致します。
取得したhtmlソースから目的の数値を抽出、それらを入力として数学的処理を加え、ユーザに提案を行えるようなアプリケーションを想定しています。

私が試した方法は次の3つです。
まず、http://www.hos.co.jp/blog/20110620/ を参考に、iframeを使った方法とWebViewClientを使った方法を試しました。
さらに、java.net.URLConnectionクラスのgetContentメソッドを試しました。
いずれの方法もAPI Level 19で期待通りの動作を確認することはできませんでした。
セキュリティー等の観点から塞がれているものもあるようです。

どなたかこれらの方法、或いは違う方法でWebページのhtmlソースを最新の環境にて取得できていらっしゃる方はおられないでしょうか。
もしいらっしゃいましたらその方法をご共有いただけますと幸いです。

経験も浅いので質問する側として情報が不足している部分があるかもしれませんが、その際はその旨コメントいただけるとありがたく存じます。
どうぞ宜しくお願い致します。

Kazuyuki Eguchi

unread,
May 25, 2014, 9:26:41 PM5/25/14
to android-g...@googlegroups.com
あいこさん

こんにちは
江口です。

いくつか突っ込みどころはあるのですが!
とりあえず、一つ一つ片付けましょう!

WebサーバからHTMLのソースを取ってきたいということですよね?

いくつかのパターンを試してみて、期待するものが取れなかったというのはどういう形のが取れることを期待していますか?

文字列の形 <html>~</html>みたいな
ファイルの形

とかあるとは思いますが!

具体的なサイトがあるなら、明確にした方がいい回答が得られると思いますが!

以上、ご参考までに
--
Kazuyuki Eguchi


2014年5月26日 9:46 あいこ <aiko.d...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-group-j...@googlegroups.com にメールを送信してください。
> このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

あいこ

unread,
May 25, 2014, 9:43:27 PM5/25/14
to android-g...@googlegroups.com
江口さま、

早速のコメントありがとうございます。
>WebサーバからHTMLのソースを取ってきたいということですよね? 
はい、その通りです。

>いくつかのパターンを試してみて、期待するものが取れなかったというのはどういう形のが取れることを期待していますか? 

>>文字列の形 <html>〜</html>みたいな 
>>ファイルの形 
どんな形式でも構いません。目的はWebページから数値を抽出して数学的操作を加えることです。
その際、htmlソースから正規表現を用いて数値部分を抽出し、変数に格納することを考えております。

>具体的なサイトがあるなら、明確にした方がいい回答が得られると思いますが!
特にございません。例えばPCのウェブブラウザからソースを表示できるような一般的なWebサイトを想定しております。

引き続きご回答お待ちしております。宜しくお願い致します。


2014年5月26日月曜日 10時26分41秒 UTC+9 Kazuyuki Eguchi:
> android-group-japan+unsub...@googlegroups.com にメールを送信してください。

Kazuyuki Eguchi

unread,
May 25, 2014, 9:50:43 PM5/25/14
to android-g...@googlegroups.com
あいこさん

えぐちです。

う~ん、問題は自分で解決しないといけませんね。

どんな形式でもいいなんていうことはないと思いますよ。

ページを持ってくることと!その後に加工するプロセスは別です。

まずは、ページの取得はできたのでしょうか?

プログラムは、入力と出力があるので、出力の形が決まっていないのに
加工なんてできないと思いますよ。

以上、ご参考までに
--
Kazuyuki Eguchi


2014年5月26日 10:43 あいこ <aiko.d...@gmail.com>:
>> > android-group-j...@googlegroups.com にメールを送信してください。
>> > このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
>> > http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
>> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>
> --
> このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> android-group-j...@googlegroups.com にメールを送信してください。

kaznog

unread,
May 25, 2014, 9:56:42 PM5/25/14
to android-g...@googlegroups.com
野口一也と申します
最近は全く更新してないので
問題もあるとは思いますが、
以前DreamNoteと言うアプリで似た様なことをしました。

2.xでは標準ブラウザのキャッシュからHTMLなどのリソースを吸い出し、
ICS以降ではWebArchiveが取得出来たので
WebArchiveを加工してHTMLを保存して、
いわゆる「あとで見る」的な機能を持たせていました。

ICS以降の端末での確認や対応をしていないので、最近の端末では不具合がありそうだったり、EverNoteWebClip対応も最新のEverNoteSdk対応もしていないので全くのゴミアプリになってしまっていると思います。

WebViewへJavaScript仕込んでHTMLの整合性確認などもしていましたが、
WebViewのJavaScriptからの脆弱性もあるので、固定バインド名は使わず、処理中にもバインド名を更新しつつ処理していました。
最近の端末をターゲットにするならWebArchive取得くらいがセキュリティ上良いと思います。
長文失礼しました。


2014年5月26日月曜日、あいこ<aiko.d...@gmail.com>さんは書きました:

suppi__

unread,
May 25, 2014, 10:06:39 PM5/25/14
to android-g...@googlegroups.com

webviewで画面を表示した状態を想定しているのでしょうか?
単純にソースのみ取りたいならhttpclientを使用すればいいと思います。
あと、外部にネットワーク接続するためには、パーミッションの追加がが必要ですね。

2014/05/26 10:56 "kaznog" <kaz...@gmail.com>:

Jun Shiozawa

unread,
May 25, 2014, 11:32:40 PM5/25/14
to android-g...@googlegroups.com
目的から見てWebViewというよりはSocketじゃない?

何のビッグデータを収集したいのかは知らんけど
ミログの二の舞にならんようにせいぜい気をつけることだよ。

2014年5月26日月曜日 9時46分20秒 UTC+9 あいこ:

Jun Shiozawa

unread,
May 26, 2014, 12:24:19 AM5/26/14
to android-g...@googlegroups.com
あと、GooglePlayの規約とコンテンツガイドラインには目を通しておくことをお勧めします。
最近また変更がありました。
最近の変更ではGooglePlayはこのテのアプリにどんどん厳しくなっています。

2014年5月26日月曜日 9時46分20秒 UTC+9 あいこ:

天然パーマ

unread,
May 26, 2014, 2:02:21 AM5/26/14
to android-g...@googlegroups.com
天然パーマと申します。

HTMLソースは取れました。
UIスレッドは気にしないでください。(面倒だったので)
文字コード等の問題もありますが、おそらくHeaderに情報があると思います。

サーバ側が意図しないアクセスは不正アクセス・攻撃とみなす場合がありますので注意が必要ですよ。
自分のサーバもしくは許可されたサーバなら問題ありませんが


public void onClickButton(View v) {
(new Thread(new Runnable() {
@Override
public void run() {

DefaultHttpClient client = new DefaultHttpClient();

HttpGet request = new HttpGet("http://○○○○.com/");

try {
HttpResponse response = client.execute(request);
try {

InputStream is = response.getEntity().getContent();
String UTF8 = "utf8";
int BUFFER_SIZE = 8192;

BufferedReader br = new BufferedReader(
new InputStreamReader(is, UTF8), BUFFER_SIZE);
String str;
while ((str = br.readLine()) != null) {
Log.d("HTML", str);
}
} catch (Exception e) {
Log.e("ERR", "ER", e);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
})).start();

}

2014年5月26日月曜日 13時24分19秒 UTC+9 Jun Shiozawa:

あいこ

unread,
May 26, 2014, 2:13:07 AM5/26/14
to android-g...@googlegroups.com
野口さま、suppi__さま、Shiozawaさま、

実装のヒントとなる単語をご提示いただき誠にありがとうございます。
まず、私の書き方があまり具体的でなかったために勘違いをさせてしまったことをお詫び申し上げます。
確かに私の書込みだけを参照するとユーザに自由にブラウジングさせてそのソースを収集するスパイアプリのようにも見えますね。
しかし、私の意図するところは特定のWebサービスを利用するユーザを対象としたアプリケーションです。プリセットされたURLからソースのスナップショットを取得し、その情報からサービス利用者に提案を行う。そのような想定をしておりました。
そのため、ユーザの入力した情報を記録するつもりはありません。そのサービスを利用するユーザを平等に手助けし、個人の識別も行わない予定です。

最後に、野口さまにご提案いただいたWebArchiveを保存する手法にてソースの取得ができました。実装を進めていく中でsuppi__さまとShiozawaさまにご提案いただいた方法も検討したいと思います。ありがとうございました。
天然パーマさま、ソースまでご掲載いただき誠にありがとうございます。指定したURLからのソース取得は正に私がやりたかったことでした。大いに参考にさせていただきます。

また不明な点が出て参りましたらご質問させて下さい。あいこ


2014年5月26日月曜日 15時02分21秒 UTC+9 天然パーマ:

Jun Shiozawa

unread,
May 28, 2014, 2:38:33 AM5/28/14
to android-g...@googlegroups.com

Google Play デベロッパー プログラム ポリシー


https://play.google.com/intl/ALL_jp/about/developer-content-policy.html
  • 以下のような機能を主要な機能とするアプリを送信してはなりません:
    • アフィリエイトのトラフィックをウェブサイトに誘導する
    • 自分で所有または管理していないウェブサイトのウェブ表示を提供する(ただし、そのウェブサイトの所有者または管理者から許可を得ている場合を除く)

ここが気になります。

「仮」に、「特定のWebサービス」のウェブ表示が伴うサービスの場合
「特定のWebサービス」の所有者または管理者から許可を得ていますか。


>個人の識別も行わない予定

その「個人の識別」の定義そのものが揺らいでいるのです。


スマホアプリとプライバシーの「越えてはいけない一線」


あるAndroidアプリ開発者も、「こういった事例が生じることで、『Androidアプリは怖い』という認識が広がることが怖い」と述べる。

(略)

端末IDは、現行の個人情報保護法でいう個人情報には該当しないという見解もある。例えば園田氏は、ケースバイケースであると断りながらも、「『端末の固有番号、他に導入済みのすべてのアプリの名前、各アプリを使った時間帯などのデータ』などには原則として個人識別性がないので、『個人情報』に当たらないと思われる」という。端末の固有番号についても、「あくまでもデバイスに関連付けられた番号であって、加入者との対応関係は保障されるものではない」(園田氏)。

 しかし逆に、高木氏は一歩踏み出して、さまざまなプライバシー情報とひも付く可能性のある端末IDも個人情報に含める形で法律を見直すべきだという。「サイト横断的に、アプリ横断的に、あるいはサービス横断的に共通であって、しかも長期間にわたって変更されないという特性を持つ番号は、個人識別性のある個人情報としてとらえるべき」(高木氏)。

 いずれにせよ、端末IDが現行の個人情報保護法でいう「個人情報」には当たらなくとも、それにひも付くのが「プライバシーに関わる、機微な情報」(徳丸氏)であることに異論はないだろう。嗜好や、あるいはよりセンシティブな病気などの情報は、「人によっては、住所氏名といった情報以上に知られるのは嫌だ、関係のないところに出ていく可能性があるだけでも嫌だ、と思うかもしれない」(徳丸氏)。

Android マーケット デベロッパー販売/配布契約書

https://play.google.com/intl/ALL_jp/about/developer-distribution-agreement.html


4.3 デベロッパーは、マーケットを使用して対象製品を販売/配布するにあたり、ユーザーのプライバシーおよび法的権利を保護するものとします。ユーザーからデベロッパーにユーザー名、パスワード、またはその他のログイン情報または個人情報が提供される、またはデベロッパーの対象製品によってそのような情報へのアクセスまたは使用が行われる場合、デベロッパーは、情報がデベロッパーの対象製品に提供されることをユーザーに認識させ、当該ユーザーについてプライバシーに関する法的に十分な通知および保護を行わなければなりません。また、デベロッパーの対象製品による当該情報の使用については、ユーザーがデベロッパーに対して許可した、限定された目的のための使用のみが認められます。デベロッパーの対象製品にユーザーから提供された個人情報または機密情報が保存される場合、この保存は保護された方法で、かつ必要な範囲内でのみ行われなければなりません。ただし、ユーザーがデベロッパーとの間で、デベロッパーまたはデベロッパーの対象製品が、デベロッパーの対象製品(他の製品またはアプリケーションを含まない)に直接関係する個人情報または機密情報を保存または使用することを許可する別の契約に同意することを選択した場合、デベロッパーによる当該情報の使用には当該契約の規定が適用されます。ユーザーからデベロッパーの対象製品に Google アカウントの情報が提供された場合、デベロッパーの対象製品では、ユーザーが許可したタイミングで、かつユーザーが許可した限定された目的にのみ、当該情報を使用してユーザーの Google アカウントにアクセスすることが認められるものとします。

この規約は確認しましたか。

前述

スマホアプリとプライバシーの「越えてはいけない一線」から


ユーザーの同意を得られているかどうかは、2011年7月の刑法改正で新設された、いわゆる「ウイルス作成・提供罪」にも関わってくる。

前述

スマホアプリとプライバシーの「越えてはいけない一線」

の記事全体を熟読し

ユーザーへの説明責任は果たしているか

越えてはいけない一線はどこに?

など同記事の上記パラグラフを確認し
特に同記事のこのパラグラフ

Androidに対する信頼を損なわないために

を読まれることを強くお勧めしますよ。

あとこちらも
独立行政法人 産業技術総合研究所 情報セキュリティ研究センター 主任研究員 高木浩光氏のブログ


あとは、自己責任で。

2014年5月26日月曜日 15時13分07秒 UTC+9 あいこ:

あいこ

unread,
May 28, 2014, 4:24:13 AM5/28/14
to android-g...@googlegroups.com
Shiozawaさま、

非常に興味深いご忠告誠にありがとうございます。
  • 以下のような機能を主要な機能とするアプリを送信してはなりません:
    • アフィリエイトのトラフィックをウェブサイトに誘導する
    • 自分で所有または管理していないウェブサイトのウェブ表示を提供する(ただし、そのウェブサイトの所有者または管理者から許可を得ている場合を除く)
この部分の解釈に関する私の意見は次の通りです。
> 主要な機能とする
との記述から、ウェブ上で広く一般に公開されたあるコンテンツを表示する機能のみをアプリに持たせることによって第三者のコンテンツをアプリ作成者が所有しているようにユーザーに誤解させることを禁じているのではないでしょうか。
そのコンテンツをただ表示させる以上の機能を持たせて付加価値をユーザーに提供できるのであればそれこそがそのアプリの主要な機能であり、ウェブ表示を提供することが主要な機能であるとは言えないと思います。

もちろん、ウェブコンテンツの所有権/著作権等はコンテンツ作成者に属することに変わりはありませんので、表示されるコンテンツの所有者とアプリケーションの作成者には何の関係もないことをユーザーが認識できるようにする必要があると思います。しかし、公開されているコンテンツから付加価値を生み出す手段をアプリケーションとして提供することは所有者や著作者の権利を侵害しないと考えられます。
# しかしこの規約だけを読むとウェブブラウザを公開するには表示できるページの所有者全ての許可を取らないといけないようにも読めますね(冗談ですが)。恐らく、ブックマーク機能など、便利にブラウジングできることが主要な機能なのでしょう。

「個人の識別」に関しても注意深く検討したいと思います。

Googleの規約と法律はまた別のものなので両方を満たす必要は確かにありますね。
これらの文章は解釈が分かれるところではあるので私の解釈が正しいとも言えません。Shiozawaさまのようにこの規約を解釈するのが正しいというのがGoogleの見解でも全く驚きませんので、Googleに確認することに致します。


2014年5月28日水曜日 15時38分33秒 UTC+9 Jun Shiozawa:
Reply all
Reply to author
Forward
0 new messages