jquery做的nodejs小爬虫
想做个博客网站练练手,数据就打算用node爬下来,存入数据库待使用,就爬****博客吧。(站主勿怪~)
首先做准备工作:
1、下载请求插件request(用node内置的http模块、SuperAgent、axios或ajax都可以);
2、下载jquery;
3、单纯用jquery是获取不到标签的,因为这是在控制台输出的,jquery只能获取到浏览器标签。于是下载JSDOM模拟浏览器(也可以用PhantomJS);
4、下载mysql。
代码如下:npm install request jquery jsdom mysql
准备工作2:
1、引入模块:
const request = require('request')
const mysql = require('mysql')
const jsdom = require('jsdom')
const {JSDOM} = jsdom
2、创建数据库连接池:
const db = mysql.createPool({
host: 'IP',
user: '用户名',
password: '密码',
database: '数据库名'
})
正式爬虫:
1、请求页面,实例化JSDOM对象
request.get('https://www.****.net/', (err, res) => {
if (err) {
throw err
}
const {window} = new JSDOM(res.body)
const $ = require('jquery')(window) //此时$已经获取到页面标签
})
2、分析页面
获取下图数据
查看标签如下图
此时要获取列表的标题
$('.feedlist_mod>li').each(function (i) {
let title = $(this).find('.title>h2>a').text().trim() //此时可以遍历出列表的标题
})
3、把获取到的数据存入数据库(先创建数据库,再创建数据表,然后设计表)
db.query(`insert into home_feed (title) value('${title}')`, (err, data) => {
if (err) {
console.log(err)
}
})
4、处理重复数据,查询数据库是否有该条信息,没有才存入
db.query(`select * from home_feed where title='${title}'`, (err, data) => {
if (err) {
console.log(err)
}
if (data.length < 1) {
//存入数据库操作
}
})
-------------------------------------------------------我是分割线呀--------------------------------------------------------------------
遇到的问题:
1、为什么不用cheerio?
答:cheerio用起来很简单,但是存在一个问题,数据获取成功,第一次分析能成功,但是后面解析一直失败,遂弃用。(虽然jquery也有同样的问题)
2、jsdom第一次分析能成功,但后面解析失败怎么解决?
答:数据获取成功的前提下,jsdom加载页面失败,jquery获取不到标签,初步解决方案是把标签遍历放到$(function(){})里(第一天成功了,第二日俺看又出问题了,有待解决)
3、需要登录的页面待解决。