神箭手应用的整体框架: 首先定义一个configs对象, 在对象中添加配置信息; 然后通过Crawler或Fetcher对象来配置并启动应用. configs对象中可以定义下面这些成员: domains定义神箭手应用爬取哪些域名下的网页, 非域名下的网页会被忽略以提高爬取速度 数组类型 在神箭手应用的代码中均可使用 通用栗子1:
var configs = { // 单个域名 domains: ["wallstreetcn.com"], // configs的其他成员 ... };
通用栗子2:
var configs = { // 多个域名 domains: ["zhihu.sogou.com", "zhihu.com"], // configs的其他成员 ... };
注意: 1. 如果代码中设置domains:[]或代码中不包含domains成员, 那么神箭手应用将无法正常运行; 2. 如果代码中设置domains:[""], 那么domains会匹配所有域名. scanUrls定义神箭手应用的入口页url, 神箭手应用会从入口页url开始爬取数据 数组类型 在神箭手应用的代码中均可使用 通用栗子1:
var configs = { // 单个入口页url scanUrls: ["http://wallstreetcn.com/"], // configs的其他成员 ... };
通用栗子2:
var configs = { // 多个入口页url scanUrls: [ "http://baijia.baidu.com/", "http://www.demo.com/" ], // configs的其他成员 ... };
注意: 1. scanUrls的上限是1000个, 如果要添加更多入口页url, 请在等回调函数中调用添加; 2. 如果代码中设置scanUrls:[]或scanUrls:[""]或代码中不包含scanUrls成员, 请在回调函数中调用添加入口页url, 否则, 神箭手应用将无法正常运行. contentUrlRegexes1). 设置内容页url的正则表达式 2). 内容页是包含需爬取内容的网页, 比如, 这个url()就是一个内容页url, 可以从中抽取”文章作者”, “文章内容”等数据 数组类型 支持JavaScript正则表达式的写法 在采集爬虫代码中可使用 采集爬虫栗子1:
var configs = { // 写法一 contentUrlRegexes: [ "http://club2011\\.auto\\.163\\.com/post/\\d+\\.html.*" ], // configs的其他成员 ... };
采集爬虫栗子2:
var configs = { // 写法二 contentUrlRegexes: [ /http:\/\/club2011\.auto\.163\.com\/post\/\d+\.html.*/ ], // configs的其他成员 ... };
注意: 1. 如果代码中设置contentUrlRegexes:[]或代码中不包含contentUrlRegexes成员, 那么待爬队列中的url都会被认定为内容页url; 2. 如果代码中设置contentUrlRegexes:[""], 那么待爬队列中的url都不会被认定为内容页url; 3. 正则表达式中的.和?都需要转义. helperUrlRegexes1). 设置列表页url的正则表达式 2). 列表页是包含内容页url的网页, 比如, 这个url(?s=vr&site=article)就是一个列表页url, 可以从中获取”内容页url”等数据 数组类型 支持JavaScript正则表达式的写法 在采集爬虫代码中可使用 采集爬虫栗子1:
var configs = { // 写法一 helperUrlRegexes: [ "http://wallstreetcn\\.com/news(\\?/page=\\d+)?" ], // configs的其他成员 ... };
采集爬虫栗子2:
var configs = { // 写法二 helperUrlRegexes: [ /http:\/\/wallstreetcn\.com\/news(\?\/page=\d+)?/ ], // configs的其他成员 ... };
注意: 1. 如果代码中设置helperUrlRegexes:[]或代码中不包含helperUrlRegexes成员, 那么待爬队列中的url都会被认定为列表页url; 2. 如果代码中设置helperUrlRegexes:[""], 那么待爬队列中的url都不会被认定为列表页url. fields1). 定义内容页的抽取规则 2). 规则由一个或多个field组成, 一个field代表一个抽取项 数组类型 在神箭手应用的代码中均可使用 通用栗子: 从糗事百科的内容页中抽取文章内容
var configs = { // configs的其他成员 ... fields: [ { // 抽取项名称 name: "content", // 抽取项别名, 在神箭手控制台预览该条数据的时候会显示 alias: "文章内容", // 抽取该项数据的表达式(默认使用XPath) selector: "//*[@id='single-next-link']" } ] };
点此查看“field”详解 注意: 如果代码中设置fields:[]或fields:[""]或代码中不包含fields成员, 那么神箭手应用将无法正常运行. interval1). 设置神箭手应用爬取每个网页的时间间隔. 如果目标网站有屏蔽措施, 设置较长时间间隔可以降低被屏蔽概率 2). 单位: 毫秒 整型 interval默认值和最小值都是1000(毫秒), 即1秒 在神箭手应用的代码中均可使用 通用栗子:
var configs = { // 设置5秒时间间隔 interval: 5000, // configs的其他成员 ... }; enableJS 1). 设置是否开启自动JS渲染 2). 默认值是false 3). 如果需要开启自动JS渲染, 可设置此项为true, 这样请求, 和, 及, 和时, 都会自动JS渲染 4). enableJS值为true时, 不会影响手动发送HTTP请求(site.requestUrl)的自动JS渲染; 如需在时开启自动JS渲染, 请在传入参数中设置 布尔类型 在神箭手应用的代码中均可使用 通用栗子:
var configs = { // 开启自动JS渲染 enableJS: true, // configs的其他成员 ... };
点此查看“自动JS渲染”详解 renderTime1). 表示在自动JS渲染的过程中, 如果在设置的该时间内未发送HTTP请求或加载网页资源, 自动JS渲染会立即停止 2). 单位: 毫秒 3). 当enableJS值为true时, 在请求, 和, 及, 和自动JS渲染过程中, 或在请求时开启自动JS渲染, 都会受到renderTime限制 整型 只有当configs成员或options对象的enableJS值为true时, renderTime才生效 renderTime默认值是3000(毫秒), 即3秒, 最大值是10分钟 在神箭手应用的代码中均可使用 通用栗子:
var configs = { // 开启自动JS渲染 enableJS: true, // 在8秒内未发送HTTP请求或加载网页资源, 自动JS渲染会立即停止 renderTime: 8000, // configs的其他成员 ... }; timeout 1). 设置下载单个网页或加载网页中每个资源的超时时间 2). 单位: 毫秒 3). 无论是否开启自动JS渲染, 请求, 和, 及, , 和时都会受到timeout限制 整型 timeout默认值是5000(毫秒), 即5秒 在神箭手应用的代码中均可使用 通用栗子1:
var configs = { // 下载单个网页的超时时间是10秒 timeout: 10000, // configs的其他成员 ... };
通用栗子2:
var configs = { // 加载网页中每个资源的超时时间是10秒 timeout: 8000, // 开启自动JS渲染 enableJS: true, // configs的其他成员 ... }; userAgent 1). 是一种向访问网站提供所使用的浏览器类型, 操作系统及版本等信息的标识 2). 默认值是UserAgent.Computer, 还可使用UserAgent.Android, UserAgent.iOS和UserAgent.Mobile 枚举类型 UserAgent.Android, 使用安卓手机浏览器访问网页 UserAgent.iOS, 使用苹果手机浏览器访问网页 UserAgent.Computer, 使用PC浏览器访问网页 UserAgent.Mobile, 使用移动设备浏览器访问网页, 移动设备包括手机和平板等 userAgent所使用的具体浏览器类型是随机分配的 在神箭手应用的代码中均可使用 通用栗子:
var configs = { // 使用安卓手机浏览器访问网页 userAgent: UserAgent.Android, // configs的其他成员 ... }; changeProxyEveryPage 1). 在神箭手应用中开启代理IP切换之后, 如果当前代理IP过期或者返回true, 神箭手会切换一次IP. 如果需要在每次爬取不同的网页时都切换一次IP, 可以通过设置该成员为true实现 2). 默认值是false 3). 使用条件: 4). changeProxyEveryPage支持通过或爬取网页时切换代理IP, 不支持通过且options中设置enableJS: true(开启自动JS渲染)爬取网页时切换代理IP 5). 如非必需, 请不要设置此成员的值为true. 因为切换代理IP需要时间, 每次爬取网页都切换代理IP会极大降低爬取速度 布尔类型 在神箭手应用的代码中均可使用 通用栗子:
var configs = { // 设置每次爬取网页时都切换代理IP changeProxyEveryPage: true, // configs的其他成员 ... };
点此查看“代理IP切换”详解 tryTimes1). 单个HTTP请求失败时, 可自动重试. 通过tryTimes设置单个HTTP请求的最多重复请求次数 2). 默认值是0, 0和1都表示单个HTTP请求最多可请求一次 3). 请求失败的情况包括: “请求过程出现异常(如, 请求超时)”和”请求返回内容为空” 4). 单个HTTP请求包括请求, 和, 及和 整型 在神箭手应用的代码中均可使用 通用栗子:
var configs = { // 单个HTTP请求最多可重复请求2次 tryTimes: 2, // configs的其他成员 ... }; entriesFirst 1). 设置神箭手应用是否优先爬取待爬队列中的 2). 默认值是false, 神箭手应用会按顺序依次爬取待爬队列中的url, 包括, 和 3). entriesFirst值为true时, 神箭手应用会优先爬取待爬队列中的, 爬取完成后, 再爬取和 布尔类型 在神箭手应用的代码中均可使用 通用栗子:
var configs = { // 设置优先爬取"scanUrl" entriesFirst: true, // configs的其他成员 ... };
注意: 1. 默认情况下(entriesFirst: false), 爬虫是根据网页加入待爬队列的先后顺序来处理的. 即先加入待爬队列的网页会先被取出处理; (责任编辑:每日一笑) |