掉到了base的坑里面

现象

最近写一个爬虫,和普通的不太一样,不是按规律去爬某个页面,而是去爬整站的,爬取的站都不大,是自己写来搜集行业相关企业最新信息的。因为是整站爬取,采用了爬虫按照种子页面,定时爬取,存储html,后期再行分析的办法。这么做是为了只需要配置一下,就可以多爬取几个站。

之前一切顺利,但是遇到某个站时,爬回来的连接规模非常大,而且大量的坏连接。好奇怪!

分析发现是连接解析错误。多解析了目录进去。

技术栈

技术栈得说清楚

用的nodejs做的爬取

获取页面用的request-promise-native 包(获取正常)

分析

分析发现,爬取时,好比在http://www.XXXXX.com/about-XXXX/brands/per.html,爬取到了

1
<a href="about-XXXX/careers.html" class="link"><span>Careers</span></a>

这么一个连接,结果,我解析成了

http://www.XXXXX.com/about-XXXX/brands/about-XXXX/careers.html

而实际正确的是http://www.XXXXX.com/about-XXXX/careers.html

这就奇怪了,按说这么解析是没错的。

这个明显是相对地址,我这么解析没错啊,采用的解析方式是:

1
const gotHref = Url.resolve(base, href);

输入的base是http://www.XXXXX.com/about-XXXX/brands/per.html href是about-XXXX/careers.html

解决

开始赶时间,直接写死碰到这个问题直接写死使用基地址解决。

有时间了,再去慢慢分析页面,来回看了两遍,有一个标签特别奇怪

1
<base href="http://www.XXXXX.com/">

我还真没用过这个标签,查找发现,果然,指定网页的BaseURI。且一个页面最多存在一个,那就好办了。

1
2
3
4
5
6
7
8
9
10
11
12
13
const baseNode = $('base');
let baseurl;
if (baseNode.length > 0) {
baseurl = Url.parse(baseNode.attr('href'));
} else {
baseurl = Url.parse(url);
}

结论

接触html也10多年了,从来没有注意过该标签。被坑了一次,又学了点东西。

坚持原创技术分享,您的支持将鼓励我继续创作!