現在、PHPの勉強としてスクレピングを行うサイトを作成しています。
urlが「http://」のサイトに関しましては
ローカル開発環境・本番環境(さくらVPS)の両方で無事にスクレピングに成功しまして
サイトも完成する事が出来ました。
ただurlが「https://」のサイトにてエラーが発生する事がありました。
ローカル開発環境(vagrant)では成功しているのですが、
本番環境(さくらVPS)ではエラーが発生しています。
なぜ、ローカル開発環境では成功して、
本番環境では失敗するのかの原因がわからず、困っています。
エラー内容
bool(false)
以下がコードの内容です。
(PHPQUERYを使用しています。)
スクレイピングを行う前の、この段階で既にエラーが表示されています。
PHP
1try { 2 $db = new \PDO(DSN, DB_USERNAME, DB_PASSWORD); 3 $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 4 echo "データベースへの接続が出来ました。<br />"; 5}catch (\PDOException $e) { 6 7 echo $e->getMessage(); 8 exit; 9} 10 11require_once(__DIR__ . '/phpQuery-onefile.php'); 12 13$html = "https://www.pixiv.net/ranking.php?mode=daily&content=illust"; 14 15// var_dump($html); 16 17//cURLセッションを初期化する 18$ch = curl_init(); 19 20// URLとオプションを指定する 21curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 22curl_setopt($ch, CURLOPT_URL, $html); 23curl_setopt($ch, CURLOPT_HEADER, false ); 24curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 25curl_setopt($ch, CURLOPT_TIMEOUT, 10); 26 27//URLの情報を取得する 28$html = curl_exec($ch); 29 30//ここでもうエラーの:bool(false)が表示されます。 31var_dump($html); 32 33// cURLがエラーを発生した時にエラー内容を表示します。 34//ここでエラーが表示されます。 35$response = curl_exec($ch); 36if( $response === FALSE ) 37{ 38 // エラー文字列を出力する 39 echo curl_error( $ch ); 40} 41 42$doc = phpQuery::newDocument(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); 43 44//ループ回数指定 45$i = 0; 46foreach ($doc[".取得したい範囲のクラス名"] as $entry){ 47 48//2回でループを終了 49if ($i >= 2 ) { 50 break; 51}else { 52 $i++; 53} 54タイトル表示 55画像表示 56 57} 58 59//セッションを終了する 60curl_close($ch); 61
勉強用なのでループを2回行うのを
crontab で1時間毎に1回行っているのですが、エラーが表示されてしまいます。
(ランキングの1位・2位だけを表示するといったプログラムです。)
画像を自動的にダウンロードするといった収集活動等も行っていません。
スクレイピングを行う前の、この段階で既にエラーが表示されています。
//URLの情報を取得する
$html = curl_exec($ch);
//ここでもうエラーの:bool(false)が表示されます。
var_dump($html);
実行結果
php
1データベースへの接続が出来ました。 2bool(false) Failed to connect to www.pixiv.net port 443: Connection timed out
ローカル開発環境ではエラーも表示されずに成功しています。
また、同じ「https:」でも
「https://www.youtube.com/」
「https://teratail.com/」
「https://matome.naver.jp/keyword/」だと
//URLの情報を取得する
$html = curl_exec($ch);
//ここでもうエラーの:bool(false)が表示されます。
var_dump($html);
の段階でのエラーは発生せず、サイトの情報が表示されました。
もしかしたら「https:」は関係なく
「https://www.pixiv.net/」側で禁止しているのかとも思ったのですが
下記のサイトにてスクレイピングが成功しているようなのです。
http://yaamaa-memo.hatenablog.com/entry/2017/07/24/020144
http://www.mathgram.xyz/entry/scraping/pixiv
また、私のローカル開発環境でも成功しているので、
何か別に問題があるのかもと思いネットで色々調べてみた結果、
SSLVersionがOpenSSL ではないとエラーが発生するという風な記事を見つけ、
SSL VersionをOpenSSL/1.0.1eに設定してみたのですがエラーが治りませんでした。
また、iptablesの設定はこのようになっています。
Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere icmp echo-request limit: avg 1/sec burst 4 ACCEPT tcp -- anywhere anywhere state RELATED,ESTABLISHED SERVICES tcp -- anywhere anywhere state NEW ACCEPT udp -- anywhere anywhere udp spt:domain ACCEPT udp -- anywhere anywhere udp spt:ntp dpt:ntp Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain SERVICES (1 references) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:設定しているport番号 ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https
会員登録が必要なページでもなく
他のhttps://サイトだと問題なく情報が表示され、
ローカル開発環境でも問題なく情報が表示されておりまして
さくらVPSのサーバーのみでエラーが発生しているという状況です。
色々とネットで調べてみましたが、原因が解決できず困っています。
解決する方法をご存知の方や、何か気になる点がありましたら
お力をお貸し頂けると嬉しいです。
どうかお願いします。
参考にしたURL
[PHP]CurlでのSSL接続をOpenSSL方式に変更する
http://kayakuguri.github.io/blog/2016/07/07/curl-openssl-tls/
さくらVPSのサーバーの情報です。
centos6.8
php5.6
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/09 13:14