tl;dr:有人可以为我指明在 Chrome 扩展程序中通过 Ajax 复制抓取网页的正确方向吗...但在 Node.js 中?我想学习相关教程,但不知道从哪里开始。
==目标==
作为自学编码的一种方法,我正在构建一个 node.js 应用程序来提取我的 Goodreads.com 书单(使用 Goodreads 的 API),然后搜索旧金山公共(public)图书馆的 Overdrive 目录(Goodreads 的 API 中未包含的功能)。我在第二部分遇到了挑战。
我正在使用 Chrome 扩展可用 Goodreads ( https://github.com/rhollister/goodreads ) 作为指导,并且我正在取得进展 - 上周,我了解了有关正则表达式的所有知识(非常有趣)。
==问题==
当我使用 http.request(library_search_url) 时,该网站返回一条警告:“网络机器人已禁用对此功能的访问”。查看扩展代码,似乎他们在后台窗口中使用 Ajax 来抓取页面。
==问题==
我尝试根据此处的一些研究更改我的请求方式(例如 Node can't scrape certain pages ),但这不起作用。我是否需要学习express并做这样的事情(http://mherman.org/blog/2013/10/20/handling-ajax-calls-with-node-dot-js-and-express-scraping-craigslist/)才能实现我想要的?如果不是这样,我还应该学习其他方法吗?
(注意:我不是在寻找代码本身 - 只是一个方向,这样我就可以去学习我需要学习的东西。)
谢谢!
对于上下文,下面的代码让我认为这是基于 Ajax 的抓取:
$.ajax({
url: url,
success: parseODResults(bookSearchTerms, l, libraryShortName, libraryStr, library.newDesign, searchTerm, url),
error: function(request, status, error) {
if (sender) {
chrome.tabs.sendMessage(sender.tab.id, {
type: 'FROM_AG_EXTENSION' + id,
error: error
});
}
},
xhr: function() {
return jQuery.ajaxSettings.xhr();
}
});
最佳答案
AJAX 是为客户端(即浏览器)服务的,别管它了。您的问题可能与 http.request()
中未设置用户代理有关,因此网站不知道谁在请求信息,并因网络机器人问题而排除您的请求。 User-Agent
是标准的 HTTP header ,例如将其设置为 Firefox 的 ua 或任何现有浏览器,它应该很好,例如:
var options = {
hostname: 'goodreads.com/something',
method: 'GET',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'
}
};
但是,当有可用的记录 API 时,废弃 html 页面是不好的做法:http://www.goodreads.com/api你应该把那个 github 页面放在一边......
关于ajax - 我是否需要使用 Ajax 才能不被视为机器人?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36275915/