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)

目標(biāo)網(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標(biāo)簽
        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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容