alsotang / node-lessons

:closed_book:《Node.js 包教不包会》 by alsotang
16.54k stars 4.7k forks source link

lesson 3里面的抓取作者只能抓取一部分。 #35

Open CommanderXL opened 9 years ago

CommanderXL commented 9 years ago

除了抓取title和href属性后抓取author时只能抓取一部分的author. 没整明白是什么原因。


app.get("/",function(req,res,next){
    superagent.get("https://cnodejs.org/")
        .end(function(err,sres){
            //常规的错误请求
            if(err){
                console.log(err.message);
                return res.redirect("/");
            }
            var $=cheerio.load(sres.text);
            var item=[];
            $("#topic_list .topic_title").each(function(idx,element){
                var $element=$(element);
                var href=$element.attr("href");

                item.push({
                        title:$element.attr("title"),   
                        href:$element.attr("href")                                  
                    });
                superagent.get("https://cnodejs.org"+href).end(function(err,ssres){
                    var $$=cheerio.load(ssres.text);
                    item[idx].author=$$("div.changes").find("span:nth-child(2) a").text();
                    console.log(item[idx]);  //这里打印出来的所有数据,一部分有author,一部分没有
                })
            })
            res.send(item);
        })
});

alsotang commented 9 years ago

具体原因不知。但是这个定位定得太烂了,$$("div.changes").find("span:nth-child(2) a") ,尝试换一个比较有逻辑的语法来定位吧。

2015-05-08 12:18 GMT+08:00 XRene notifications@github.com:

除了抓取title和href属性后抓取author时只能抓取一部分的author. 没整明白是什么原因。

app.get("/",function(req,res,next){ superagent.get("https://cnodejs.org/") .end(function(err,sres){ //常规的错误请求 if(err){ console.log(err.message); return res.redirect("/"); } var $=cheerio.load(sres.text); var item=[]; $("#topic_list .topic_title").each(function(idx,element){ var $element=$(element); var href=$element.attr("href");

            item.push({
                    title:$element.attr("title"),
                    href:$element.attr("href")
                });
            superagent.get("https://cnodejs.org"+href).end(function(err,ssres){
                var $$=cheerio.load(ssres.text);
                item[idx].author=$$("div.changes").find("span:nth-child(2) a").text();
                console.log(item[idx]);  //这里打印出来的所有数据,一部分有author,一部分没有
            })
        })
        res.send(item);
    })

});

— Reply to this email directly or view it on GitHub https://github.com/alsotang/node-lessons/issues/35.

Ir1d commented 9 years ago

@alsotang 我按照楼上类似的思路写的之后那几个得不到author的页面是返回503的。。。这是为啥呢?我用Chrome打开没有这个问题阿。。。能不能简要说一下挑战部分是怎样完成的?谢谢

Ir1d commented 9 years ago

是应该按照lesson4里那样写吗?

alsotang commented 9 years ago

控制一下爬虫的速率

2015-10-01 15:52 GMT+08:00 SCaffrey notifications@github.com:

是应该按照lesson4里那样写吗?

— Reply to this email directly or view it on GitHub https://github.com/alsotang/node-lessons/issues/35#issuecomment-144647052 .

Ir1d commented 9 years ago

应该如何控制呢?通过计数器来模拟sleep?

DQPHP commented 9 years ago

今天公司里闲来没事边看边学,做到lesson3,自己看着cheerioAPI写了一下,大神指点一下,感觉很乱

app.get('/', function (req, res, next) {
    superagent.get('https://cnodejs.org/')
        .end(function (err, sres) {
            if (err) {
                return next(err);
            }

            var $ = cheerio.load(sres.text);
            var items = [];
            $('#topic_list .topic_title').each(function (idx, element) {
                var $element = $(element);

                items.push({
                    title: $element.attr('title'),
                    href: $element.attr('href'),
                    author: $element.parents('.cell').find('img').attr('title')
                });
            });

            res.send(items);
        });
});
Ir1d commented 9 years ago

:+1:

alsotang commented 9 years ago

大体上没错啊,剩下的微调一下就好了

2015-11-25 13:35 GMT+08:00 SCaffrey notifications@github.com:

[image: :+1:]

— Reply to this email directly or view it on GitHub https://github.com/alsotang/node-lessons/issues/35#issuecomment-159496421 .

DQPHP commented 9 years ago

结果没有问题,感觉代码丑的一逼。 追求@alsotang 的代码极致elegant体验哈哈。 丑的一逼,也不算丑,主要我写代码好看。 @alsotang 桑搞笑也一流啊!

jadestrong commented 8 years ago

请问nodejs如何控制爬虫速率啊?如果模仿sleep的话会让整个进程都堵塞,得不偿失啊,求指点,3Q

alsotang commented 8 years ago

用 settimeout 模拟 sleep 不会阻塞啊

2016-06-12 16:50 GMT+08:00 YuqiangZhang notifications@github.com:

请问nodejs如何控制爬虫速率啊?如果模仿sleep的话会让整个进程都堵塞,得不偿失啊,求指点,3Q

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/alsotang/node-lessons/issues/35#issuecomment-225417714, or mute the thread https://github.com/notifications/unsubscribe/ABGB7-V5khzMhDwk5RLLbkrliEfe9VPfks5qK8hXgaJpZM4ETTDl .

aimer1124 commented 8 years ago

换了一个思路,从每行找起

app.get('/', function (req, res, next) {
    superagent.get('https://cnodejs.org/')
        .end(function (err, sres) {
            if (err) {
                return next(err);
            }
            var $ = cheerio.load(sres.text);
            var items = [];
            $('.cell').each(function (idx, el) {
                var $el = $(el);
                items.push({
                    title: $el.find('.topic_title').attr('title'),
                    href: $el.find('.topic_title').attr('href'),
                    author:$el.find('img').attr('title')
                });
            });
            res.send(items);
        });
});
WanderLV commented 7 years ago

app.get('/',function(req,res,next){ superagent.get('https://cnodejs.org/') .end(function(err,sres){ if(err){ return next(err); } var $=cheerio.load(sres.text); var items=[]; $('#topic_list .topic_title').each(function(idx,element){ var $element1=$(element); items.push({ title:$element1.attr('title'), href:$element1.attr('href') }) }) $('#topic_list .user_avatar img').each(function(idx,element){ var $element2=$(element); items[idx].author=$element2.attr('title'); }) res.send(items); }) })