java实现爬取知乎用户基本信息
程序员文章站
2024-03-12 10:56:26
本文实例为大家分享了一个基于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; }
效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助。