欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现爬取知乎用户基本信息

程序员文章站 2024-03-11 18:47:43
本文实例为大家分享了一个基于java的知乎爬虫,抓取知乎用户基本信息,基于httpclient 4.5,供大家参考,具体内容如下 详细内容: 抓取90w+用户信息(基本...

本文实例为大家分享了一个基于java的知乎爬虫,抓取知乎用户基本信息,基于httpclient 4.5,供大家参考,具体内容如下
详细内容:
抓取90w+用户信息(基本上活跃的用户都在里面)
大致思路:
1.首先模拟登录知乎,登录成功后将cookie序列化到磁盘,不用以后每次都登录(如果不模拟登录,可以直接从浏览器塞入cookie也是可以的)。
2.创建两个线程池和一个storage。一个抓取网页线程池,负责执行request请求,并返回网页内容,存到storage中。另一个是解析网页线程池,负责从storage中取出网页内容并解析,解析用户资料存入数据库,解析该用户关注的人的首页,将该地址请求又加入抓取网页线程池。一直循环下去。
3.关于url去重,我是直接将访问过的链接md5化后存入数据库,每次访问前,查看数据库中是否存在该链接。
到目前为止,抓了100w用户了,访问过的链接220w+。现在抓取的用户都是一些不太活跃的用户了。比较活跃的用户应该基本上也抓完了。
项目地址:
实现代码:

作者:卧颜沉默
链接:https://www.zhihu.com/question/36909173/answer/97643000
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
 /**
  *
  * @param httpclient http客户端
  * @param context http上下文
  * @return
  */
public boolean login(closeablehttpclient httpclient, httpclientcontext context){
string yzm = null;
string loginstate = null;
httpget getrequest = new httpget("https://www.zhihu.com/#signin");
httpclientutil.getwebpage(httpclient,context, getrequest, "utf-8", false);
httppost request = new httppost("https://www.zhihu.com/login/email");
list<namevaluepair> formparams = new arraylist<namevaluepair>();
yzm = yzm(httpclient, context,"https://www.zhihu.com/captcha.gif?type=login");//肉眼识别验证码
formparams.add(new basicnamevaluepair("captcha", yzm));
formparams.add(new basicnamevaluepair("_xsrf", ""));//这个参数可以不用
formparams.add(new basicnamevaluepair("email", "邮箱"));
formparams.add(new basicnamevaluepair("password", "密码"));
formparams.add(new basicnamevaluepair("remember_me", "true"));
urlencodedformentity entity = null;
try {
entity = new urlencodedformentity(formparams, "utf-8");
} catch (unsupportedencodingexception e) {
e.printstacktrace();
}
request.setentity(entity);
loginstate = httpclientutil.getwebpage(httpclient,context, request, "utf-8", false);//登录
jsonobject jo = new jsonobject(loginstate);
if(jo.get("r").tostring().equals("0")){
system.out.println("登录成功");
getrequest = new httpget("https://www.zhihu.com");
httpclientutil.getwebpage(httpclient,context ,getrequest, "utf-8", false);//访问首页
httpclientutil.serializeobject(context.getcookiestore(),"resources/zhihucookies");//序列化知乎cookies,下次登录直接通过该cookies登录
return true;
}else{
system.out.println("登录失败" + loginstate);
return false;
}
}
/**
  * 肉眼识别验证码
  * @param httpclient http客户端
  * @param context http上下文
  * @param url 验证码地址
  * @return
  */
public string yzm(closeablehttpclient httpclient,httpclientcontext context, string url){
httpclientutil.downloadfile(httpclient, context, url, "d:/test/", "1.gif",true);
scanner sc = new scanner(system.in);
string yzm = sc.nextline();
return yzm;
}

效果图:

java实现爬取知乎用户基本信息

java实现爬取知乎用户基本信息

以上就是本文的全部内容,希望对大家的学习有所帮助。