之前写过一个php版本的爬虫,其中有一个对路径的处理,即相对路径转化为绝对路径,可以在这里查看。
今天用nodejs爬虫时,又js重新对其实现了一次,和之前的实现方式有些不同。
这里使用了url模块对url链接进行解析,使用npm install --save url
进行安装。
详见代码
var _url = require('url')
function array_remove_null(array) {
for (var i = 0; i < array.length; i++) {
if (array[i] === '') {
array.splice(i, 1)
i--
}
}
return array
}
/**
* 路径处理
* @param {string} url 待解析的url
* @param {string} cur_url 来源页面url
*/
function format_path(url, cur_url) {
cur_url = cur_url || init_base_url
var cur_url_parse = _url.parse(cur_url)
var cur_host = cur_url_parse.host
var cur_port = cur_url_parse.port
var cur_protocol = cur_url_parse.protocol
var cur_hostname = cur_url_parse.hostname
var cur_pathname = cur_url_parse.pathname
var cur_pathname_objs = array_remove_null(cur_pathname.split('/'))
var cur_url_base_path = ''
if (cur_pathname[cur_pathname.length - 1] === '/')
cur_url_base_path = '/' + cur_pathname_objs.join('/') + '/'
else
cur_url_base_path = '/' + cur_pathname_objs.splice(0, cur_pathname_objs.length - 1).join('/') + '/'
var cur_base_url = cur_protocol + "//" + cur_hostname + (cur_port ? ':' + cur_port : '') + cur_url_base_path
//形如 /about.html
if (url[0] === "/")
return init_base_url + url
var url_parse = _url.parse(url)
//形如 http://www.baidu.com
if (url_parse.protocol && url_parse.hostname) return url
var url_objs = url.split('/')
//形如 about/abc.html
if (!url_parse.protocol && !url_parse.hostname && url_parse.pathname && url_objs[0] !== '.' && url_objs[0] != '..')
return cur_url + "/" + url
//形如 ../../a/c/v/a.html
if (url_objs[0] === '.')
url = url.substring(2)
url_objs = url.split('/')
var cur_url_pathname = cur_url_base_path
var cur_main_url = cur_url.split(cur_url_pathname)[0]
var cur_url_objs = array_remove_null(cur_url_pathname.split('/'))
var url_after = []
for (var i = 0; i < url_objs.length; i++) {
if (url_objs[i] === '..') {
cur_url_objs.splice(cur_url_objs.length - 1, 1)
} else {
url_after.push(url_objs[i])
}
}
cur_url_pathname = (cur_url_objs.length > 0) ? ('/' + cur_url_objs.join('/')) : ''
var url_after_pathname = (url_after.length > 0) ? ('/' + url_after.join('/')) : ''
return cur_main_url + cur_url_pathname + url_after_pathname
}
如果觉得我的文章对您有用,请您随意打赏。您的支持将鼓励我更加努力创作!
如无特殊声明,文章均为原创,若有不正之处,万望告知。转载请附上原文地址,十分感谢!