javascript - 有没有办法访问缩短的 url 并解析该 url 的扩展版本?R、Python、JS/节点
问题描述
例如,如果我访问一个像tripadvisor.com/6887990
出现在浏览器中的该 url 的扩展版本变为https://www.tripadvisor.com.au/Attraction_Review-g1121284-d6887990-Reviews-Koishidani_Shrine-Minamiyamashiro_mura_Soraku_gun_Kyoto_Prefecture_Kinki.html
有没有办法以编程方式访问缩短的 url 的整个列表/向量/数组,然后将扩展的 url 存储在另一个列表/向量/数组中?
乐于接触任何可以实现这一点的语言,但最好是在 R、Python 或 JS/Node 中
提前致谢!
解决方案
在 node.js 中,你可以找到重定向的 URL 是这样的:
const got = require('got');
got('https://www.tripadvisor.com/6887990', {followRedirect: false}).then(r => {
if (r.statusCode === 301 || response.statusCode === 302) {
console.log(r.headers.location); // this will be the redirect URL
} else {
console.log(`statusCode ${r.statusCode} was not a redirect`);
}
}).catch(err => {
console.log(err);
});
然后,您可以使用该重定向 URL 来获取实际内容。或者您可以让got()
库自动为您跟随重定向,让它为您获取内容。
got('https://www.tripadvisor.com/6887990').then(r => {
console.log(r.body); // this is the content of the redirected page
}).catch(err => {
console.log(err);
});
要遍历一组 URL,最安全的方法是一次执行一个(以避免速率限制或 DOS 限制):
async function run(listOfUrls) {
let results = [];
for (let url of listOfUrls) {
let response = await got(url);
if (response.statusCode === 301 || response.statusCode === 302) {
results.push(response.headers.location);
} else {
results.push(url);
}
}
return results;
}
run(["https://somedomain.com/url1", "https://somedomain.com/url2", ...])
.then(results => {
console.log(results);
})
.catch(err => {
console.log(err);
});
推荐阅读
- javascript - JS Promises:.then 语法和 async/await 之间的关系(Apollo 客户端示例)
- typescript - 使用 Jest 在命名空间中测试 Typescript 类
- watchkit - 如何在不使用锻炼课程的情况下在 watchOS 3+ 中获取心率
- c++ - 了解 declval 优化实现
- java - 添加新成员变量后反序列化旧对象:Java
- firebase - Firebase/Cloud 功能不会在实时数据库删除时触发事件
- javascript - 如何将承诺变量保存到局部变量
- node.js - DynamoDB Datamapper 错误抛出项目不遵守 DynamoDBTable 协议
- android - 关于android导航架构组件的问题
- json - 从 .gitlab-ci.yml 中的 JSON 中提取徽章 ID