Java爬蟲獲取招聘信息生成Excel表格

抓取的結(jié)果
Java_應(yīng)屆畢業(yè)生_深圳

項目地址
https://github.com/ishare20/JobInformation

思路:

  • 明確需要爬取的信息
  • 分析網(wǎng)頁結(jié)構(gòu)
  • 分析爬取流程
  • 優(yōu)化

明確需要爬取的信息

職位名稱
工資
職位描述
公司名稱
公司主頁
詳情網(wǎng)頁

分析網(wǎng)頁結(jié)構(gòu)

目標網(wǎng)站 拉勾網(wǎng)

json

網(wǎng)站使用json作為交互數(shù)據(jù)咆贬,分析json數(shù)據(jù)灌砖,需要的json關(guān)鍵數(shù)據(jù)

totalCount :查詢總數(shù)嚼摩,用來算頁數(shù),每個頁面顯示15條搀菩,總數(shù)/15得到頁數(shù),大于30只能顯示30頁
positionId :位置id芹缔,用來進入詳情頁秋度,詳情頁網(wǎng)址結(jié)構(gòu)為https://www.lagou.com/jobs/positionId.html

詳情頁網(wǎng)頁分析:查看需要的信息所在的位置,使用Jsoup來解析網(wǎng)頁

分析爬取流程

1.獲取所有的positionId生成詳情頁惯疙,存放在一個存放網(wǎng)址列表中List<String> joburls
2.獲取每個詳情頁并解析為Job類翠勉,得到一個存放Job類的列表List<Job> jobList
3.把List<Job> jobList存進Excel表格中

Java操作Excel需要用到j(luò)xl

關(guān)鍵代碼實現(xiàn)

public List<String> getJobUrls(String gj,String city,String kd){

        String pre_url="https://www.lagou.com/jobs/";
        String end_url=".html";
        String url;
        if (gj.equals("")){

            url="http://www.lagou.com/jobs/positionAjax.json?px=default&city="+city+"&needAddtionalResult=false&first=false&pn="+pn+"&kd="+kd;

        }else {

            url="https://www.lagou.com/jobs/positionAjax.json?gj="+gj+"&px=default&city="+city+"&needAddtionalResult=false&first=false&pn="+pn+"&kd="+kd;

        }


        String rs=getJson(url);
        System.out.println(rs);
        int total= JsonPath.read(rs,"$.content.positionResult.totalCount");//獲取總數(shù)
        int pagesize=total/15;
        if (pagesize>=30){
            pagesize=30;
        }

        System.out.println(total);
       // System.out.println(rs);

        List<Integer> posid=JsonPath.read(rs,"$.content.positionResult.result[*].positionId");//獲取網(wǎng)頁id

        for (int j=1;j<=pagesize;j++){  //獲取所有的網(wǎng)頁id
            pn++;  //更新頁數(shù)
            url="https://www.lagou.com/jobs/positionAjax.json?gj="+gj+"&px=default&city="+city+"&needAddtionalResult=false&first=false&pn="+pn+"&kd="+kd;
            String rs2=getJson(url);
            List<Integer> posid2=JsonPath.read(rs2,"$.content.positionResult.result[*].positionId");
            posid.addAll(posid2); //添加解析的id到第一個list
        }

        List<String> joburls=new ArrayList<>();
        //生成網(wǎng)頁列表
        for (int id:posid){
            String url3=pre_url+id+end_url;
            joburls.add(url3);
        }
        return joburls;

    }

    public Job getJob(String url){  //獲取工作信息
        Job job=new Job();
        Document document= null;
        document = Jsoup.parse(getJson(url));

        job.setJobname(document.select(".name").text());
        job.setSalary(document.select(".salary").text());
        String joball=HtmlTool.tag(document.select(".job_bt").select("div").html());//清除html標簽
        job.setJobdesc(joball);//職位描述包含要求
        job.setCompany(document.select(".b2").attr("alt"));
        Elements elements=document.select(".c_feature");
        //System.out.println(document.select(".name").text());
        job.setCompanysite(elements.select("a").attr("href")); //獲取公司主頁
        job.setJobdsite(url);
        return job;
    }
void insertExcel(List<Job> jobList) throws IOException, BiffException, WriteException {
       int row=1;
        Workbook wb = Workbook.getWorkbook(new File(JobCondition.filename));
        WritableWorkbook book = Workbook.createWorkbook(new File(JobCondition.filename), wb);
        WritableSheet sheet=book.getSheet(0);
        for (int i=0;i<jobList.size();i++){   //遍歷工作列表,一行行插入到表格中
            sheet.addCell(new Label(0,row,jobList.get(i).getJobname()));
            sheet.addCell(new Label(1,row,jobList.get(i).getSalary()));
            sheet.addCell(new Label(2,row,jobList.get(i).getJobdesc()));
            sheet.addCell(new Label(3,row,jobList.get(i).getCompany()));
            sheet.addCell(new Label(4,row,jobList.get(i).getCompanysite()));
            sheet.addCell(new Label(5,row,jobList.get(i).getJobdsite()));
            row++;
        }
        book.write();
        book.close();
    }

優(yōu)化

在爬取比較多數(shù)據(jù)的時候霉颠,很慢对碌,分析整個流程:
從網(wǎng)址詳情頁列表List<String> joburls中獲取第一個網(wǎng)址————>獲取網(wǎng)頁并解析————>添加到工作列表List<Job> jobList中;

從網(wǎng)址詳情頁列表List<String> joburls中獲取第二個網(wǎng)址————>獲取網(wǎng)頁并解析————>添加到工作列表List<Job> jobList中;

......循環(huán)到網(wǎng)頁列表結(jié)束,每次執(zhí)行都需要等待前一個執(zhí)行完才可以重新發(fā)起請求獲取網(wǎng)頁蒿偎,這時可以使用多線程來優(yōu)化朽们,開啟多線程獲取網(wǎng)頁,主線程等下獲取網(wǎng)頁的子線程結(jié)束后诉位,再執(zhí)行寫入Excel表格操作骑脱。

遇到的問題

有時候抓取太快,直接返回錯誤信息
抓取次數(shù)太多苍糠,被禁止訪問叁丧,隔了一段時間才可以
網(wǎng)站有反爬蟲機制
忘了一個重要的問題,還要分析這些數(shù)據(jù)

參考資料:

https://jsoup.org/
http://www.cnblogs.com/raymond19840709/archive/2008/06/26/1230289.html
https://github.com/json-path/JsonPath

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椿息,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坷衍,更是在濱河造成了極大的恐慌寝优,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枫耳,死亡現(xiàn)場離奇詭異乏矾,居然都是意外死亡,警方通過查閱死者的電腦和手機迁杨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門钻心,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铅协,你說我怎么就攤上這事捷沸。” “怎么了狐史?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵痒给,是天一觀的道長说墨。 經(jīng)常有香客問我,道長苍柏,這世上最難降的妖魔是什么尼斧? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮试吁,結(jié)果婚禮上棺棵,老公的妹妹穿的比我還像新娘。我一直安慰自己熄捍,他們只是感情好烛恤,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著治唤,像睡著了一般棒动。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宾添,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天船惨,我揣著相機與錄音,去河邊找鬼。 笑死俄讹,一個胖子當著我的面吹牛壮莹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怜浅,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔬崩!你這毒婦竟也來了恶座?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤沥阳,失蹤者是張志新(化名)和其女友劉穎跨琳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桐罕,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡脉让,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了功炮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溅潜。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖薪伏,靈堂內(nèi)的尸體忽然破棺而出滚澜,到底是詐尸還是另有隱情,我是刑警寧澤嫁怀,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布博秫,位于F島的核電站潦牛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挡育。R本人自食惡果不足惜巴碗,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望即寒。 院中可真熱鬧橡淆,春花似錦、人聲如沸母赵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凹嘲。三九已至师倔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間周蹭,已是汗流浹背趋艘。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凶朗,地道東北人瓷胧。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像棚愤,于是被迫代替她去往敵國和親搓萧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,757評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理宛畦,服務(wù)發(fā)現(xiàn)瘸洛,斷路器,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 圖文/江南海北的雪 認識簡書已經(jīng)有幾個月了次和。記得在簡書的第一篇文章是《那就把簡書作為新起點》反肋,在這篇短文里我介紹了...
    江南海北的雪閱讀 1,646評論 36 13
  • 手機代替了水燃少,食物束亏,空氣成為了人最離不開的東西。 但是阵具,低頭玩手機的危害碍遍,你真的清楚嗎定铜? 1.皮膚老化 皮膚科醫(yī)生...
    伴小羊閱讀 344評論 0 1