javascript - 如何实现网站的cookies scraper?

标签 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 对象的函数原型(prototype)(我的意思是制作类似: this )来检查所有客户端加载的 cookie 是否有意义?
我需要它在任何页面上工作,即使是那些不使用 native XMLHttpRequest 对象的页面。对此有什么建议吗?

最佳答案

浏览器只是向服务器发送 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 的 headless 浏览器,我会推荐像 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 - 如何实现网站的cookies scraper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367965/

相关文章:

php - 拉拉维尔。 setRelation(s) - 仅添加最后一个关系

c# - 为 Node.js 应用程序创建 COM API 或类似的 API

javascript - 简单问题 : Do I need to specify width, "image"预加载图片时的高度?

javascript - 如何在 jQM listview 的 <h1> 标签中显示长文本?

javascript - 如何仅在 "complete"完全完成后调用 jQuery 的 "success"(并保持长轮询)?

php - 这是什么错误? "Database query failed: Data truncated for column ' column_name' 在第 1 行

php - Mysql 查询 SELECT DISTINCT 月/年

javascript - Google API,从数据表中获取值(value)

ruby-on-rails - Webpacker 需要 Node.js >= v6.4 并且您正在使用 v5.4.0

javascript - 升级后Node.js hapi错误: TypeError: Uncaught error: Object [object Object] has no method 'reply'