Node爬虫一次愚蠢的express&selector使用

之前说过要写把各位大佬的博客串起来玩耍的。日常一点点码起来,长期更新记录链接在末尾。

express

这里我简单的把爬去封装成了不同的Map去爬去链接。有一个问题暂时不好解决,就是不同类型的网站选择器是不一致的。而我要得到的结果是固定的。我现在只能很愚蠢的写了很多个对象去取。可以发现不管是取巴掌的还是取薇薇的都是同样的方法只是他们的对象不同。
好的一方面是我的数据层是剥离开的。这不会影响我统一存储。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
app.get('/xxx', function(req, res) {
let blog= StringUtil.String2httpUrl(req.query.blog);
let isReverse= req.query.isReverse;
ArchiveDb.getBlogId(blog)
.then(id=>{
if(id==1||id==2||id==3){ //巴掌、刘望舒、鸡排、
HexoBaMap.getFirstArchiveUrl(blog,(nextUrl)=>{
HexoBaMap.reData(blog,{nextUrl,id},isReverse)
});
}
if(id==4){ //薇薇
HexoViMap.getFirstArchiveUrl(blog,(nextUrl)=>{
HexoViMap.reData(blog,{nextUrl,id},isReverse)
});
}
if(id==5){ //程序亦非猿
HexoYFYMap.getFirstArchiveUrl(blog,(nextUrl)=>{
HexoYFYMap.reData(blog,{nextUrl,id},isReverse)
});
}
if(id==6){ //大精子哥
WPBigSemenMap.getFirstArchiveUrl(blog,(nextUrl)=>{
HexoBaMap.reData(blog,{nextUrl,id},isReverse)
});
}
.....
});
});

下面说下问题,一开始还好由于我和巴掌还有薇薇的文章数目都不是特别多。用浏览器Url的方式去调用接口比如这样:
http://127.0.0.1:8088/XXX?blog=yifeiyuan.me

文章能一个个正常的爬出来存到数据库里。
当我爬到刘望舒和程序亦非猿的文章时,就开始出问题了。文章会重复的爬很多进去。而且是死循环。一开始我以为是网页的设计问题导致了循环引用的爬去。我静下去分析着他们的网页节点。最后发现程序亦非猿的第一篇文章和中间的文章并未出现收尾相连的引用方式。

好吧,直觉告诉我可能是浏览器惹的祸。因为我一直没有调用response。导致谷歌阻塞了。试了一下立刻返回.爬出来的数据就正常了。因为浏览器见服务器这么久没有返回,就会重试请求。我很愚蠢的没有给返回任何值。酿成了悲剧的发生。

1
res.json({re:"ok"});

selector

再说另一个问题:

1
2
3
4
5
6
7
8
9
10
11
<div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1 text-center">
<div class="post-heading">
<h1>Github Pages+Hexo+阿里云域名绑定</h1>
<span class="meta">
作者 Vivian陈薇
<span>
日期 2017-09-11
</span>
</span>
</div>
</div>

在爬去薇薇的博客时,时间标签拿到的selector是span.meta span,到程序亦非猿的时候时间标签一样是span.meta span.但是恐怖的是一旦到程序亦非猿的时候,在很少一部分文章里取到的会多一段奇怪的字符。

后面发现单独对HTML页面分析,发现我这种取法是不可靠的。会导致一个页面里,多处标签上出现了同样的selector时。就会被拼接进去。解决的办法也很粗暴。我们换一种选择器。

1
let time =  StringUtil.replaceDirtyString($(".post-heading span").text());

虽然不是每个标签都有class存在。但是我们可以用父子约束来取。这样就万无一失了。

更多关于这次爬虫的日志在这里可以找到:
大佬们的博客,我要串起来玩了

随缘打赏!