【问题标题】:How to implement a website's cookies scraper?如何实现网站的 cookie 刮板?
【发布时间】:2016-05-23 22:03:49
【问题描述】:

当涉及到 cookie 管理时,我需要创建一个发出 HTTP 请求并模拟浏览器行为的脚本。这意味着它可以访问该“页面”设置的所有 cookie(因此服务器设置的 cookie、异步客户端设置的 cookie、每个域的 cookie。)

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

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

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

任何有关如何实施它的建议将不胜感激。

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

【问题讨论】:

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


    【解决方案1】:

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

    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;
    }
    

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

    "use strict";
    var page = require('webpage').create();
    
    page.onConsoleMessage = function(msg) {
        console.log(msg);
    };
    
    page.open("http://phantomjs.org/", function(status) {
        if (status === "success") {
            page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
                page.evaluate(function() {
                    console.log("$(\".explanation\").text() -> " + $(".explanation").text());
                });
                phantom.exit(0);
            });
        } else {
          phantom.exit(1);
        }
    });
    

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

    【讨论】:

    • 但是javascript也可以设置cookie,不是吗?在这种情况下,我需要模拟 DOM 行为
    • 是的,JavaScript 可以设置 cookie。但是,您可以对设置了哪些 cookie 进行逆向工程,并根据请求手动设置它们。我只是指出,为抓取而构建类似浏览器的环境可能会很昂贵,而且可扩展性也不强。
    • 老实说,我不需要它是可扩展的,而是精确的。关于如何实施您的解决方案的任何建议? (逆向工程cookie设置)
    【解决方案2】:

    经过一番研究,我得出以下结论:

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

    我建议您使用 phantom.js 或仅使用 Chrome 远程调试协议(只需获取 google chrome 的 cookie,就像您是真实用户一样导航)

    【讨论】:

      猜你喜欢
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多