通过 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();

概念验证,使用 :

#!/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 -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;


勾选https://stedolan.github.io/jq/

我找到的简单解决方案是在求值函数内向服务器发出 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;
  })
})