如何抓取任何类型的网站

How to scrape any type of website

我正在做抓取网站的工作,我尝试了很多抓取网站的技术。

首先我使用了PHPcURL作为一个抓取工具,并且在一定程度上爬上了抓取网站的位置,但是后来我遇到了一个问题,那就是; PHP cURL 无法抓取使用 Ajax 加载网站 contents/data 的网站。这就是阻止我浏览 PHP.

的原因

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

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

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

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

有没有其他工具像这两个一样强大,我可以通过网页轻松地与他们互动?

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

安装指南请遵循 this 文档。 Phantom JS 在节点 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
  };

}