【已解决】Nodejs豆瓣小组爬虫分析与解决。
【已解决】Nodejs豆瓣小组爬虫分析与解决。
豆瓣小组地址: http://www.douban.com/group/ (采用 request、http.get全部是403错误) (ALL)具体小组地址: http://www.douban.com/group/小组ID/ 例如:分页地址 http://www.douban.com/group/kaopulove/discussion?start=数字(采用 request、http.get,还是TM403错误) 该小组下的具体主题地址: http://www.douban.com/group/topic/54905582/(采用 request、http.get,吐血还是403错误)
大伙有没有相应的解决方案呢?demo 等等之类的,这TM的全是403错,这是为毛呢!! 电影的那个爬虫我看过了,测试了是可以爬的。为毛小组爬不了呢? 我也看了不少Python写的爬虫都有爬小组的。为毛nodeJS不行呢?
采用 request.get({url:‘http://www.’,headers:{‘User-Agent’: ‘request’},funaction(err,req,data){})
豆瓣网站对爬虫行为有一定的限制,通常会通过返回403错误来拒绝非授权的请求。为了成功获取数据,我们需要模拟一个正常的浏览器访问,并且可能需要处理一些额外的步骤,比如登录和使用Cookie。
以下是一个简单的Node.js爬虫示例,用于抓取豆瓣小组中的讨论主题。我们将使用axios
库来进行HTTP请求,并使用cheerio
库来解析HTML。
安装依赖
首先,确保安装了所需的库:
npm install axios cheerio
示例代码
const axios = require('axios');
const cheerio = require('cheerio');
// 设置请求头,模拟浏览器访问
const options = {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
};
async function fetchGroupTopics(groupUrl) {
try {
const response = await axios.get(groupUrl, options);
const $ = cheerio.load(response.data);
// 假设每个讨论主题的链接都在一个特定的class里
const topicLinks = [];
$('.title a').each((index, element) => {
const link = $(element).attr('href');
if (link) {
topicLinks.push(link);
}
});
console.log('Found topics:', topicLinks);
} catch (error) {
console.error('Error fetching group topics:', error.message);
}
}
// 替换为实际的小组URL
fetchGroupTopics('https://www.douban.com/group/kaopulove/discussion?start=0');
解释
- 设置请求头:我们设置了
User-Agent
头,以模拟一个常见的浏览器访问。 - 异步函数:使用
async/await
来处理异步操作,使代码更简洁。 - axios请求:使用
axios
发送GET请求到指定的URL。 - cheerio解析:使用
cheerio
来解析返回的HTML内容,提取出所有的讨论主题链接。
注意事项
- 豆瓣网站可能会进一步加强反爬措施,如果遇到更多的限制,可能需要考虑登录并使用Cookie。
- 在实际应用中,建议遵守网站的
robots.txt
文件规定,尊重网站的爬虫政策。
通过上述方法,你应该能够成功地从豆瓣小组中抓取讨论主题。如果遇到更多问题,可以尝试查看豆瓣的API文档,看看是否有官方提供的接口可以使用。
那怕是取页面里的一个字符,也要下载整个页面
懂前端的人都知道,dom树没构建之前,不可能用jquery去取元素,唯一的办法就是用正则表达式
兄台,能否讲明白点呢,是指用正则表达式可以做到吗?
抓取响应方法啊 思路大概是 status==‘200’ 握手握到一半就END就行了。 .on事件。
var jsonreq = http.request(opt, function (serverFeedback) {
if (serverFeedback.statusCode == 200) {
var x='';
serverFeedback.setEncoding('utf8');
serverFeedback.on('data',function(data){x += data;});
serverFeedback.on('end',function(){req.session.json=JSON.parse(x);eval(point)});
}
else {
req.session.json='error';
}
});
jsonreq.write(data);
jsonreq.end();
}
拿这个拆吧
怎么解决的?
常规的解决,模拟用户登录 在请求头部中加东西headers:{‘User-Agent’: ‘request’} request.get({url:‘http://www.’,headers:{‘User-Agent’: ‘request’},funaction(err,req,data){})
已经解决,谢谢。
为何不直接通过API爬,这样还要处理dom多麻烦
豆瓣小组有API吗?
豆瓣网站对爬虫请求通常会进行限制,尤其是频繁或不合法的请求。当你使用 request
或 http.get
发送请求时,如果被豆瓣服务器识别为爬虫,可能会返回 403 错误(禁止访问)。你可以尝试通过模拟浏览器行为来解决这个问题。
以下是一些可能的解决方案:
- 更改 User-Agent: 模拟浏览器的 User-Agent 字段,这样豆瓣服务器更有可能认为你的请求来自一个正常的浏览器。
- 设置 Cookie: 如果需要登录后才能访问某些内容,可以尝试保存并传递 Cookie。
- 设置代理: 使用代理服务器以减少被封禁的风险。
示例代码
const axios = require('axios');
const cheerio = require('cheerio');
async function fetchDoubanGroupData() {
const url = 'http://www.douban.com/group/kaopulove/discussion?start=0';
const response = await axios.get(url, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
});
if (response.status === 200) {
const $ = cheerio.load(response.data);
const titles = [];
$('.olt .title a').each((index, element) => {
titles.push($(element).text());
});
console.log(titles);
} else {
console.error('Failed to fetch data from Douban Group:', response.status);
}
}
fetchDoubanGroupData().catch(console.error);
解释
- Axios 是一个流行的 HTTP 客户端,它支持 Promise 风格的 API,比原生的
http.get
更简洁易用。 - Cheerio 是一个轻量级的 DOM 操作库,用于解析 HTML 文档并提取数据。
User-Agent
被设置为常见的浏览器标识,以减少被豆瓣服务器识别为爬虫的可能性。
这种方法可能会解决一些问题,但请注意豆瓣网站仍然可能对其服务进行保护,频繁或不当的抓取可能会导致 IP 被封禁。因此,在实际操作中建议遵守网站的 robots.txt 文件,并保持合理的抓取频率。