如何实施网站的cookie刮刀?

时间:2016-02-12 16:48:10

标签: javascript php node.js cookies web-scraping

我需要创建一个脚本来发出HTTP请求并模拟浏览器在cookie管理方面的行为。这意味着它可以访问该页面设置的所有Cookie。 (所以服务器设置的cookie,异步客户端设置的cookie,每个域的cookie。)

我的意思是,使用控制台检查页面,我可以看到该页面上所有域的所有cookie。

enter image description here

我正在想办法从我的代码中做到这一点。 我几乎肯定我必须以某种方式运行页面的javascript并模拟DOM行为(想在node.js脚本中使用jsDom)。

但是,但是。还有很多疑点。有关如何通过模拟浏览器行为拦截所有cookie的任何建议?

关于如何实施它的任何建议都将非常感激。

有时间的人
我对如何实现它有一个奇怪的想法: 是否有意义重载处理HTTP响应的xhr对象的函数原型(我的意思是制作类似:this),以检查所有客户端加载的cookie?
我需要它在任何页面上工作,甚至是那些不使用原生XMLHttpRequest对象的页面。对此有何建议?

2 个答案:

答案 0 :(得分:1)

浏览器只是向服务器发送HTTP请求,您不一定需要加载DOM。如果您可以对要发送的请求进行反向工程,则可以轻松模拟网页或工作流的行为。当您从PHP发送带有cURL的请求时,您需要将cookie存储在cookie jar中以维护跨请求的cookie。这样的事情应该让你开始:

[alias]
  # git cob <branch>
  cob = "!f() { git checkout $(git show-ref --verify --quiet refs/heads/\"$1\" || echo '-b') \"$1\"; }; f"

如果你想运行一个在cookie jar中维护cookie的无头浏览器,我会推荐像PhantomJS这样的东西。然后,您可以在页面的上下文中加载页面并执行代码:

function load($url, $postData = array())
{
    $useragent = "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36";

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_HEADER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_ENCODING, 'UTF-8');
    curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
    curl_setopt($curl, CURLOPT_POST, !empty($postData));
    if(!empty($postData)) curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieFile);
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookieFile);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
    $page = curl_exec ($curl);
    curl_close ($curl);

    return $page;
}

代码可以在Github上找到:https://github.com/ariya/phantomjs/blob/master/examples/phantomwebintro.js

答案 1 :(得分:0)

经过一些研究,我得出了这些结论:

Cookie由服务器设置,将响应的标头设置为客户端的请求,以及客户端上的javascript。 服务器设置的Cookie在设置时很容易被检测到。但是客户端cookie不容易被检测到,因为你必须模仿dom并执行页面的javascript。 因此,如果要检查设置到网站中的所有cookie,唯一的方法是运行javascript并模拟DOM,然后检查发送的每个异步请求。

我建议你使用phantom.js或只是使用Chrome远程调试协议(只需获取谷歌浏览器的cookie,导航就像你真实的用户一样)