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

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

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

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

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

PHP

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

Q&A

解決済

2回答

1844閲覧

【PHP】【Curl】【https】スクレイピング時のタイムアウトの解決方法【SSL通信】【初心者】

shimane

総合スコア98

スクレイピング

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

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

PHP

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

0グッド

2クリップ

投稿2017/09/08 08:45

現在、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

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

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

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

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

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

guest

回答2

0

ベストアンサー

pixiv側でIPレベルでブロックしているのではと思います。

私が持っている、さくらVPSのサーバー上からwgetコマンドでpixivのトップページにアクセスしてみましたが、かなり前に借りたサーバーではアクセスできませんでした。(ちなみに最近借りたサーバーではアクセスできた)

過去にpixivにクロールなどは行ったことはないので、ブロックされるいわれはありません。
おそらくさくらのIPで範囲指定でブロックされているのではないでしょうか?

サクラに限らず、VPSで不正アクセスを試みる輩が多いので、範囲でブロックされることは結構あるかと思われます。

たしか、2週間無料だったとおもうので、試しにサーバーを借りなおしてみる(IPを変える)というのも方法かもしれません。

投稿2017/09/09 07:17

CodeLab

総合スコア1939

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

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

shimane

2017/09/09 13:14

回答有難うございます。また、実際に試して頂きまして有難うございます。「アクセスできませんでした。」というので納得できました。私の未熟な技術的な問題だと思っていて、長時間悩んでいたのですが範囲ブロックの可能性も強いということで、phpの勉強はまた別の方向で頑張っていこうと思います。大感謝です!
guest

0

質問に書くには、長過ぎるので、回答で...


スクレイピングの可否は置いておくとして、プログラムをざっくり見た感じでは、動作上の大きな問題はなさそうです。

エラーメッセージが、

Failed to connect to www.pixiv.net port 443: Connection timed out

と 接続タイムアウトのようですが、 さくらの VPS から pixiv への到達は可能でしょうか?

たとえば、VPS にログインして、

wget --spider https://www.pixiv.net/

で、以下のように「Connecting to www.pixiv.net|210.129.120.43|:443... connected.」や「HTTP request sent, awaiting response... 200 OK」の結果は、返ってくるでしょうか? (IP アドレスは違うかもしれません)

$ wget --spider https://www.pixiv.net/ Spider mode enabled. Check if remote file exists. --2017-09-09 15:52:01-- https://www.pixiv.net/ Resolving www.pixiv.net... 210.129.120.43, 210.129.120.41, 210.129.120.44 Connecting to www.pixiv.net|210.129.120.43|:443... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] Remote file exists and could contain further links, but recursion is disabled -- not retrieving.

また、

ping www.pixiv.net

で、以下のようなレスポンスはあるでしょうか? (IP アドレスは違うかもしれません)

$ ping www.pixiv.net PING pixiv.net (210.129.120.43): 56 data bytes 64 bytes from 210.129.120.43: icmp_seq=0 ttl=54 time=8.672 ms 64 bytes from 210.129.120.43: icmp_seq=1 ttl=54 time=21.701 ms

もし、レスポンスが返ってこないようであれば、プログラムの問題ではなく、インターネット上の経路情報がおかしいかもしれませんので、さくらインターネットのサポート窓口に問い合わせるのが良いと思います。

投稿2017/09/09 06:55

編集2017/09/09 07:01
CHERRY

総合スコア25171

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

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

shimane

2017/09/09 13:12

回答ありがとうございます。問題解決をするためのヒントというか、同じような問題が別の時に起きた時にも教えて頂いた方法で頑張ってみることができると思います。大感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問