【问题标题】:How to scrape any type of website如何抓取任何类型的网站
【发布时间】:2019-01-11 23:10:59
【问题描述】:

我正在研究抓取网站,我尝试了许多技术来抓取网站。

首先我使用PHP cURL作为抓取工具,并在一定程度上爬上了网站,但后来我遇到了一个问题,那就是; PHP cURL 无法抓取使用 Ajax 加载网站内容/数据的网站。这就是阻止我使用 PHP 的原因。

经过体面的研究,我找到了另一种抓取网站的解决方案,它超越了 Ajax 加载的网站等的限制,并且非常强大且使用起来很酷,它们确实是 Phantom JS 和 Casper JS。我已经用它抓取了很多网站。

我遇到这些工具的问题是,这些工具通过命令行界面工作/控制,例如当你想运行 Phantom/Casper JS 代码时,你需要通过命令行运行它。这是我的基本问题。我需要的是,用 Phantom/Casper JS 编写代码,并且我想要一个带有管理面板的网页,我可以在其中控制这些脚本。目前我正在抓取职业/职位列表网站,并且我想自动化这些工具,以便在给定时间后自动抓取这些网站,以便与发布新工作的雇主网站保持同步。

例如,我有每个网站的代码,我通过命令行手动执行每个文件,然后等待它完成抓取,然后我继续第二个,依此类推。我想要的是,我用 JavaScript 编写一个脚本(最好用 Node JS - 但不是强制性的),它将在特定实例之后执行抓取代码,然后开始在后台抓取所有网站。

我可以做自动化,这不是问题,但问题是,我无法将 Phantom/Casper JS 与网站连接,即使我尝试了将 Phantom/Casper JS 与 Node JS 连接的Spooky JS,但是不幸的是,它对我不起作用,而且非常混乱。

还有没有像这两个一样强大的工具,我可以通过网页轻松地与它们交互?

【问题讨论】:

    标签: web-scraping phantomjs casperjs php-curl


    【解决方案1】:

    继续我自己对报废网站的研究,我找不到任何完美的解决方案。但我想出的强大解决方案是将 Phantom JS 模块与 Node JS 一起使用。你可以找到这个模块here

    有关安装指南,请遵循this 文档。 Phantom JS 在 node JS 中异步使用,然后它更容易获得结果,并且非常容易与之交互,在服务器端表达 JS,在客户端表达 Ajax 或 Socket.io 以增强功能。

    下面是我想出的代码:

    const phantom = require('phantom');
    const ev = require('events');
    const event = new ev.EventEmitter();
    
    var MAIN_URL,
      TOTAL_PAGES,
      TOTAL_JOBS,
      PAGE_DATA_COUNTER = 0,
      PAGE_COUNTER = 0,
      PAGE_JOBS_DETAILS = [],
      IND_JOB_DETAILS = [],
      JOB_NUMBER = 1,
      CURRENT_PAGE = 1,
      PAGE_WEIGHT_TIME,
      CLICK_NEXT_TIME,
      CURRENT_WEBSITE,
      CURR_WEBSITE_LINK,
      CURR_WEBSITE_NAME,
      CURR_WEBSITE_INDEX,
      PH_INSTANCE,
      PH_PAGE;
    
    function InitScrap() {
    
    
      // Initiate the Data  
      this.init = async function(url) {
        MAIN_URL = url;
        PH_INSTANCE = await phantom.create(),
          PH_PAGE = await PH_INSTANCE.createPage();
        console.log("Scrapper Initiated, Please wait...")
        return "success";
      }
    
      // Load the Basic Page First      
      this.loadPage = async function(pageLoadWait) {
    
        var status = await PH_PAGE.open(MAIN_URL),
          w;
    
        if (status == "success") {
          console.log("Page Loaded . . .");
          if (pageLoadWait !== undefined && pageLoadWait !== null && pageLoadWait !== false) {
            let p = new Promise(function(res, rej) {
              setTimeout(async function() {
                console.log("Page After 5 Seconds");
                PH_PAGE.render("new.png");
                TOTAL_PAGES = await PH_PAGE.evaluate(function() {
                  return document.getElementsByClassName("flatten pagination useIconFonts")[0].textContent.match(/\d+/g)[1];
                });
                TOTAL_JOBS = await PH_PAGE.evaluate(function() {
                  return document.getElementsByClassName("jobCount")[0].textContent.match(/\d+/g)[0];
                });
                res({
                  p: TOTAL_PAGES,
                  j: TOTAL_JOBS,
                  s: true
                });
              }, pageLoadWait);
            })
            return await p;
          }
        }
    
      }
    
      function ScrapData(opts) {
    
        var scrap = new InitScrap();
    
        scrap.init("https://www.google.com/").then(function(init_res) {
          if (init_res == "success") {
            scrap.loadPage(opts.pageLoadWait).then(function(load_res) {
              console.log(load_res);
              if (load_res.s === true) {
                scrap.evaluatePage().then(function(ev_page_res) {
                  console.log("Page Title : " + ev_page_res);
                  scrap.evaluateJobsDetails().then(function(ev_jobs_res) {
                    console.log(ev_jobs_res);
                  })
                })
              }
              return
            })
          }
        });
    
        return scrap;
      }
    
      module.exports = {
        ScrapData
      };
    
    }

    【讨论】:

      猜你喜欢
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多