通过 phantomjs 和 casperjs 将抓取的数据保存到 mysql 数据库
Saving scraped data to mysql database through phantomjs and casperjs
你好,我正在开发网络抓取工具,首先我尝试使用 php CURL
进行抓取,但后来我遇到了一个问题,我无法抓取加载的网站通过 AJAX
然后我转向 'phantom JS' 和 'casper JS`.
现在我已经成功安装了 webkit 并且可以从任何网站抓取数据,但是我无法将数据保存在数据库中以供长期使用。很简单,以备后用。我想做的是,无论我抓取了什么数据,我都想将其保存到 mySql 数据库。
有什么方法可以实现这样的功能吗?我尝试发送 Ajax
请求将数据发送到数据库但失败了。
例如,我想到了另一种解决方案,即当我从指定网站抓取数据时,我将数据推送到一个名为 data[]
的数组,然后将该数据写入 .json
文件。每组数据都以对象数组的形式保存,这是从 JSON.stringify(data)
.
中获取的
现在,我不知道如何获取该文件数据并将其保存在数据库中?有没有可能,每当抓取完成后,我就从那个 .json
文件中获取数据并将其保存到数据库中。
暂时以这段代码为例
var casper = require('casper').create();
var file = require('fs');
var data = [];
casper.start('http://casperjs.org/', function() {
data.push(this.getTitle());
file.write("file.json", JSON.stringify(data), "a");
});
casper.run();
概念验证,使用 jq :
#!/bin/bash
casperjs script.js
[[ -s file.json ]] || exit 1
jq '"UPDATE ROW SET XXX = "+ .[] + " WHERE FOO=BAR;"' file.json | mysql -D DB_name
file.json :
[
"foo",
"bar",
"base"
]
jq 输出:
jq -r '"UPDATE ROW SET XXX = "+ .[] + " WHERE FOO=BAR;"' file.json
UPDATE ROW SET XXX = foo WHERE FOO=BAR;
UPDATE ROW SET XXX = bar WHERE FOO=BAR;
UPDATE ROW SET XXX = base WHERE FOO=BAR;
我找到的简单解决方案是在求值函数内向服务器发出 ajax 请求:
casper.then(function() {
details = this.evaluate(function() {
var elDet = document.getElementsByClassName("job-description-column")[0];
var detLen = elDet.children[2].children[0].children.length;
var details = elDet.children[2].children[0].children;
var linkedData = [];
for (var i = 0; i < detLen; i++) {
if (details[i].nodeName == "H3" && details[i].id != "if-this-sounds-like-you,-apply") {
linkedData.push({
head: details[i].textContent,
description: details[i + 1].textContent,
title: elDet.children[0].children[0].children[0].textContent,
loc: elDet.children[0].children[0].children[1].textContent,
date: elDet.children[0].children[0].children[2].textContent
})
i++;
} else {
linkedData.push({
head: "No Head",
description: details[i].textContent,
title: elDet.children[0].children[0].children[0].textContent,
loc: elDet.children[0].children[0].children[1].textContent,
date: elDet.children[0].children[0].children[2].textContent
})
}
}
var s = JSON.stringify(linkedData);
console.log(linkedData);
$.ajax({
method: "POST",
url: "http://localhost/fiverr/Crawl%20The%20Jobs/modal_scripts.php",
data: "add_jobdets=true&job_details=" + s,
async: false
})
return linkedData;
})
})
你好,我正在开发网络抓取工具,首先我尝试使用 php CURL
进行抓取,但后来我遇到了一个问题,我无法抓取加载的网站通过 AJAX
然后我转向 'phantom JS' 和 'casper JS`.
现在我已经成功安装了 webkit 并且可以从任何网站抓取数据,但是我无法将数据保存在数据库中以供长期使用。很简单,以备后用。我想做的是,无论我抓取了什么数据,我都想将其保存到 mySql 数据库。
有什么方法可以实现这样的功能吗?我尝试发送 Ajax
请求将数据发送到数据库但失败了。
例如,我想到了另一种解决方案,即当我从指定网站抓取数据时,我将数据推送到一个名为 data[]
的数组,然后将该数据写入 .json
文件。每组数据都以对象数组的形式保存,这是从 JSON.stringify(data)
.
现在,我不知道如何获取该文件数据并将其保存在数据库中?有没有可能,每当抓取完成后,我就从那个 .json
文件中获取数据并将其保存到数据库中。
暂时以这段代码为例
var casper = require('casper').create();
var file = require('fs');
var data = [];
casper.start('http://casperjs.org/', function() {
data.push(this.getTitle());
file.write("file.json", JSON.stringify(data), "a");
});
casper.run();
概念验证,使用 jq :
#!/bin/bash
casperjs script.js
[[ -s file.json ]] || exit 1
jq '"UPDATE ROW SET XXX = "+ .[] + " WHERE FOO=BAR;"' file.json | mysql -D DB_name
file.json :
[
"foo",
"bar",
"base"
]
jq 输出:
jq -r '"UPDATE ROW SET XXX = "+ .[] + " WHERE FOO=BAR;"' file.json
UPDATE ROW SET XXX = foo WHERE FOO=BAR;
UPDATE ROW SET XXX = bar WHERE FOO=BAR;
UPDATE ROW SET XXX = base WHERE FOO=BAR;
我找到的简单解决方案是在求值函数内向服务器发出 ajax 请求:
casper.then(function() {
details = this.evaluate(function() {
var elDet = document.getElementsByClassName("job-description-column")[0];
var detLen = elDet.children[2].children[0].children.length;
var details = elDet.children[2].children[0].children;
var linkedData = [];
for (var i = 0; i < detLen; i++) {
if (details[i].nodeName == "H3" && details[i].id != "if-this-sounds-like-you,-apply") {
linkedData.push({
head: details[i].textContent,
description: details[i + 1].textContent,
title: elDet.children[0].children[0].children[0].textContent,
loc: elDet.children[0].children[0].children[1].textContent,
date: elDet.children[0].children[0].children[2].textContent
})
i++;
} else {
linkedData.push({
head: "No Head",
description: details[i].textContent,
title: elDet.children[0].children[0].children[0].textContent,
loc: elDet.children[0].children[0].children[1].textContent,
date: elDet.children[0].children[0].children[2].textContent
})
}
}
var s = JSON.stringify(linkedData);
console.log(linkedData);
$.ajax({
method: "POST",
url: "http://localhost/fiverr/Crawl%20The%20Jobs/modal_scripts.php",
data: "add_jobdets=true&job_details=" + s,
async: false
})
return linkedData;
})
})