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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

3回答

591閲覧

該当サイトのhtml構造を取得することができない

kodoumai

総合スコア7

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/05/18 09:22

##わからないこと
お世話になります。
下のサイトを読み込んで、html構造をスクレイピングしようとしているのですが、
httpエラー(301)が発生し取得できません。

https://www.co-medical.com/ns/

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">\n <html><head>\n <title>301 Moved Permanently</title>\n </head><body>\n <h1>Moved Permanently</h1>\n <p>The document has moved <a href="https://www.co-medical.com/ns/search/">here</a>.</p>\n </body></html>\n

ウェブに表示する場合は問題ないのですが、コマンドをたたいて読み込ませようとすると失敗します。
この原因はパラメータの不足にあるのか、ページがリダイレクトで表示されているのでしょうか

$userAgent = new userAgent(); $agent = $userAgent->agent(rand(1, 80)); $ch = curl_init(); $url = 'http://www.co-medical.com/ns/search/?search_redirect=1&jobtype=OC001&jobtype_roma=ns&mode=popup'; curl_setopt($ch, CURLOPT_USERAGENT, $agent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_URL, $url); $page = curl_exec($ch); dd($page);

書いたコードは上記のみです。

ご教授いただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/05/18 09:44 編集

なにかライブラリやモジュールなど追加していませんか? 開発環境を再現するのに必要な情報をください。
guest

回答3

0

一般論でいうと、
先方のサーバーでbotだとみなされて拒否されている状況だろうと思います。

botだとみなされない確実な方法など無いのですが、
例えば先方に通知するuser-agent名を実在するwebブラウザのものを引用するのも手ですが、
おすすめしません。

投稿2018/05/18 09:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takyafumin

2018/05/18 10:19

>先方のサーバーでbotだとみなされて拒否されている状況だろうと思います。 違う回答をしてしまいましたが、これっぽいですね。
kodoumai

2018/05/18 10:27

ご回答ありがとうございます。 file_get_contentsを用いたところ、 ``` file_get_contents(http://www.co-medical.com/ns/search/): failed to open stream: HTTP request failed! HTTP/1.0 404 N ot Found ``` とでてきました。 これはbotとみなされた結果、ページを表示しないようにしたのでしょうか? こちらではuseragentをm6uさんの仰るように実在するブラウザのものと合わせております
退会済みユーザー

退会済みユーザー

2018/05/18 13:42

BOTとみなすというか GETのアクセスを禁止してるようだね
guest

0

アクセス的に
https 必須ですね

http から https へのredirectでしょう

GET アクセスも禁止してる可能性もあります。

$ wget https://www.co-medical.com/ns/search/ --post-data="search_redirect=1&jobtype=OC001&jobtype_roma=ns&mode=popup" -O /dev/null --2018-05-18 22:45:41-- https://www.co-medical.com/ns/search/ Resolving www.co-medical.com (www.co-medical.com)... 153.121.90.149 Connecting to www.co-medical.com (www.co-medical.com)|153.121.90.149|:443... connected. HTTP request sent, awaiting response... 303 See Other Location: https://www.co-medical.com/ns/search/ [following] --2018-05-18 22:45:41-- https://www.co-medical.com/ns/search/ Reusing existing connection to www.co-medical.com:443. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: '/dev/null' [ <=> ] 95,772 --.-K/s in 0.008s 2018-05-18 22:45:42 (12.1 MB/s) - '/dev/null' saved [95772]

投稿2018/05/18 13:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kodoumai

2018/05/18 15:10

ご回答ありがとうございます。 ということは、このサイトのhtmlはとってこれないということでしょうか?
退会済みユーザー

退会済みユーザー

2018/05/18 15:31

GETやHTTPじゃ取れないが HTTPSでPOSTは取れるよって
guest

0

https://ja.m.wikipedia.org/wiki/HTTPステータスコード

HTMLを見る限り、リダイレクト指示がありそうです。

httpヘッダーをみると、レスポンスが301になってたりしませんか?

リダリレクト先のURLを取得すれば、希望の動作となりそうですね。

コメントを受けての追記

提示されたサイトへのアクセスを解析してみました。
ブラウザでアクセスしている時も、提示されたURLへアクセス後、同一URLへリダイレクトしていました。
(chromeのディベロッパーツールで確認)

なので、phpのcurlでアクセスする際も同様の動作をすれば良さそうです。
ただし、リダイレクトする際にcookieを利用しているようでした。
ですので、

  • curlをリダイレクトするようにする
  • リダイレクト時にcookieを使う

とすると動作するようです。

curl_setoptの指定内容はネット検索結果をかじっただけなので、正しくはマニュアルを確認してみて下さい。
curl_setopt($curl, CURLOPT_HEADER, true);としているので、レスポンス内容にhttpヘッダ情報が含まれます。不要であれば行ごと削除で。

php

1 2<?php 3// URL 4$url = "https://www.co-medical.com/ns/search/?search_redirect=1&jobtype=OC001&jobtype_roma=ns&mode=popup"; 5 6// cookie 7$cookie_file = "/tmp/test.cookie"; 8 9 10// 初期化 11$curl = curl_init(); 12 13// オプション設定 14curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 15curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // リダイレクトをたどる 16curl_setopt($curl, CURLOPT_AUTOREFERER, true); // リダイレクトにreferを自動でつける 17curl_setopt($curl, CURLOPT_HEADER, true); // HEADERの表示 18curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); // cookie 19curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); // cookie 20curl_setopt($curl, CURLOPT_URL, $url); 21 22$html = curl_exec($curl); 23 24var_dump($html); 25curl_close($curl); 26

投稿2018/05/18 09:55

編集2018/05/18 11:20
takyafumin

総合スコア2335

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

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

kodoumai

2018/05/18 10:26

ご回答ありがとうございます。 リダイレクト先のURLを取得するのはget_headerが一番有名かと思います。 私をそれを使えば取得できると思ったのですが、こちらで挿入したものと同じURLがでてきました また、一旦file_get_contentsを用いたところ、 ``` file_get_contents(http://www.co-medical.com/ns/search/): failed to open stream: HTTP request failed! HTTP/1.0 404 N ot Found ``` とでてきました。
kodoumai

2018/05/18 12:41

ご回答ありがとうございます。 ご回答いただいた内容で、クッキーの値をファイルに格納することができました。 ただ、htmlにはページが表示されませんと出てしまいます。 誤りはどこにあると考えられますでしょうか? 対象のURLにパラメータを設定しても意味がないのでしょうか?
takyafumin

2018/05/18 13:24

提示したサンプルはwebページではなく、コマンドラインツールとして作成してます。 php ファイル名 として実行してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問