Scraping Library для PHP - phpQuery? - PullRequest
       11

Scraping Library для PHP - phpQuery?

8 голосов
/ 29 октября 2009

Я ищу библиотеку PHP, которая позволяет мне просматривать веб-страницы и заботится обо всех файлах cookie и предварительно заполняет формы значениями по умолчанию. Это меня больше всего раздражает.

Я устал от необходимости сопоставлять каждый элемент ввода с xpath, и я был бы рад, если бы существовало что-то лучшее. Я сталкивался с phpQuery , но руководство не очень ясно, и я не могу узнать, как сделать запросы POST.

Может ли кто-нибудь мне помочь? Спасибо.

@ Джонатан Фингланд:

В примере, приведенном в руководстве для browserGet (), мы имеем:

require_once('phpQuery/phpQuery.php');

phpQuery::browserGet('http://google.com/', 'success1');

function success1($browser)
{
    $browser->WebBrowser('success2')
    ->find('input[name=q]')->val('search phrase')
    ->parents('form')
    ->submit();
}

function success2($browser)
{
    echo $browser;
}

Полагаю, что все остальные поля отбрасываются и отправляются обратно в запросе GET, я хочу сделать то же самое с методом phpQuery :: browserPost (), но я не знаю, как это сделать. Форма, которую я пытаюсь очистить, имеет входной токен, и я хотел бы, чтобы phpQuery был достаточно умен, чтобы очистить токен и просто позволил мне изменить другие поля (в данном случае имя пользователя и пароль), отправляя через POST все.

PS : будьте уверены, это не будет использоваться для рассылки спама.

Ответы [ 3 ]

2 голосов
/ 29 октября 2009

См. http://code.google.com/p/phpquery/wiki/Ajax и, в частности:

phpQuery::post($url, $data, $callback, $type)

и

# data Object, String, который определяет параметр данных как объект или строку. POST-запросы должны быть возможными с использованием формата строки запроса, например ::

$data = "username=Jon&password=123456";
$url = "http://www.mysite.com/login.php";
phpQuery::post($url, $data, $callback, $type)

, поскольку phpQuery является портом jQuery, сигнатура метода такая же (ссылка на документ непосредственно на сайт jquery - http://docs.jquery.com/Ajax/jQuery.post)

Редактировать

Две вещи:

Существует также функция phpQuery::browserPost, которая может удовлетворить ваши потребности лучше.

Однако обратите внимание, что обратный вызов success2 вызывается только для методов submit() или click(), поэтому вы можете заполнить все поля формы до этого.

* 1 035 *, например
require_once('phpQuery/phpQuery.php');
phpQuery::browserGet('http://www.mysite.com/login.php', 'success1');
function success1($browser) {
  $handle = $browser
    ->WebBrowser('success2');
  $handle 
    ->find('input[name=username]')
      ->val('Jon');
  $handle 
    ->find('input[name=password]')
      ->val('123456');
      ->parents('form')
        ->submit();
}
function success2($browser) {
  print $browser;
}

(обратите внимание, что это не было проверено, но должно работать)

0 голосов
/ 14 января 2016

Я бы использовал выделенную библиотеку для разбора HTML-файлов и выделенную библиотеку для обработки HTTP-запросов. Использование одной и той же библиотеки для обоих кажется плохой идеей, ИМО.

Для обработки HTTP-запросов, проверьте, например. Httpful, Unirest, Requests или Guzzle. Жадность особенно популярна в наши дни, но, в конце концов, какая библиотека вам подойдет, все равно остается вопросом личного вкуса.

Для разбора HTML-файлов я бы порекомендовал библиотеку, которую я написал сам: DOM-Query. Он позволяет вам (1) загрузить файл HTML, а затем (2) выбрать или изменить части вашего HTML почти так же, как вы это сделали бы, если бы вы использовали jQuery в приложении внешнего интерфейса.

...