0

以下を含む単純な Web フォームがlogin.phpあります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 <meta name="robots" content="noindex,nofollow">
  <meta http-equiv="x-dns-prefetch-control" content="off">
</head>
  <form action="action.php" method="post"> 
    <!-- Input: Input box -->
    Name:     <input name="userName" type="text"/>
    <br>
    Password: <input name="userPassword" type="password"/>
    <br>
    <!-- Submit form -->
    <input type="submit"/> <input type="reset"/>
  </form>
</body>
</html>

action.php次に、渡されたデータを処理する非常に単純なファイルがありPOSTます。コードは次のとおりです。

<?php
print_r ($_POST);
?>

これは完全に機能し、ユーザー"foo"とパスワードとしてログインしようとすると、次の"bar"ようになります。

Array ( [userName] => foo [userPassword] => bar ) 

私が欲しいのは、POSTカールを介して直接コンテンツを送信できるようにすることaction.phpです。だから私はscraper.phpコードがここにあるという名前の3番目のファイルを持っています:

<?php

// SLIGHTLY MODIFIED CODE FROM: http://www.phpcodester.com/2011/01/scraping-a-password-protected-website-with-curl/
$ch=login('http://localhost/scraper_post/action.php','userName=foo&userPassword=bar');
$html=downloadUrl('http://localhost/scraper_post/action.php', $ch);
echo $html;

function downloadUrl($Url, $ch){
  curl_setopt($ch, CURLOPT_URL, $Url);
  curl_setopt($ch, CURLOPT_POST, 0);
  curl_setopt($ch, CURLOPT_REFERER, "http://localhost/scraper_post/login.php");
  curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  $output = curl_exec($ch);
  return $output;
}

// ALSO TRIED WITH $postData ON SEPARATE LINES AS IT IS IN ORIGINAL TUTORIAL
function login($url,$postData){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt ($ch, CURLOPT_POST, 1);
  // ALSO TRIED WITH FOLLOWING, AS SUGGESTED IN ORIGINAL TUTORIAL COMMENTS: curl_setopt ($ch, CURLOPT_POSTFIELDS, urlencode($postData));
  curl_setopt ($ch, CURLOPT_POSTFIELDS, $postData);
  curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  $store = curl_exec ($ch);
  return $ch;
}
?>

問題は、呼び出すscraper.phpと、空の$_POST変数がaction.phpファイルに取得されることです。言い換えれば、データscraper.phpは送信されず、その理由はわかりません。この全体は、ログインが必要なページ用のより大きな Web スクレイパーを作成するための始まりに過ぎませんが、ご覧のとおり、私は最初から立ち往生しています。ありがとうございました。POSTaction.php

4

1 に答える 1

0

関数は必要ありませんdownloadUrl()login()関数はすでにログインしてコンテンツを取得しています。で行うreturn $store;login()、サイトからのhtmlになります

コードに対する私の提案:

<?php

$html=login('http://localhost/scrapper_post/action.php','userName=foo&userPassword=bar');
echo $html;

function login($url,$postData){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode($postData));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_REFERER, "http://localhost/scrapper_post/login.php");
    curl_setopt($ch, CURLOPT_USERAGENT, "MozillaXYZ/1.0");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}
?>
于 2013-09-26T15:59:55.973 に答える