初学Nodejs,关于node-crawler使用的一点问题
初学Nodejs,关于node-crawler使用的一点问题
初学nodejs,想搞个crawler,搜索了下在github上发现有个node-crawler,于是NPM,然后复制范例,编译运行,报错…(范例代码可在github的项目首页上找到)
$("#content a").each(function(a) {
^ TypeError: undefined is not a function
at Object.Crawler.callback (D:\Study\nodejs\myCrawler\index.js:10:9)
at exports.Crawler.self.onContent.jsdom.env.done (D:\Study\nodejs\myCrawler\node_modules\crawler\lib\crawler.js:212:37)
at exports.env.exports.jsdom.env.scriptComplete (D:\Study\nodejs\myCrawler\node_modules\crawler\node_modules\jsdom\lib\jsdom.js:205:39)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
想来应该是jquery路径的问题?可是我查了貌似没问题啊,我直接NPM的什么都没改啊,麻烦大家帮忙看看可能是什么原因
环境 OS:Windows NodeJS:0.8.15 (x64)
UP一下,求解…
把你的程序帖上来看看吧。
lz问题解决了么,我也是这样
这个 node-crawler 好像依赖的库很多哦,检查一下是否都全了?猜想是否 jsdom 这个没有呢?
"dependencies": {
"request": "2.12.0",
"jsdom": "0.2.19",
"generic-pool": "2.0.2",
"htmlparser": "1.7.6",
"underscore": "1.3.3",
"jschardet": "1.0.2",
"iconv-lite": "0.2.7"
}
不用试了win下面用不了。
重新看了下,确实crawler在win下有bug
// jsdom doesn't support adding local scripts,
// We have to read jQuery from the local fs
if (toQueue.jQueryUrl.match(/^(file\:\/\/|\/)/)) {
// TODO cache this
fs.readFile(toQueue.jQueryUrl.replace(/^file:///,""),“utf-8”,function(err,jq) {
crawler/lib/crawler.js
第273行
的正则匹配并不适用于win的文件系统,所以读取不到jquery.js了,试着直接改成if(true)
就可以正常运行
不过还是推荐自己写crawler,这个crawler只是把几个常用的module组合起来了,过度封装了反而不够灵活
到这下载 windows下编译好的jsdom吧。 https://github.com/mihaifm/jsdom_binaries
node-crawler 在windows就fork我的版本吧,原版有问题 ,估计根本只想在unix系下跑。 https://github.com/hhuai/node-crawler
osx下也不行
从错误信息来看,问题出在尝试使用jQuery选择器时,但环境中没有正确加载jQuery或DOM环境。node-crawler
库并不自带jQuery环境,需要手动引入。
你可以通过以下步骤解决这个问题:
示例代码
首先,安装 node-crawler
和 jsdom
(一个可以提供类似浏览器的DOM环境):
npm install node-crawler jsdom --save
然后编写爬虫脚本:
const Crawler = require("crawler");
const jsdom = require("jsdom");
const c = new Crawler({
// 你需要定义你的爬虫选项
maxConnections: 10,
callback: (error, res, done) => {
if (error) {
console.error(error);
} else {
const window = new jsdom.JSDOM(res.body).window;
const $ = require('jquery')(window);
// 现在你可以使用 jQuery 选择器了
$("#content a").each((i, elem) => {
console.log(elem.href);
});
done();
}
},
});
c.queue("http://example.com");
解释
-
安装依赖:
node-crawler
:用于构建爬虫。jsdom
:用于创建一个类似于浏览器的DOM环境,使你能够在Node.js中使用jQuery。
-
创建DOM环境:
- 使用
jsdom.JSDOM(res.body).window
创建一个DOM环境,这样你就可以在Node.js中使用jQuery了。
- 使用
-
使用jQuery:
require('jquery')(window)
将jQuery绑定到该DOM环境上,使得你可以使用jQuery选择器。
-
处理响应:
- 在回调函数中,你可以在DOM环境中使用jQuery选择器来解析HTML内容。
通过这种方式,你应该能够避免之前遇到的错误,并且可以顺利地使用jQuery选择器进行网页解析。