スクレイパーを構築するときに、独自のクラスを作成して、ドメインで必要な機能を実行することができます。あなたは、対処する必要があるものを処理する独自の要求クラスと応答クラスのセットを作成することから始めることができます。
独自のリクエストクラスを作成することで、必要に応じてカールリクエストを実装できます。独自のレスポンスクラスを作成すると、返されたHTMLへのアクセス/解析を手助けすることができます。
これは私がデモ用に作成したいくつかのクラスの簡単な使用例です:
# simple get request
$request = new MyRequest('http://hakre.wordpress.com/');
$response = new MyResponse($request);
foreach($response->xpath('//div[@id="container"]//div[contains(normalize-space(@class), " post ")]') as $node)
{
if (!$node->h2->a) continue;
echo $node->h2->a, "\n<", $node->h2->a['href'] ,">\n\n";
}
それは私のブログの記事を返します。get要求を送信
Will Automattic join Dec 29 move away from GoDaddy day?
<http://hakre.wordpress.com/2011/12/23/will-automattic-join-dec-29-move-away-from-godaddy-day/>
PHP UTF-8 string Length
<http://hakre.wordpress.com/2011/12/13/php-utf-8-string-length/>
Title belongs into Head
<http://hakre.wordpress.com/2011/11/02/title-belongs-into-head/>
...
はその後のように簡単です。パイには、xpath式(ここではSimpleXML)で簡単にアクセスできます。 XPathは、正規表現よりも簡単に文書のデータを照会できるため、フォームフィールドからトークンを選択するのに便利です。
投稿リクエストを送信することは次のものでした。ブログのログインスクリプトを作成しようとしましたが、かなりうまく機能していました。レスポンスヘッダーも解析する必要があったので、リクエストと応答クラスにいくつかのルーチンを追加しました。あなたのシナリオを考慮し
# simple post request
$request = new MyRequest('https://example.wordpress.com/wp-login.php');
$postFields = array(
'log' => 'username',
'pwd' => 'password',
);
$request->setPostFields($postFields);
$response = new MyResponse($request->returnHeaders(1)->execute());
echo (string) $response; # output to view headers
あなたも、あなたがそれらを使用しているとして、鉱山はすでにクッキーを使用して、何が必要とのより良い対処する独自のリクエストクラスを編集したい場合があります。
# input values
$url = '<schoolsite>';
$user = '<number>';
$password = '<secret>';
# execute the first get request to obtain token
$response = new MyResonse(new MyRequest($url));
$token = (string) $response->xpath('//input[@name="token"]/@value');
# execute the second login post request
$request = new MyRequest($url);
$postFields = array(;
'user' => $user,
'password' => $password,
'token' => $token
);
$request->setPostFields($postFields)->execute();
Demoとcode as gist:だからあなたのシナリオのため、これらのクラスに基づいていくつかのコードは次のようになります。あなたがした後
class MySchoolService
{
private $url, $user, $pass;
private $isLoggedIn;
public function __construct($url, $user, $pass)
{
$this->url = $url;
...
}
public function getSchedule()
{
$this->ensureLogin();
# your code to obtain the schedule, e.g. in form of an array.
$schedule = ...
return $schedule;
}
private function ensureLogin($reuse = TRUE)
{
if ($reuse && $this->isLoggedIn) return;
# execute the first get request to obtain token
$response = new MyResonse(new MyRequest($this->url));
$token = (string) $response->xpath('//input[@name="token"]/@value');
# execute the second login post request
$request = new MyRequest($this->url);
$postFields = array(;
'user' => $this->user,
'password' => $this->password,
'token' => $token
);
$request->setPostFields($postFields)->execute();
$this->isLoggedIn = TRUE;
}
}
:あなたはこれをさらに改善したい場合は
、次のステップは、あなたがからスケジュールをフェッチするための使用を行う「学校のサービス」のために自分でクラスを作成することです
$school = new MySchoolService('<schoolsite>', '<number>', '<secret>');
$schedule = $school->getSchedule();
あなたの主なスクリプトは、MySchoolService
を使用しています。きれいにあなただけの適切な設定とそれをインスタンス化する必要があり、あなたが簡単にあなたのウェブサイト内で使用することができ、あなたのMySchoolService
クラスに要求/応答ロジックを包みました。
MySchoolService
は、MyRequest
とMyResponse
オブジェクトを使用して処理します。
MyRequest
は、CookieなどでHTTPリクエスト(ここではcUrl)を処理します。
MyResponse
は、HTTP応答の解析に少し役立ちます。
は、標準のインターネットブラウザでこれを比較します
Browser: Handles cookies and sessions, does HTTP requests and parses responses.
MySchoolService: Handles cookies and sessions for your school, does HTTP requests and parses responses.
ですから、今、何をしたいんスクリプト内の学校のブラウザを持っています。より多くのオプションが必要な場合は、簡単に拡張することができます。
これは役に立ちます。出発点は、同じ行のcUrlコードを何度も繰り返し書くのを防ぎ、戻り値を解析するためのより良いインターフェースを提供することでした。 MySchoolService
は、自分のウェブサイト/アプリケーションコードで扱いやすいものになっています。
cUrlは、あなたがコマンドする方法を要求します。あなたのケースでは、明らかにリクエストの正しい設定を行うことができないので、失敗します。とにかく、あなたはcUrlよりもいくつかのブラウザ自動化を探しているかもしれません。 – hakre
究極の目標は私のサイトにスケジュールを表示することです。なぜ私は-1 btwに値するのですか?私はcURLを理解しようとしています。 – SuperSpy
cUrlは非常に良いですが、それはあなたがそれを伝えるだけです。あなたの質問では、単にページを取得するように指示しますが、ログインの仕組みやそのすべては、実際にはcUrlとは関係ありません。書かれているように、あなたはより良いブラウザ自動化を探しているかもしれません。 – hakre