基于Google Apps Script爬取Centris.ca地址匹配结果报错解决
问题分析与解决方案
原脚本错误原因
- URL与请求逻辑问题:原URL使用地理范围搜索接口,并非专门的地址匹配接口,无法准确判断地址是否存在匹配建议;同时Centris的反爬机制会拦截无浏览器标识的请求,导致
UrlFetchApp.fetch抛出"Invalid Argument"错误。 - 匹配逻辑不准确:通过HTML字符串包含判断地址是否存在,容易出现误判(比如地址出现在页面其他无关位置),也无法处理地址格式的细微差异。
修正后的脚本
function searchCentris() { const address = "4065 avenue Wilson, Côte-des-Neiges / Notre-Dame-de-Grâce"; const apiUrl = "https://www.centris.ca/Property/GetAddressAutocomplete"; // 构建搜索参数 const params = { q: address, locale: "en" }; // 模拟浏览器请求头,避免反爬拦截 const options = { method: "GET", headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Accept": "application/json, text/javascript, */*; q=0.01" }, muteHttpExceptions: true }; // 拼接完整请求URL const queryString = Object.keys(params).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join("&"); const fullUrl = `${apiUrl}?${queryString}`; try { const response = UrlFetchApp.fetch(fullUrl, options); if (response.getResponseCode() !== 200) { console.log(`HTTP Error: ${response.getResponseCode()}`); return "Unknown"; } // 解析接口返回的地址建议数据 const addressSuggestions = JSON.parse(response.getContentText()); // 检查是否存在匹配的地址建议 const hasMatch = addressSuggestions.some(item => item.label.toLowerCase().includes(address.toLowerCase()) ); return hasMatch ? "Yes" : "No"; } catch (error) { console.log(`Error: ${error.message}`); return "Unknown"; } }
方案说明
- 使用官方自动补全接口:调用Centris原生的地址自动补全API,该接口专为地址提示设计,返回的JSON数据精准且易解析。
- 规避反爬拦截:添加浏览器标识的请求头,模拟真实用户访问,避免被网站拦截。
- 精准匹配逻辑:遍历接口返回的地址建议,通过忽略大小写的包含判断确认匹配,减少格式差异导致的误判。
- 错误处理机制:捕获请求异常与HTTP错误,返回明确状态并记录日志,方便调试。
使用方式
修改address变量为目标地址后直接运行脚本:
- 返回
Yes:存在地址匹配建议 - 返回
No:无匹配地址 - 返回
Unknown:请求过程中出现错误(可查看脚本日志获取详情)
内容的提问来源于stack exchange,提问作者EagleEye
相关产品推荐
相关产品推荐

