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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

3447閲覧

Goutteを使ってページ番号をクリックし、次のページに遷移させる

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2017/09/12 06:43

編集2017/09/12 11:53

###わからないこと
現在ハローワークの案件をクローリングしようとしています。
その中で案件一覧から次のページに進むために、ページ番号を取得しようとしていますが(inputのvalueです)、タグの取得ができずnullになってしまいます。
この原因や解決策についてご教授いただければ幸いです。

###該当URL
https://www.hellowork.go.jp/servicef/130020.do

###コード

$checkPages = $GoutteClient->submit($form, array('kyujinShurui' => 1, 'shinchakuKyujin' => 1)); $checkPage = @DOMDocument::loadHTML($checkPages->html()); $xmlString = $checkPage->saveXML(); $xml = simplexml_load_string($xmlString); $lastUrlLink = $xml->xpath("//div[contains(@class, 'number-link-top')]/p[1]"); $lastUrl = (string)$lastUrlLink[0]; $lastUrl = strstr($lastUrl, '件中', true); $lastUrl = preg_replace('/[^0-9]/', '', $lastUrl); $lastNum = ceil($lastUrl / 20); $checkPages = $checkPages->filter('div.number-link-top p')->eq(1)->parents()->filter('p')->eq(1); $checkPages = $checkPages->filter()->each(function($node){ $node->html(); }); var_dump($checkPages);

filterを使いページ番号まで参照し、ボタンをクリックしたり、xml形式で取得しようとしていましたが、書き方の問題なのかうまくいっておりません。

###進捗
次のページへの遷移ボタンの配列は出てきますが、その結果がnullになってしまっています。
こちらを解決しなければページリンクのボタンを取得できないと考えております。

array(12) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(0) "" [10]=> string(0) "" [11]=> string(0) "" }

お力を貸していただければ幸いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

渡すパラメータはfwListNaviBtnNextかfwListNaviBtn数字なのはわかっていると思うので、件数と、perpageを割り出して移動したほうが早い気がします。
ただ他にパラメータがいるかどうかは確認してないので、先にこのパラメータだけで次のページの内容が表示されるのか検証したほうが良いでしょう。
もしも、このパラメータだけで移動しないのであれば投げるパラメータが足りないでしょうから、チェックしていくかaro10さんのようにヘッドレスブラウザなどを利用して動かすほうが良いかもしれません。

投稿2017/09/12 16:06

fagai

総合スコア2158

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

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

0

ハローワークのページを見てみましたが、formのパラメータがかなり多いので、そもそもkyujinShuruiとshinchakuKyujinだけでリクエストパラメータはいいのか等も検証する必要があるかと思います。
ハローワークの一覧を簡易クロールして求人ページのURLを抽出する
質問にあるhttps://www.hellowork.go.jp/servicef/130020.doのURLを単純にクリックしてもエラーになり、
前ページからのパラメータ受け渡しなどあるかと思うので、Goutteでスクレイピングを実現するならば、必要なパラメータとしてこのあたりの整理を矛盾が無い段階まで地道に行う必要があります。

あるいはLaravelDuskかPHPWebdriver等でブラウザを操作して行うほうが数倍楽だと思います(Jqueryでより柔軟な抽出指定ができるため)。
facebook/php-webdriver

[サンプル追記]
Goutteのsubmitは指定していないform値はそのまま適用してくれているみたいなので、簡易ですがページを巡回する形でサンプルプログラムを作ってみました。

サンプルプログラム

Artisan::command('test_scrape', function () { $startUrl = "https://www.hellowork.go.jp/servicef/130020.do?action=initDisp&screenId=130020"; $crawler = \Goutte::request('GET', $startUrl); dump($crawler->getUri()); sleep(1); $form = $crawler->selectButton('検索')->form(); $crawler = \Goutte::submit($form,['kyujinShurui' => 1, 'shinchakuKyujin' => 1]); $this->info("1ページ目"); dump($crawler->getUri()); sleep(1); $crawler->filter("#ID_mainForm > div:nth-child(26) > div.number-link-top > p:nth-child(1)")->each(function ($node) { dump($node->text()); }); $form = $crawler->selectButton('次へ>>')->form(); $crawler = \Goutte::submit($form,[]); $this->info("2ページ目"); dump($crawler->getUri()); sleep(1); $crawler->filter("#ID_mainForm > div:nth-child(26) > div.number-link-top > p:nth-child(1)")->each(function ($node) { dump($node->text()); }); $form = $crawler->selectButton('次へ>>')->form(); $crawler = \Goutte::submit($form,[]); });

出力結果

"https://www.hellowork.go.jp/servicef/130020.do?action=initDisp&screenId=130020" 1ページ目 "https://www.hellowork.go.jp/servicef/130020.do" " 13259 件中 1 ~ 20 件を表示" 2ページ目 "https://www.hellowork.go.jp/servicef/130050.do" " 13259 件中 21 ~ 40 件を表示"

また質問コードでは、htmlをxmlに変換して処理をしているようですが、DomCrawlerには、filterXPathがありXpathでの抽出も出来ます。
GoutteはGuzzleとBrowserKit+DomCrawlerを組み合わせた物なので、以下のドキュメントを見れば出来ることがわかると思います。

The BrowserKit Component
The CssSelector Component
The DomCrawler Component

投稿2017/09/12 15:46

編集2017/09/13 05:45
aro10

総合スコア4106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問