0

我已经分配了一个任务来从受密码保护的站点中抓取数据,我是通过 CURL 完成的,但现在我想在 CURL 返回的 html 中获取链接,然后转到该链接并从那里获取数据。我通过了CURLintofile_get_contents()但没有工作的响应。这是我的CURL代码。

$ckfile = tempnam("/tmp", "CURLCOOKIE");
$useragent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML,    like Gecko) Chrome/5.0.342.3 Safari/533.2';

$username = "XXXXXX";
$password = "XXXXXX";


$f = fopen('log.txt', 'w'); // file to write request header for debug purpose


$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);

 $html = curl_exec($ch);

 curl_close($ch);

preg_match('~<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.*?)" />~', $html, $viewstate);
preg_match('~<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"   value="(.*?)" />~', $html, $eventValidation);

$viewstate = $viewstate[1];
$eventValidation = $eventValidation[1];




$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_STDERR, $f);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);

// Collecting all POST fields
$postfields = array();
$postfields['__EVENTTARGET'] = "";
$postfields['__EVENTARGUMENT'] = "";
$postfields['__VIEWSTATE'] = $viewstate;
$postfields['__EVENTVALIDATION'] = $eventValidation;
$postfields['ctl00$LoginPopup1$Login1$UserName'] = $username;
$postfields['ctl00$LoginPopup1$Login1$Password'] = $password;
$postfields['ctl00$LoginPopup1$Login1$LoginButton'] = 'Log In';

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$ret = curl_exec($ch); // Get result after login page.

这是简单的html dom代码

$html = file_get_contents($ret);

这是我得到的错误

Warning: file_get_contents(1): failed to open stream: No such file or directory

任何其他建议如何做到这一点将不胜感激。谢谢

4

2 回答 2

0

就像 MajorCaiger 所说,您需要设置CURLOPT_RETURNTRANSFER为 true,然后使用以下命令加载str_get_html

$html = curl_exec($ch);
$doc = str_get_html($html);

即便如此,我认为你在这方面成功的机会不大,那些 asp 形式非常棘手。

于 2013-08-02T06:44:46.063 回答
0

如果您想要将请求发送到的页面的 HTML 输出,请尝试设置CURLOPT_RETURNTRANSFERtrue,然后$ret在 CURL 输出后应该包含页面的 HTML。

我不会DOMDocument用来解析响应,因为页面中的 HTML 格式可能不正确并且DOMDocument会抱怨。

如果您只是在寻找可以preg_match_all在 HTML 上使用的链接。

于 2013-08-01T12:01:40.457 回答