【已解决】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){})


12 回复

豆瓣网站对爬虫行为有一定的限制,通常会通过返回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');

解释

  1. 设置请求头:我们设置了User-Agent头,以模拟一个常见的浏览器访问。
  2. 异步函数:使用async/await来处理异步操作,使代码更简洁。
  3. axios请求:使用axios发送GET请求到指定的URL。
  4. 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吗?

豆瓣网站对爬虫请求通常会进行限制,尤其是频繁或不合法的请求。当你使用 requesthttp.get 发送请求时,如果被豆瓣服务器识别为爬虫,可能会返回 403 错误(禁止访问)。你可以尝试通过模拟浏览器行为来解决这个问题。

以下是一些可能的解决方案:

  1. 更改 User-Agent: 模拟浏览器的 User-Agent 字段,这样豆瓣服务器更有可能认为你的请求来自一个正常的浏览器。
  2. 设置 Cookie: 如果需要登录后才能访问某些内容,可以尝试保存并传递 Cookie。
  3. 设置代理: 使用代理服务器以减少被封禁的风险。

示例代码

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 文件,并保持合理的抓取频率。

回到顶部