欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實(shí)現(xiàn)爬取知乎用戶基本信息

 更新時(shí)間:2016年05月24日 16:24:45   作者:臥顏沉默  
這篇文章主要為大家介紹了一個(gè)基于JAVA的知乎爬蟲,抓取知乎用戶基本信息,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了一個(gè)基于JAVA的知乎爬蟲,抓取知乎用戶基本信息,基于HttpClient 4.5,供大家參考,具體內(nèi)容如下
詳細(xì)內(nèi)容:
抓取90W+用戶信息(基本上活躍的用戶都在里面)
大致思路:
1.首先模擬登錄知乎,登錄成功后將Cookie序列化到磁盤,不用以后每次都登錄(如果不模擬登錄,可以直接從瀏覽器塞入Cookie也是可以的)。
2.創(chuàng)建兩個(gè)線程池和一個(gè)Storage。一個(gè)抓取網(wǎng)頁線程池,負(fù)責(zé)執(zhí)行request請求,并返回網(wǎng)頁內(nèi)容,存到Storage中。另一個(gè)是解析網(wǎng)頁線程池,負(fù)責(zé)從Storage中取出網(wǎng)頁內(nèi)容并解析,解析用戶資料存入數(shù)據(jù)庫,解析該用戶關(guān)注的人的首頁,將該地址請求又加入抓取網(wǎng)頁線程池。一直循環(huán)下去。
3.關(guān)于url去重,我是直接將訪問過的鏈接md5化后存入數(shù)據(jù)庫,每次訪問前,查看數(shù)據(jù)庫中是否存在該鏈接。
到目前為止,抓了100W用戶了,訪問過的鏈接220W+。現(xiàn)在抓取的用戶都是一些不太活躍的用戶了。比較活躍的用戶應(yīng)該基本上也抓完了。
項(xiàng)目地址:https://github.com/wycm/mycrawler
實(shí)現(xiàn)代碼:

作者:臥顏沉默
鏈接:https://www.zhihu.com/question/36909173/answer/97643000
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
 
 /**
  *
  * @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");//肉眼識(shí)別驗(yàn)證碼
formParams.add(new BasicNameValuePair("captcha", yzm));
formParams.add(new BasicNameValuePair("_xsrf", ""));//這個(gè)參數(shù)可以不用
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;
}
}
/**
  * 肉眼識(shí)別驗(yàn)證碼
  * @param httpClient Http客戶端
  * @param context Http上下文
  * @param url 驗(yàn)證碼地址
  * @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;
}

效果圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • RateLimiter 源碼分析

    RateLimiter 源碼分析

    本文主要對ratelimiter的常用方法以及源碼進(jìn)行了分析解讀,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Java微服務(wù)間接口調(diào)用 feign

    Java微服務(wù)間接口調(diào)用 feign

    這篇文章主要介紹了微服務(wù)間的接口調(diào)用feign,F(xiàn)eign是一種聲明式、模板化的HTTP客戶端。在spring cloud中使用Feign,可以做到類似于普通的接口的請求調(diào)用,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • 淺析Java的Spring框架中IOC容器容器的應(yīng)用

    淺析Java的Spring框架中IOC容器容器的應(yīng)用

    這篇文章主要介紹了Java的Spring框架中IOC容器容器的應(yīng)用,包括BeanFactory容器和ApplicationContext容器的介紹,需要的朋友可以參考下
    2015-12-12
  • Spring?invokeBeanFactoryPostProcessors方法刨析源碼

    Spring?invokeBeanFactoryPostProcessors方法刨析源碼

    invokeBeanFactoryPostProcessors該方法會(huì)實(shí)例化所有BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的實(shí)例并且執(zhí)行postProcessBeanFactory與postProcessBeanDefinitionRegistry方法
    2023-01-01
  • java HashMap通過value反查key的代碼示例

    java HashMap通過value反查key的代碼示例

    本文講解了java HashMap通過value反查key的方法,直接提供代碼供大家參考使用
    2013-11-11
  • 詳解Java中異步轉(zhuǎn)同步的六種方法

    詳解Java中異步轉(zhuǎn)同步的六種方法

    針對應(yīng)用中異步調(diào)用,能不能像同步調(diào)用一樣立刻獲取到命令的執(zhí)行結(jié)果,如何實(shí)現(xiàn)異步轉(zhuǎn)同步?不要擔(dān)心,本文就來為大家詳細(xì)講講Java中異步轉(zhuǎn)同步的六種方法,感興趣的可以了解一下
    2022-06-06
  • Java狀態(tài)機(jī)的一種優(yōu)雅寫法分享

    Java狀態(tài)機(jī)的一種優(yōu)雅寫法分享

    狀態(tài)機(jī)是一種數(shù)學(xué)模型,對于我們業(yè)務(wù)實(shí)現(xiàn)有很大的幫助。我們可以用非常多的方法實(shí)現(xiàn)狀態(tài)機(jī),這篇文章就來介紹一個(gè)狀態(tài)機(jī)優(yōu)雅的實(shí)現(xiàn)方法,希望對大家有所幫助
    2023-04-04
  • ThreadLocal常用方法、使用場景及注意事項(xiàng)說明

    ThreadLocal常用方法、使用場景及注意事項(xiàng)說明

    這篇文章主要介紹了ThreadLocal常用方法、使用場景及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java中Console對象實(shí)例代碼

    Java中Console對象實(shí)例代碼

    這篇文章主要介紹了Java中Console對象實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Spring容器注入bean的五種方法逐個(gè)解析

    Spring容器注入bean的五種方法逐個(gè)解析

    依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是同一個(gè)概念。具體含義是:當(dāng)某個(gè)角色(可能是一個(gè)Java實(shí)例,調(diào)用者)需要另一個(gè)角色(另一個(gè)Java實(shí)例,被調(diào)用者)的協(xié)助時(shí),在傳統(tǒng)的程序設(shè)計(jì)過程中,通常由調(diào)用者來創(chuàng)建被調(diào)用者的實(shí)例
    2023-02-02

最新評(píng)論