teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

a

2016/04/09 04:35

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -28,7 +28,7 @@
28
28
  public function __construct()
29
29
  {
30
30
  $this->ch = curl_init();
31
- curl_setopt_array($ch, [
31
+ curl_setopt_array($this->ch, [
32
32
  CURLOPT_COOKIEFILE => '',
33
33
  CURLOPT_FAILONERROR => true,
34
34
  CURLOPT_RETURNTRANSFER => true,
@@ -45,27 +45,27 @@
45
45
 
46
46
  public function get($url, array $params = [])
47
47
  {
48
- curl_setopt_array($ch, [
48
+ curl_setopt_array($this->ch, [
49
49
  CURLOPT_URL => $url . '?' . http_build_query($params, '', '&'),
50
50
  CURLOPT_HTTPGET => true,
51
51
  ]);
52
- $response = curl_exec($ch);
52
+ $response = curl_exec($this->ch);
53
53
  if ($response === false) {
54
- throw new \RuntimeException(curl_error($ch));
54
+ throw new \RuntimeException(curl_error($this->ch));
55
55
  }
56
56
  return $response;
57
57
  }
58
58
 
59
59
  public function post($url, array $params = [])
60
60
  {
61
- curl_setopt_array($ch, [
61
+ curl_setopt_array($this->ch, [
62
62
  CURLOPT_URL => $url,
63
63
  CURLOPT_POST => true,
64
64
  CURLOPT_POSTFIELDS => http_build_query($params, '', '&'),
65
65
  ]);
66
- $response = curl_exec($ch);
66
+ $response = curl_exec($this->ch);
67
67
  if ($response === false) {
68
- throw new \RuntimeException(curl_error($ch));
68
+ throw new \RuntimeException(curl_error($this->ch));
69
69
  }
70
70
  return $response;
71
71
  }

5

a

2016/04/09 04:34

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -36,7 +36,7 @@
36
36
  ]);
37
37
  }
38
38
 
39
- public static function dom($content)
39
+ public static function createDOMXPath($content)
40
40
  {
41
41
  $dom = new \DOMDocument;
42
42
  @$dom->loadHTML($content);
@@ -72,12 +72,12 @@
72
72
 
73
73
  public function getXPath($url, array $params = [])
74
74
  {
75
- return self::dom($this->get($url, $params));
75
+ return self::createDOMXPath($this->get($url, $params));
76
76
  }
77
77
 
78
78
  public function postXPath($url, array $params = [])
79
79
  {
80
- return self::dom($this->post($url, $params));
80
+ return self::createDOMXPath($this->post($url, $params));
81
81
  }
82
82
 
83
83
  }

4

a

2016/04/09 04:31

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -10,4 +10,75 @@
10
10
  ```
11
11
 
12
12
  このメソッドを使えばいいです.
13
- (ただ,`file_get_contents`はHTTP/1.0にてTCPコネクションを再利用しないようになっているので,cURLを使ったコードに変えてHTTP/1.1でTCPコネクションを再利用するようにしたほうが,サイトに対する負荷も実行時間も短くなりますので,書き換えをおすすめします)
13
+ (ただ,`file_get_contents`はHTTP/1.0にてTCPコネクションを再利用しないようになっているので,cURLを使ったコードに変えてHTTP/1.1でTCPコネクションを再利用するようにしたほうが,サイトに対する負荷も実行時間も短くなりますので,書き換えをおすすめします)
14
+
15
+ ---
16
+
17
+ 【蛇足】
18
+
19
+ こういうクラス作っておくと使い勝手いいと思います.
20
+
21
+ ```php
22
+ <?php
23
+
24
+ class Scraper
25
+ {
26
+ private $ch;
27
+
28
+ public function __construct()
29
+ {
30
+ $this->ch = curl_init();
31
+ curl_setopt_array($ch, [
32
+ CURLOPT_COOKIEFILE => '',
33
+ CURLOPT_FAILONERROR => true,
34
+ CURLOPT_RETURNTRANSFER => true,
35
+ CURLOPT_FOLLOWLOCATION => true,
36
+ ]);
37
+ }
38
+
39
+ public static function dom($content)
40
+ {
41
+ $dom = new \DOMDocument;
42
+ @$dom->loadHTML($content);
43
+ return new \DOMXPath($dom);
44
+ }
45
+
46
+ public function get($url, array $params = [])
47
+ {
48
+ curl_setopt_array($ch, [
49
+ CURLOPT_URL => $url . '?' . http_build_query($params, '', '&'),
50
+ CURLOPT_HTTPGET => true,
51
+ ]);
52
+ $response = curl_exec($ch);
53
+ if ($response === false) {
54
+ throw new \RuntimeException(curl_error($ch));
55
+ }
56
+ return $response;
57
+ }
58
+
59
+ public function post($url, array $params = [])
60
+ {
61
+ curl_setopt_array($ch, [
62
+ CURLOPT_URL => $url,
63
+ CURLOPT_POST => true,
64
+ CURLOPT_POSTFIELDS => http_build_query($params, '', '&'),
65
+ ]);
66
+ $response = curl_exec($ch);
67
+ if ($response === false) {
68
+ throw new \RuntimeException(curl_error($ch));
69
+ }
70
+ return $response;
71
+ }
72
+
73
+ public function getXPath($url, array $params = [])
74
+ {
75
+ return self::dom($this->get($url, $params));
76
+ }
77
+
78
+ public function postXPath($url, array $params = [])
79
+ {
80
+ return self::dom($this->post($url, $params));
81
+ }
82
+
83
+ }
84
+ ```

3

a

2016/04/09 04:29

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -10,4 +10,4 @@
10
10
  ```
11
11
 
12
12
  このメソッドを使えばいいです.
13
- (ただ,`file_get_contents`はHTTP/1.0にてコネクションを再利用しないようになっているので,cURLを使ったコードに変えてHTTP/1.1でコネクションを再利用するようにしたほうが,サイトに対する負荷も実行時間も短くなりますので,書き換えをおすすめします)
13
+ (ただ,`file_get_contents`はHTTP/1.0にてTCPコネクションを再利用しないようになっているので,cURLを使ったコードに変えてHTTP/1.1でTCPコネクションを再利用するようにしたほうが,サイトに対する負荷も実行時間も短くなりますので,書き換えをおすすめします)

2

a

2016/04/09 04:19

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -7,4 +7,7 @@
7
7
  public function get($url, array $data = []) {
8
8
  return file_get_contents($url . '?' . http_build_query($data, '', '&'));
9
9
  }
10
- ```
10
+ ```
11
+
12
+ このメソッドを使えばいいです.
13
+ (ただ,`file_get_contents`はHTTP/1.0にてコネクションを再利用しないようになっているので,cURLを使ったコードに変えてHTTP/1.1でコネクションを再利用するようにしたほうが,サイトに対する負荷も実行時間も短くなりますので,書き換えをおすすめします)

1

a

2016/04/09 04:18

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -5,6 +5,6 @@
5
5
 
6
6
  ```php
7
7
  public function get($url, array $data = []) {
8
- return file_get_contents($url, $url . '?' . http_build_query($data, '', '&'));
8
+ return file_get_contents($url . '?' . http_build_query($data, '', '&'));
9
9
  }
10
10
  ```