2009-10-29 13 views
8

Poszukuję biblioteki PHP, która pozwala mi pozbywać się stron internetowych i dba o wszystkie pliki cookie i wstępnie wypełnia formularze wartościami domyślnymi, co najbardziej mnie denerwuje.Skrobanie biblioteki dla PHP - phpQuery?

Jestem zmęczony tym, że muszę dopasować każdy element wejściowy do ścieżki xpath i chciałbym, żeby było coś lepszego. Natknąłem się na phpQuery, ale instrukcja nie jest zbyt jasna i nie mogę się dowiedzieć, jak tworzyć żądania POST.

Czy ktoś może mi pomóc? Dzięki.

@Jonathan Fingland:

W przykładzie dostarczonych przez podręcznika browserGet() mamy:

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; 
} 

Przypuszczam wszystkie pozostałe pola są złomowane i odesłać w żądaniu GET , Chcę zrobić to samo z metodą phpQuery :: browserPost(), ale nie wiem jak to zrobić. Formularz, który próbuję skrobać, ma token wejściowy i bardzo bym chciał, gdyby phpQuery był wystarczająco inteligentny, aby zeskrobać token i po prostu pozwolić mi zmienić inne pola (w tym przypadku nazwę użytkownika i hasło), przesyłając wszystko za pośrednictwem POST.

PS: Bądź pewny, to nie będzie używany do spamowania.

+2

+1 Nie masz odpowiedzi, ale oczekuję innych komentarzy – Andrew

+0

Jeśli instrukcja nie jest jasna, możesz spróbować odczytać kod źródłowy –

+1

W dzisiejszych czasach życie jest dość trudne dla spammerów. –

Odpowiedz

2

http://code.google.com/p/phpquery/wiki/Ajax patrz w szczególności:

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

i

# data Object, String który określa parametry transmisji danych, albo za przedmiot lub ciąg znaków. POST żąda powinny być możliwe przy użyciu formatu ciąg kwerendy, np

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

jak phpQuery jest port jQuery podpis metoda jest taka sama (docs odwołują się bezpośrednio do serwisu jQuery - http://docs.jquery.com/Ajax/jQuery.post)

Edit

dwie rzeczy:

Istnieje również phpQuery::browserPost funkcji, które mogą spełniać swoją n lepiej.

Należy jednak pamiętać, że callback success2 jest wywoływany tylko metodami submit() or click(), dzięki czemu można wypełnić wszystkie pola formularza przed tym.

np.

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; 
} 

(Zauważ, że ten nie został przetestowany, ale powinny pracy)

+0

Sprawdź moją aktualizację. –

0

Chciałbym użyć dedykowanej biblioteki do analizy plików HTML i dedykowanej biblioteki do przetwarzania żądań HTTP. Używanie tej samej biblioteki dla obu wydaje się złym pomysłem, IMO.

Do przetwarzania żądań HTTP, sprawdź np. Httpful, Unirest, Requests lub Guzzle. Guzzle jest szczególnie popularny w dzisiejszych czasach, ale ostatecznie, niezależnie od tego, która biblioteka działa najlepiej, pozostaje kwestią osobistego gustu.

Do parsowania plików HTML polecam bibliotekę, którą sam napisałem: DOM-Query. Pozwala to (1) załadować plik HTML, a następnie (2) wybrać lub zmienić części kodu HTML w taki sam sposób, jak w przypadku korzystania z jQuery w aplikacji frontendowej.