codingXiaxw / Crawler

a simple crawler by java
13 stars 12 forks source link

关于知乎部分问题无法抓取完整的问题 #1

Open MR-lulu opened 7 years ago

MR-lulu commented 7 years ago

由于知乎改版了我把正则表达式改成了这样 System.out.println("正在抓取链接"+zhihuUrl);

          String content=Spider.sendGet(zhihuUrl);

          Pattern pattern;
          Matcher matcher;

          pattern=Pattern.compile("<h1 class=\"QuestionHeader-title\">(.+?)</h1>");
          matcher=pattern.matcher(content);
          if (matcher.find()) {
              title = matcher.group(1);
          }

          pattern=Pattern.compile("<span class=\"RichText\".+?>(.+?)</span>");
          matcher=pattern.matcher(content);
          if (matcher.find()) {
              titleDescription=matcher.group(1);
          }

          pattern=Pattern.compile("<span class=\"RichText"
                + " CopyrightRichText-richText.+?>(.+?)</span>");
          matcher=pattern.matcher(content);
          while (matcher.find())
          {

              answers.add(matcher.group(1));
          }

      }

然后部分问题就无法抓取了完整了,有些是标题描述抓取不到,有些是只能抓取到一个回答,不知道什么地方出错了

codingXiaxw commented 7 years ago

能看下你的zhihuUrl的内容吗?知乎已经将协议更新成了https,所以直接复制我给的url不对,要在原url地址的http改成https

codingXiaxw commented 7 years ago

看了下你在知乎上的留言,又来回复你了。仔细对比了下你修改的代码和我zhihu.java中的代码,发现除了正则表达式不一样其他内容都是一样的,你有用我原先的正则表达式试过吗?如果用我以前的正则表达式试过但是没有成功的话,莫非是改版后的知乎将页面元素的命名也改了?这样的话我原先的正则表达式肯定是不正确的。然后我还是打开了我的IDEA,把这个Crawer项目跑了一遍,出现只能抓取到url,而抓不到title、description以及answer的情况,证实了我之前的想法,用我之前的正则表达式是行不通的。再说说你的问题,你的代码和思想都是正确的,之所以出现你说的抓取不到内容的情况,归根结底还是你的正则表达式写的不对,所以改改你的正则表达式吧,这个就不用我帮你解决了吧?有问题再提哈,改了后欢迎发起pr!

MR-lulu commented 7 years ago

额,可能之前的描述不是很准确。我再描述清楚些,我写的代码其实和你的差不多。只是知乎已经改版了所以我把正则表达式给改了。改完之后的确抓取到了东西而且大部分都是对的,只是现在我觉得奇怪的是一个问题下明明有很多回答,但是为什么每个问题最多只能抓到两个回答(我测试过,每个真的只有两个回答)?上面我说的个别问题抓取不到回答,其实是抓到了的,但是只抓到一个。因为打印的时候是直接把answer(ArrayList)打印出来,造成了个别问题抓取不到问题的假象。如果打印answer.get(0)是有东西的,但是打印answer.get(1)就没有了或者直接打印answer也是没有东西的。是不是知乎对爬虫有限制?还是我的正则表达式有问题?(我刚刚又写了一个对知乎用户的爬虫,抓到关注者的时候也是,明明有很多关注的人但是只能抓到前三个关注者)。

codingXiaxw commented 7 years ago

咦,既然能抓到就说明代码和正则表达式没错的,应该不会存在抓不全的问题。不过刚刚搜了下,知乎改版后好像出了反爬虫的策略,爬的速度太快会中断程序啥的,在知乎里面搜的,回答里面有写解决策略,你自己搜搜试试看看就知道了,我最近工作忙没时间再去纠结这个很久以前的项目了。你解决了麻烦提个pr哈!

发自网易邮箱大师 在2017年07月12日 18:15,MR-lulu 写道:

额,可能之前的描述不是很准确。我再描述清楚些,我写的代码其实和你的差不多。只是知乎已经改版了所以我把正则表达式给改了。改完之后的确抓取到了东西而且大部分都是对的,只是现在我觉得奇怪的是一个问题下明明有很多回答,但是为什么每个问题最多只能抓到两个回答(我测试过,每个真的只有两个回答)?上面我说的个别问题抓取不到回答,其实是抓到了的,但是只抓到一个。因为打印的时候是直接把answer(ArrayList)打印出来,造成了个别问题抓取不到问题的假象。如果打印answer.get(0)是有东西的,但是打印answer.get(1)就没有了或者直接打印answer也是没有东西的。是不是知乎对爬虫有限制?还是我的正则表达式有问题?(我刚刚又写了一个对知乎用户的爬虫,抓到关注者的时候也是,明明有很多关注的人但是只能抓到前三个关注者)。

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.