从需要登录的网站上刮痧?

时间:2011-02-14 20:55:04

标签: php

如果是这样,可以这样做,怎么样?我想从xbox.com抓取数据,但我需要抓取的页面只有在成功登录后才能显示。

6 个答案:

答案 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。你需要做的就是:

  • 发送登录请求
  • 从对上述请求的响应的HTTP标头中提取Cookie数据
  • 在后续请求中设置此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);