Javascript 使用NodeJs解析网站

Javascript 使用NodeJs解析网站,javascript,node.js,web-scraping,Javascript,Node.js,Web Scraping,我试图解析网站dl-protect,并给出这种类型的url:例如,输出将直接是uptobox链接 我试图通过chrome开发控制台了解这项服务是如何工作的 首先,有两种情况需要考虑: 您不需要输入验证码,只需单击“继续”按钮。然后NodeJs程序应该返回在第二页上找到的URL(这里是uptobox) 您需要输入验证码。在这种情况下,NodeJs程序应该返回验证码的URL 到目前为止,以下是我的代码(用ES6编写): 当我查看chrome开发面板(网络选项卡+保留日志)时,只要单击“继续”按钮

我试图解析网站dl-protect,并给出这种类型的url:例如,输出将直接是uptobox链接

我试图通过chrome开发控制台了解这项服务是如何工作的

首先,有两种情况需要考虑:

  • 您不需要输入验证码,只需单击“继续”按钮。然后NodeJs程序应该返回在第二页上找到的URL(这里是uptobox)

  • 您需要输入验证码。在这种情况下,NodeJs程序应该返回验证码的URL

到目前为止,以下是我的代码(用ES6编写):

当我查看chrome开发面板(网络选项卡+保留日志)时,只要单击“继续”按钮,它就会显示以下内容:

我真的认为传递“key”、“I”和“submitform”就足够了,但事实并非如此。它只是返回到第一页,而不是返回到带有URL的第二页

任何关于如何获取uptobox链接(在本例中)作为输出的线索都非常好


谢谢

大多数网站都会试图保护自己不被人刮掉他们的网站——他们的理由是谨慎的,原因是他们自己的——然而,保护网站的典型方法是使用cookie和隐藏字段等,每一个都有签名和时间戳和过期,甚至可能在后端验证为单次使用

这个网站专门做的是任何人的猜测,也是他们内部安全工程的一部分


因此,对于像您尝试做的那样简单的爬行,您可能运气不佳,您需要一个完整的浏览器来完成这项工作——幸运的是(对您而言)有一些无头浏览器,如PhantomJs,可能会有所帮助。

大多数网站都会试图保护自己不被人刮到他们的网站——他们的理由是谨慎的,原因是他们自己的——然而保护网站的典型方法是使用cookie和隐藏字段等,其中每一个都被签名、时间戳、过期,甚至可能在后端被验证为一次性使用

这个网站专门做的是任何人的猜测,也是他们内部安全工程的一部分


因此,你可能不太可能像你正在尝试做的那样进行简单的爬行,你需要一个完整的浏览器来完成这项工作——幸运的是(对你来说)有一些无头浏览器,如PhantomJs,可能会有所帮助。

那么,实际的问题是什么?问题是,你知道我为什么不能访问我想要的页面吗。也许我不清楚,让我解释一下:)有两页。打开链接,您将看到第一个链接(使用“继续”按钮),如果单击该链接,将看到第二个页面,其中包含受保护的链接。在我的代码中,我尝试模拟这种情况。因此,基本上我想了解为什么我无法获得uptobox链接作为输出?请看一看类似的刮库或无头浏览器框架。@DanielB Osmission似乎很酷,我一定会尝试一下。正如我对索伦所说的,我想在第一时间避免幻影,如果我无法避免,我会走这条路。如果有人同时提出了一个想法,我很高兴听到,因为来吧。。。如果浏览器能做到这一点,我们也能做到:)根据我们的说法,浏览器不会在您下载的页面上执行JavaScript,因此如果Web服务器需要ajax调用作为验证的一部分,它可能会失败。“如果浏览器能做到这一点,我们也能做到”——是的,这就是PhantomJS被开发的原因,不知道你为什么不想使用它。那么,实际的问题是什么?问题是,你知道我为什么不能访问我想要的页面吗。也许我不清楚,让我解释一下:)有两页。打开链接,您将看到第一个链接(使用“继续”按钮),如果单击该链接,将看到第二个页面,其中包含受保护的链接。在我的代码中,我尝试模拟这种情况。因此,基本上我想了解为什么我无法获得uptobox链接作为输出?请看一看类似的刮库或无头浏览器框架。@DanielB Osmission似乎很酷,我一定会尝试一下。正如我对索伦所说的,我想在第一时间避免幻影,如果我无法避免,我会走这条路。如果有人同时提出了一个想法,我很高兴听到,因为来吧。。。如果浏览器能做到这一点,我们也能做到:)根据我们的说法,浏览器不会在您下载的页面上执行JavaScript,因此如果Web服务器需要ajax调用作为验证的一部分,它可能会失败。“如果浏览器能做到这一点,我们也能做到”——是的,这就是PhantomJS被开发出来的原因,不知道你为什么不想使用它。这是我的第一种方法,但它更复杂、更慢。另外,与Node after的集成有点困难。。。我以为我会找到办法,但不幸的是我没有找到。我肯定这里少了些什么。很明显。我感觉很近(也许我离它很远…),我想继续走这条路。如果几天后我仍然找不到关于这个的任何东西,我会选择浏览器方式。这是我的第一个方法,但它更复杂、更慢。另外,与Node after的集成有点困难。。。我以为我会找到办法,但不幸的是我没有找到。我肯定这里少了些什么。很明显。我感觉很近(也许我离它很远…),我想继续走这条路。如果几天后我仍然找不到关于这个的任何东西,我会选择浏览器的方式。
import request from 'request';
import cheerio from 'cheerio';

// try to respect the header has if it were coming from a browser
let options = {
  url: 'http://www.dl-protect.com/F469D615',
  headers: {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'fr,en-US;q=0.8,en;q=0.6,fr-FR;q=0.4',
    'Cache-Control': 'max-age=0', 
    'Connection': 'keep-alive', 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Host': 'www.dl-protect.com', 
    'Origin': 'http://www.dl-protect.com', 
    'Referer': 'http://www.dl-protect.com/F469D615', 
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36'
  }
};

request.get(options, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        // parse the body response with cheerio
        let $ = cheerio.load(body);

        // detect if a captcha is required
        let isCaptcha = !!$('#captcha').length;

        // url of the captcha if needed
        let captchaUrl = '';

        // display wether we need captcha or not
        switch (isCaptcha) {
            case true:
                captchaUrl = $('#captcha').attr('src');
                console.log(`Captcha required, URL : ${captchaUrl}`);
                break;
            case false:
                console.log('No captcha required');
                break;
        }

        // get the key
        let formKey = $('form[name="ccerure"] input[name="key"]').attr('value');
        console.log(`key : ${formKey}`);

        // set the form as it's computed no need to get it
        // this param is just data about the browser so I ended up copying it once it was generated
        let formIn = [
            '_UETCF0UJREfkVmbpZWZk5Wd7QXYtJ3bGBCduVWb1N2bEBSZsJWY0J3bQtj',
            'cldXZpZXLmRGctwWYuJXZ05Wa7IXZ3VWaWBiREBFItVXat9mcoNkJkVmbpZ',
            'WZk5Wd74CduVGdu92Yg8WZklmdv8WakVXYgwUTUhEIm9GIrNWYilXYsBHIy',
            '9mZgMXZz5WZjlGbgUmbpZXZkl2VgMXZsJWYuV0OvNnLyVGdwFGZh1GZjVmb',
            'pZXZkl2dilGb7UGb1R2bNBibvlGdwlncjVGRgQnblRnbvNEIl5Wa2VGZpdl',
            'JkVmbpZWZk5Wd7sTahpGall2ZmV2bo9mZvp2blFGciJmamN2Zk1mYmpGatt',
            'jcldXZpZFIGREUg0Wdp12byh2Q8ZzMuczM18SayFmZhNFI4ATMuMjM2IjLw',
            '4SO08SZt9mcoNEI4ATMuMjM2IjLw4SO08Sb1lWbvJHaDBSd05WdiVFIp82a',
            'jV2RgU2apxGIswUTUh0SoAiNz4yNzUzL0l2SiV2VlxGcwFEIpQjNfZDO4BC',
            'e15WaMByOxEDWoACMuUzLhxGbpp3bNxHNygHN0YDewMTN=='
        ].join('');

        // if no captcha
        if (!isCaptcha) {
            // override the initial options by adding the necessary form data
            options = Object.assign({}, options, {form: {key: formKey, i: formIn, submitform: 'Continuer'}});

            // reach the same page with a post containing the following data : key, i and submitform
            request.post(options, function (error, response, body) {
                console.log(body);
                // console.log(response);
                // console.log(error);
            });
        }
    }
});