如果是这样,可以这样做,怎么样?我想从xbox.com抓取数据,但我需要抓取的页面只有在成功登录后才能显示。
答案 0 :(得分:9)
大多数登录表单都会设置一个cookie。因此,您应该使用像Zend_Http这样的HTTP类,它可以存储它们以用于进一步的请求。它可能很简单:
$client = new Zend_Http_Client();
$client->setCookieJar(); // this is the crucial part for "logging in"
// make login request
$client->setUri("http://xbox.com/login");
$client->setParameterPost("login", "hackz0r");
$result = $client->request('POST');
// go scraping
...
答案 1 :(得分:2)
如果您有一个支持cookie的Web抓取类,它可以在理论上完成。如果您提供cookie信息作为请求的一部分,PEAR的PHP HTTP_Request2
可能会发送cookie。你需要做的就是:
请注意,许多网站都会采用不同程度复杂程度的防刮技术,并且可能会使这一点变得更加困难。它也可能是非法的,不道德的或违反网站用户协议。
答案 2 :(得分:2)
您必须通过发送带有CURL请求的POST数据来完成所需的登录事务。也就是说,从登录后面抓取数据是一个坏主意 - 该网站没有将这些信息公之于众,并且您这样做可能构成侵犯版权,
答案 3 :(得分:0)
有几种方法可以自动登录,有些方法比其他方式更复杂。 xbox.com可能使用Windows Live API,因此您必须查看文档。
答案 4 :(得分:0)
PHP库PGBrowser可以很容易地完成这项工作。以下是取自companion blog的演示代码段。我相信这不适用于XBox网站,因为Microsoft现在使用SSO,但仍然适用于登录表单后面有内容的其他网站。
require 'pgbrowser.php';
$b = new PGBrowser();
$b->useCache = true;
$page = $b->get('http://yoursite.com/login'); // Retrieve login web page
$form = $page->forms(1); // Retrieve form
// Note the form field names have to be specified
$form->set('username', "your_username_or_email");
$form->set('password', "your_password");
$page = $form->submit(); // Submit form
echo $page->html; // This shows the web page normally displayed after successful login, e.g. dashboard
答案 5 :(得分:0)
//initial request with login data
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/login.php');
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=XXXXX&password=XXXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name'); //could be empty, but cause problems on some hosts
curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/ip4.x/file/tmp'); //could be empty, but cause problems on some hosts
$answer = curl_exec($ch);
if (curl_error($ch)) {
echo curl_error($ch);
}
//another request preserving the session
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/list');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);
if (curl_error($ch)) {
echo curl_error($ch);
}
curl_close ($ch);