回答編集履歴
5
罫線
test
CHANGED
@@ -45,6 +45,10 @@
|
|
45
45
|
|
46
46
|
|
47
47
|
それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
----
|
48
52
|
|
49
53
|
|
50
54
|
|
4
誤字
test
CHANGED
@@ -124,4 +124,6 @@
|
|
124
124
|
|
125
125
|
[password] => *********
|
126
126
|
|
127
|
+
)
|
128
|
+
|
127
|
-
|
129
|
+
```
|
3
誤字
test
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
$loginForm['username'] = '**********@sample.com';
|
10
10
|
|
11
|
-
$loginForm['password'] = '*********'
|
11
|
+
$loginForm['password'] = '*********';
|
12
12
|
|
13
13
|
$crawler = $client->submit($loginForm);
|
14
14
|
|
@@ -45,3 +45,83 @@
|
|
45
45
|
|
46
46
|
|
47
47
|
それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
**おまけ**
|
52
|
+
|
53
|
+
以下は、自分で作ったフォームにgoutteでクロールさせてみて、POSTデータがどうなっているか実験してみた結果です。
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
フォーム側
|
58
|
+
|
59
|
+
```php
|
60
|
+
|
61
|
+
<?php
|
62
|
+
|
63
|
+
print_r($_POST);
|
64
|
+
|
65
|
+
?>
|
66
|
+
|
67
|
+
<form method='POST'>
|
68
|
+
|
69
|
+
<input name="username" type="text">
|
70
|
+
|
71
|
+
<input name="password" type="text">
|
72
|
+
|
73
|
+
<button type="submit" name="_eventId_proceed" onclick="this.childNodes[0].nodeValue='ログインしています…'">ログイン</button>
|
74
|
+
|
75
|
+
</form>
|
76
|
+
|
77
|
+
```
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
クロール側
|
82
|
+
|
83
|
+
```php
|
84
|
+
|
85
|
+
<?php
|
86
|
+
|
87
|
+
require __DIR__ . "/vendor/autoload.php";
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
use Goutte\Client;
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
$client = new Client();
|
96
|
+
|
97
|
+
$crawler = $client->request('GET', 'http://example.com/hoge.php');
|
98
|
+
|
99
|
+
$loginForm = $crawler->selectButton('ログイン')->form();
|
100
|
+
|
101
|
+
$loginForm['username'] = '**********@sample.com';
|
102
|
+
|
103
|
+
$loginForm['password'] = '*********';
|
104
|
+
|
105
|
+
$crawler = $client->submit($loginForm);
|
106
|
+
|
107
|
+
echo $crawler->text();
|
108
|
+
|
109
|
+
```
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
結果(フォーム側のprint_r($_POST)の出力結果)
|
114
|
+
|
115
|
+
```
|
116
|
+
|
117
|
+
Array
|
118
|
+
|
119
|
+
(
|
120
|
+
|
121
|
+
[_eventId_proceed] =>
|
122
|
+
|
123
|
+
[username] => **********@sample.com
|
124
|
+
|
125
|
+
[password] => *********
|
126
|
+
|
127
|
+
)```
|
2
間違えていたので、全面的に書き換えた
test
CHANGED
@@ -1,38 +1,4 @@
|
|
1
|
-
確かにsubmitボタンのnameはGoutteでsubmitした場合、postデータとして渡されない感じもするので可能性はあると思います。以下のようにすると自前でinputを追加できますよ
|
2
|
-
|
3
|
-
```php
|
4
|
-
|
5
|
-
use DomDocument;
|
6
|
-
|
7
|
-
use Symfony\Component\DomCrawler\Field\InputFormField;
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
$domdocument = new DOMDocument;
|
12
|
-
|
13
|
-
$input = $domdocument->createElement('input');
|
14
|
-
|
15
|
-
$input->setAttribute('name', '_eventId_proceed');
|
16
|
-
|
17
|
-
$input->setAttribute('value', '');
|
18
|
-
|
19
|
-
$input = new InputFormField($input);
|
20
|
-
|
21
|
-
$loginForm->set($input);
|
22
|
-
|
23
|
-
```
|
24
|
-
|
25
|
-
参考:[Adding Additional Fields to Symfony Form before Submit](http://stackoverflow.com/questions/25869185/adding-additional-fields-to-symfony-form-before-submit)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
**(追記)**
|
34
|
-
|
35
|
-
|
1
|
+
以下のようにformを取得する際にselectButtonを使えば、submitボタンのnameもpostデータとして渡されると思いますよ。
|
36
2
|
|
37
3
|
```php
|
38
4
|
|
@@ -47,3 +13,35 @@
|
|
47
13
|
$crawler = $client->submit($loginForm);
|
48
14
|
|
49
15
|
```
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
ただし、Goutteはjavascriptの挙動はトレースできないので、javascriptでinputの追加などの処理があるなら、以下のように自前でinputを追加する必要があります。
|
20
|
+
|
21
|
+
```php
|
22
|
+
|
23
|
+
use DomDocument;
|
24
|
+
|
25
|
+
use Symfony\Component\DomCrawler\Field\InputFormField;
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
$domdocument = new DOMDocument;
|
30
|
+
|
31
|
+
$input = $domdocument->createElement('input');
|
32
|
+
|
33
|
+
$input->setAttribute('name', 'hoge');
|
34
|
+
|
35
|
+
$input->setAttribute('value', 'hoge');
|
36
|
+
|
37
|
+
$input = new InputFormField($input);
|
38
|
+
|
39
|
+
$loginForm->set($input);
|
40
|
+
|
41
|
+
```
|
42
|
+
|
43
|
+
参考:[Adding Additional Fields to Symfony Form before Submit](http://stackoverflow.com/questions/25869185/adding-additional-fields-to-symfony-form-before-submit)
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
|
1
補足
test
CHANGED
@@ -27,3 +27,23 @@
|
|
27
27
|
|
28
28
|
|
29
29
|
それでうまくいかないなら、formを使うのをやめて、ブラウザのデベロッパーツールとかでPOSTしているデータをすべて配列で用意して、```$client->request('POST', $url, $post_data);```でやった方が早いかもしれませんね。
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
**(追記)**
|
34
|
+
|
35
|
+
すみません...少し勘違いをしていました。以下のようにformを取得する際にselectButtonを使えば、submitボタンのnameもpostデータとして渡されていました。なので、以下のコードでやれば、inputを自前で追加する必要なさそうです。
|
36
|
+
|
37
|
+
```php
|
38
|
+
|
39
|
+
$crawler = $client->request('GET', 'https://sample.com/login/');
|
40
|
+
|
41
|
+
$loginForm = $crawler->selectButton('ログイン')->form();
|
42
|
+
|
43
|
+
$loginForm['username'] = '**********@sample.com';
|
44
|
+
|
45
|
+
$loginForm['password'] = '*********'
|
46
|
+
|
47
|
+
$crawler = $client->submit($loginForm);
|
48
|
+
|
49
|
+
```
|