Когда вы создаете скребок, вы можете создавать свои собственные классы, чтобы работать над тем, что вам нужно сделать в вашем домене.Вы можете начать с создания собственного набора классов запросов и ответов, которые имеют дело с тем, с чем вам нужно иметь дело.
Создание собственного класса запросов позволит вам реализовать запрос curl так, как вам нужно.Создавая свой собственный класс ответа, вы можете помочь вам получить доступ к синтаксическому анализу возвращенного 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";
}
Это будетвернуть мои сообщения в блогах:
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 и код в виде 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;
}
}
После того, как вы красиво завершили запрос /Логика ответа в ваш класс MySchoolService
. Вам нужно только создать его экземпляр с правильной конфигурацией, и вы можете легко использовать его на своем веб-сайте:
$school = new MySchoolService('<schoolsite>', '<number>', '<secret>');
$schedule = $school->getSchedule();
Ваш основной сценарий использует только MySchoolService
.
MySchoolService
заботится об использовании объектов MyRequest
и MyResponse
.
MyRequest
заботится о выполнении HTTP-запросов (в данном случае cUrl) с файлами cookie и тому подобным.
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
- это сахар, который облегчает работу с вашим собственным сайтом / кодом приложения.