并非每个站点都具有从其中访问数据的API。 实际上,大多数不是。 如果需要提取数据,一种方法是“擦除”数据。 也就是说,将页面加载到Web浏览器中(您可以自动执行),在DOM中找到所需内容,然后进行处理。
如果您要处理成本,维护和技术债务,可以自己做。 例如,这是“无头”浏览器的大用例之一,例如Puppeteer如何启动和控制无头Chrome。
或者,您可以使用像scrapestack这样的工具,它是一种现成的API,不仅可以为您提供抓取功能,而且还可以比您自己做的更好,更快,并且具有更多选择。
说我的目标是从Meetup.com页面中获取最新的完成的聚会。 Meetup.com有一个API,但是价格昂贵,并且需要OAuth和其他东西。 我们需要的只是这里过去一次聚会的名称和链接,所以让我们将其从页面上移出即可。
我们可以看到DOM中需要的内容:
![](https://i-blog.csdnimg.cn/blog_migrate/bb49556e7dd53cfec976191b8d43741a.png)
为了发挥作用,让我们使用带有jQuery的scrapestack API客户端进行抓取:
$.get('https://api.scrapestack.com/scrape',
{
access_key: 'MY_API_KEY',
url: 'https://www.meetup.com/BendJS/'
},
function(websiteContent) {
// we have the entire sites HTML here!
}
);
在该回调中,我现在还可以使用jQuery遍历DOM,获取所需片段,并在我们的网站上构建所需的内容:
// Get what we want
let event = $(websiteContent)
.find(".groupHome-eventsList-pastEvents .eventCard")
.first();
let eventTitle = event
.find(".eventCard--link")[0].innerText;
let eventLink =
`https://www.meetup.com/` +
event.find(".eventCard--link").attr("href");
// Use it on page
$("#event").append(`${eventTitle}
`);
在实际使用中,如果我们像这样在客户端进行操作,我们将利用一些基本的存储,这样我们就不必在每次页面加载时都访问API,例如将结果粘贴在localStorage
并在几次加载后失效天之类的。
有用!
![](https://i-blog.csdnimg.cn/blog_migrate/fc6e7c0534b6e303d4ad43e5763491e8.png)
实际上,我们更有可能在服务器端进行抓取。 一方面,这是保护API密钥的方法,这是您的责任,并且如果直接在客户端使用API,那么在面向公众的网站上实际上是不可能的。
我本人可能会做一个云函数来做到这一点,所以我可以留在JavaScript(Node.js)中,并有机会将数据存储在某个地方。
我想说一下,查看文档 ,看看下一次您是否需要进行抓取时,这是否不是正确的答案。 无论如何,您都会在免费计划中收到10,000个请求以尝试试用,而在具有更多功能的任何付费计划中,它都会增加一吨。
翻译自: https://css-tricks.com/scrapestack-an-api-for-scraping-sites/