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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

666閲覧

【PHP】【switch文】想定外の挙動をするのを解決したいです。【正規表現:条件と違うものが選ばれる事があります】

shimane

総合スコア98

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2017/07/18 20:05

【現在の状況】

PHPの勉強を開始して数ヶ月のものです。
現在、ドットインストールと書籍で基礎的な知識と簡単なプログラムの作成が終わりました。

そこで
以前こちらにて教えて頂いた通り
自作で作りたいものを作りながらPHPの勉強をしようと思い「スクレイピング」を使ったサイトを作成中です。


【現在の進捗状況】
PHP+PHPQUERYを使用:
「記事のタイトル」「記事のURL」「投稿日時」「画像・動画の枚数」の取得が完了
上記で取得した情報をmysqlに登録
bootstrapを利用して作成したテーブルにmysqlのデータを表示

ここまでなんとか作る事が出来ました。


【問題が発生している点】
次に記事の「引用元」を取得し、取得した「URL」によって「引用元の名前」を取得したいと考えています。

foreach文の中で取得したURLが「引用元」なのか「画像や動画のurl」なのかの判断と
もしも「引用元」だった場合に「引用元の企業名」を変数に入れて
mysqlにて保存していきたいと思っています。

初心者なりにネットで検索したり色々と頭を悩ませた結果、
switch文の条件分岐で書いていけばいいのでは?と考え
switchと正規表現で作ってみました。

PHP

1// 引用元のURLを取得(本文中の「a」タグを含めたURLのテキストを取得しています。):phpquery使用 2$inyoumoto = pq($entry)->find('dd > a')->text(); 3 4switch(true) { 5case preg_match('/this.kiji.is/', $inyoumoto): 6 $inyoumoto2 = "共同通信"; 7 break; 8case preg_match('/news.livedoor/', $inyoumoto): 9 $inyoumoto2 = "livedoorニュース"; 10 break; 11case preg_match('/afpbb/', $inyoumoto): 12 $inyoumoto2 = "AFPBBニュース"; 13 break; 14case preg_match('/3.nhk.or.jp/', $inyoumoto): 15 $inyoumoto2 = "NHKニュースWEB"; 16 break; 17case preg_match('/news24.jp/', $inyoumoto): 18 $inyoumoto2 = "日テレNEWS24"; 19 break; 20case preg_match('/j-cast.com/', $inyoumoto): 21 $inyoumoto2 = "JCASTニュース"; 22 break; 23case preg_match('/mess-y.com/', $inyoumoto): 24 $inyoumoto2 = "メッシー"; 25 break; 26case preg_match('/reuters.com/', $inyoumoto): 27 $inyoumoto2 = "ロイター"; 28 break; 29case preg_match('/news.tv-asahi.co.jp/', $inyoumoto): 30 $inyoumoto2 = "テレビ朝日"; 31 break; 32case preg_match('/dot.asahi.com/', $inyoumoto): 33 $inyoumoto2 = "AERAdot."; 34 break; 35case preg_match('/www.sankei.com/', $inyoumoto): 36 $inyoumoto2 = "産経新聞"; 37 break; 38case preg_match('/headlines.yahoo.co.jp/', $inyoumoto): 39 $inyoumoto2 = "yahooニュース"; 40 break; 41case preg_match('/www.fnn-news.com/', $inyoumoto): 42 $inyoumoto2 = "FNNニュース"; 43 break; 44default: 45 $inyoumoto2 = "未登録の引用元です。"; 46 break; 47} 48

このコードを利用した所
「8割」ぐらいは条件通りに動いてくれたのですが
たまに
「未登録の引用元」なのに「共同通信」や「産経新聞」と表示されたり
「登録されている引用元」なのに「別の引用元」の名前が表示されたりといった事も発生しています。
(普段は「未登録の引用元」だと正常に表示されるのですが、たまに「別の引用元の企業名」が表示されます。)

なんとか解決出来ないかと2日間ぐらい頭を沸騰させながら悩み続けたのですが上手くいきません。

勉強中の初心者が作ったコードなので
どこかが間違っているのだとは思うですが中々見つける事が出来ません。
どこか変な場所等がありましたら教えて頂けると嬉しいです。

【悩んでいる時に特に参考にしたサイト】

正規表現
http://php.o0o0.jp/article/3179155697556829

switch文
http://qiita.com/tkykmw/items/ee0ab7bf502361f413d8

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スクレイピングは、スクレイピング先に迷惑をかける可能性があるので、初心者が手を出すべき技術ではありません。

また、「スクレイピング」を使ったサイトは、色々検討すべき箇所があるので、こちらを読んでみて下さい。
スクレイピング!その前に

スクリプトに関しては、正規表現の理解が足りていません。
/this.kiji.is/
.は特別な意味を持ちます。
再現する$entryを保存して、$inyoumotoの中身を確認すれば、なにが合致したのかはわかると思います。

投稿2017/07/18 22:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shimane

2017/07/18 22:53

回答有難うございます。 スクレイピングに関しては以前もこちらにて教えて頂いた事もあり 現在、ネットを経由しての取得ではなく 「一度ソースを.phpファイルに保存」してそのファイルをfile_get_contents()で利用しています。 優しいお言葉有難うございます。 もっと勉強を重ねて、実力を付けてからcronで1時間に1度とかに実行という風に利用していきたいと思います。 また、正規表現に付いて教えてくださって有難うございます。 勉強したはずだったのにすっかりとメタ文字に対してのエスケープ処理についての事が失念していました。 プログラムについて悩んでいると頭を柔らかくして考えることの重要性が身にしみます。 ご回答有難うございます。 今、正規表現にて「エスケープ処理」と「最長一致」で結果を試しています。 これで上手くいければいいなと期待を込めながら頑張ってみます。 結果についても分かりましたらご報告したいと思います。感謝
shimane

2017/07/18 23:44

色々試してみた結果、正規表現の事について教えて頂く前よりも 高い精度で正常な動きをしてくれるようになりました。 有難うございます。本当に助かりました。 残りの誤差みたいな間違いは、まだ正規表現の使い方の学習が足りていないのだと理解出来ましたので これからも、もっともっと勉強を進めていこうと思います。 今回は本当に助けて頂きまして有難うございます。感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問