如何抓取任何类型的网站
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
};
}
我正在做抓取网站的工作,我尝试了很多抓取网站的技术。
首先我使用了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
};
}