我正在尝试网络抓取一个网站,这样我就可以为一个项目收集一些信息,这是我的代码,它在控制台403中返回。我正在使用request和cheerio来做这件事,为什么会这样呢?注意:我知道大多数状态码是什么意思。
const request = require('request');
const cheerio = require('cheerio');
request('http://www.realmeye.com/forum/', function(err, resp, html) {
if (!err) {
const gatherInformation = cheerio.load(html);
console.log(html);
}
})发布于 2019-08-14 01:45:42
你应该在请求中添加一个"User-Agent“头,它适用于某些浏览器(例如chrome)。服务器可能会检查它以避免不熟悉的客户端。
web抓取的一个经验法则:在尝试在你的框架上重现请求之前,使用chrome dev tools / fiddler /其他类似的工具来检查从你的客户端(chrome,firefox等)触发的请求(检查头文件,cookie等)。
我在你的案例中在Fiddler上看到的原始请求(当在chrome上点击你的url时):
GET /forum/ HTTP/1.1
Host: www.realmeye.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
Sec-Fetch-Mode: same-origin
Sec-Fetch-Site: same-origin
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,he;q=0.8大多数服务器在返回200OK响应之前都会检查"Accept“和"User-Agent”报头。
修复的代码片段:
const request = require('request');
const cheerio = require('cheerio');
let options = {
url: 'https://www.realmeye.com/forum/',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
}
};
request(options, function(err, resp, html) {
if (!err) {
const gatherInformation = cheerio.load(html);
console.log(html);
}
})https://stackoverflow.com/questions/57482563
复制相似问题