文件云托管

使用采集爬虫爬取数据时, 会需要将网页中的图片或文件下载下来, 获取下载的文件或解决目标网站防盗链的问题. 这种情况, 可以使用神箭手文件云托管服务, 在爬取过程中自动下载并上传文件到指定的云服务器上.

注意:

1. 点此查看神箭手文件云托管详细使用教程和计费规则等;

2. 只有开启海外私密代理IP才能托管海外网站的文件.

要使用文件云托管, 需要先在神箭手控制台采集爬虫设置中, 选择需要将文件托管到哪种云服务器(包括七牛云存储, 阿里云OSS神箭手云存储)上, 并选择托管后的文件类型.

一. 托管可自动识别类型的url

神箭手支持托管”图片”, “文本”, “音频”, “视频”和”应用”五种文件类型, 其中, 可自动识别类型并托管的文件url后缀如下表所示:

文件类型 可自动识别类型并托管的后缀
图片 .jpg, .jpeg, .png, .gif, .svg, .bmp
文本 .txt, .text
音频 .mp3, .wav, .wma, .amv, .m4a
视频 .mp4, .avi, .mpg, .mov, .3gp, .wmv, .3gpp
应用 .doc, .docx, .ppt, .pptx, .xls, .xlsx, .pdf, .csv,
.zip, .rar, .gzip, .gz, .apk, .exe, .iso, .dmg

自动识别类型并托管的意思是, 如果抽取结果的url以上述后缀结尾, 那么采集爬虫在爬取过程中, 会自动识别出该url属于可托管的文件以及托管后的文件类型, 根据具体的爬虫设置自动下载该文件到指定的云服务器上, 并将url替换成托管后的文件链接.

二. 托管不可自动识别类型的url

如果抽取结果不是可自动识别托管的url, 如何设置可托管呢?

1. 抽取结果中包含img标签, 且img标签中包含src属性, 该属性值会自动识别托管为图片类型文件;

2. 抽取结果的url不是可自动识别托管的, 或想要修改可自动识别托管后的文件类型, 需要在代码中调用hostFile函数, 并将此url替换成hostFile的返回值;

采集爬虫栗子1:

要托管的图片url(http://mp.weixin.qq.com/mp/qrcode?scene=10000004&size=102&__biz=MzAxMTA0ODE3Mw==)不是可自动识别托管的图片url时, 具体实现如下:

var configs = {
// configs的其他成员
...
fields: [
{
name: "image",
selector: "//img/@src"
}
]
};
configs.afterExtractField = function(fieldName, data, page, site) {
if (fieldName == "image") {
// 定义"options"对象, 包括"headers"和"fileSize"两个成员
var options = {
headers: {
"Referer": "http://mp.weixin.qq.com/"
},
fileSize: 20000
};
// 调用"hostFile"设置抽取结果"data"可托管为图片类型的文件,
// 并将"hostFile"的返回值作为处理后抽取结果返回,
// 神箭手会在爬取过程中根据爬虫设置下载并托管该文件
return hostFile(data, FileType.IMAGE, options);
}
return data;
};

3. 抽取结果是数组, 如果数组元素值是可自动识别托管的url, 或数组元素值包含img标签且标签中包含src属性, 会自动识别类型并托管数组元素值或src属性值; 如果数组元素值不是可自动识别托管的url, 需要在代码中调用hostFile函数, 并将数组元素值替换成hostFile的返回值.

采集爬虫栗子2:

爬取结果中抽取项的值是url数组, 要将文件url托管到云服务器上, 具体实现如下:

var configs = {
// configs的其他成员
...
fields: [
{
name: "videos",
selector: "//div[@id='music']/@href",
repeated: true
}
]
};
configs.afterExtractField = function(fieldName, data, page, site) {
if (fieldName == "videos") {
// "videos"抽取项是视频url数组
for (var i = 0, n = data.length; i < n; i++) {
// 定义"options"对象, 包括"headers"和"fileSize"两个成员
var options = {
headers: {
"Referer": "http://www.shenjianshou.cn/"
},
fileSize: 2000000
};
// 调用"hostFile"设置数组"data"的元素可托管为视频类型的文件,
// 并将"hostFile"的返回值作为该数组元素的值,
// 神箭手会在爬取过程中根据爬虫设置下载并托管该文件
data[i] = hostFile(data[i], FileType.AUDIO, options);
}
return data;
}
return data;
};