質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

phpQueryでHTML要素を取得する方法と気をつけること

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,692

minarai_SE

score 25

よろしくお願いします。

見よう見まねで、Webスクレイピングをやろうとしているところです。
ネットで調べるうち、phpQueryというものが容易だと見たので試みています。
このphpQueryを使ってあるサイトから必要な情報だけを抜き出したいのですが、わからないことが2つあります。

require_once("phpQuery-onefile.php");
$url = "https://○○○○";
$html = file_get_contents($url);

$msg="今回の課題名は、";
$msg = $msg . phpQuery::newDocument($html)->find(".title")->text() ."です。そして、リーダーは、";
$msg = $msg . phpQuery::newDocument($html)->find(".leader")->text() ."です。そして、副リーダーは、";
$msg = $msg . phpQuery::newDocument($html)->find(".subleader")->text() ."です";

echo $msg;

上記のように書いたのですが、目的通り、クラス名から、課題名とリーダー名、副リーダー名の情報を取得することができました。

Q1)
ここで教えていただきたいのですが、上記の場合、対象サイトには、1度だけ情報を取りに行っていると考えていいのでしょうか?
自分の手でブラウザを操作して移動したりするのでなく、こういうスクリプトを通じて他のサイトの情報を取得する場合、相手のサーバーに負担をかけると法に触れることもあるので頻度に気をつけるべし聞きました。上記のコードを実行するには1秒もかかってない感じなのですが、3度も取得しに行っているとすると、よくないかと思うんです。
いかがでしょうか?

Q2)

<table summary="役割分担表">
<tbody>
<tr><td>担当部署:</td><td>第3営業チーム</td><td></td></tr>
<tr><td>のべ担当者数:</td><td>(25人)</td><td></td></tr>
<tr><td>進捗管理担当者:</td><td><a href="○○○○">システム管理課長</a></td><td></td></tr>
<tr>……

対象のHTMLがこのような形で記述されている場合の、「第3営業チーム」「25人」「システム管理課長」をそれぞれ取得したいのですが、どう書けばいいのでしょうか?クラス名を通じての取得しかわからず、困っています。
「html全体を最初から見ていって、”担当部署”という文字があったらその次のtdの内容」みたいな指示の仕方かと思うのですが。

以上2点、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

方向性が全く違う質問はわけていただけると。
なぜなら「解決済み」とするには「全てに回答しなければならない」という印象を与え、回答の敷居が高くなって回答が得られにくくなります。

私見です。

Q1

相手のサーバーに負担をかけると法に触れることもあるので頻度に気をつけるべし聞きました。上記のコードを実行するには1秒もかかってない感じなのですが、3度も取得しに行っているとすると、よくないかと思うんです。

回数の問題ではないです。
法に「何回までならOKよ」というのはありません。
もちろん「見つからなかったらOK」でもありません。
相手方のサーバーの利用規約に禁止事項として書かれていたら否応なしにアウトです。
もしその1回の通信を何千人か同時にしたら・・・?極論ですが置きえない話ではないですよね。
利用規約に謳われていなかったとしても、慎重には慎重を期して、相手方に許可を得てから行うのがトラブルなくて済みます。

Q2
完全に丸投げです。
phpQuery利用を決めたのでしたら、phpQueryのマニュアルや機能をきちんと確認してまずは自分なりにやってみてください。
思うところは何となくありそうですし、思うとおりに組んでみて、そこで想定通りできていないところや起きた問題を以て質問してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

-1

質問の方法も内容もよくなかったようです。

多くのサイトを検索して調べてきましたが、スクレイピングの違法性は、基本的には「相手のサーバーに障害を与えたか」「相手の動作に悪影響を及ぼしたか」がまず基準とされるようなので、情報を取得しにいく側として一律に許容程度を定められることではないようですね。
過去に事件化した例では、サーバー側の脆さも一因だったり、逮捕された人も不起訴とされたそうで、有罪判決が出てないという点から、事件の評価は多様なようでした。ただ、「相手のサーバーがどれくらい頑丈なのかわからない以上、自分のスクレイピングの悪質さもわからない」というリスクの認識は多くの人たちで共有されているようでした。

いずれにしろ、素人は手を出さない方がよいようだ、と自分で結論づけました。

また、質問方法のどこが「完全に」丸投げなのか理解に苦しみますが、これについても今後は試行錯誤の過程も質問に盛り込むようにしたほうがよいようだと、考えることにしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/26 06:34

    ~したい。どうしたらいい? は丸投げです。
    ~したい。自分なりに調べてまずは試してみてこういう風にしてみた。だけど想定の結果が得られない。どうしたらいい? と質問すべきということです。
    (「この辺までは想定通りにできてそうだけど」、と、想定通りできていないことに対してデバッグしてなんとなくでも問題の切り分けができていればなおよし)
    https://teratail.com/help/question-tips

    回答の後半にも書いてますね。「~~だと思うけど」と何かしら想定している手順や手法があるのでしたら、まずその通りやってみてください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る