如何抓取任何类型的网站

时间:2018-08-04 06:27:22

标签: web-scraping phantomjs casperjs php-curl

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

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

经过认真的研究,我发现了另一种刮除网站的解决方案,该解决方案超出了Ajax加载的网站等的限制,并且功能强大且易于使用,它们确实是Phantom JS和Casper JS。我用它刮了很多网站。

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

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

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

还有其他像这两个工具一样强大的工具,并且我可以通过网页轻松地与它们进行交互吗?

1 个答案:

答案 0 :(得分:0)

继续我自己的报废站点研究,我找不到完美的解决方案。但是我想到的强大解决方案是将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
  };

}