昨天,咱们已经利用Jsoup技术实现了一个简单的爬虫,原理很简单,主要是要先分析页面,拿到条件,而后就去匹配url,采用dome解析的方式循环抓取咱们须要的数据,从而便可轻松实现一个简单的爬虫。那么,昨天咱们说了,咱们昨天只是爬取了一页的数据也就是第一页的数据,若想获取分页的所有数据该怎么写呢?正好,今天朋友托我帮忙买一种药,说是她那边没有,因而,我就查询了一下佛山的各大药店,利用咱们刚学的爬虫技术,咱们今天就来实现一下爱帮网上佛山药店的分布列表。html
1、需求分析web
首先,咱们登录爱帮网,选择城区以及输入关键字,咱们输入的是“药店”,点击搜索按钮,咱们打开控制台,观察头信息,以下图:dom
咱们经过观察能够看到请求的url地址以及参数;其实直接看地址栏就能够看得出来,咱们点击第二页发现其余参数都不变,只有参数p的值随页码的变化而变化。那么,这样以来,咱们就能够知道每一页的请求地址其实都是同样的,只要改变p的值便可,而后咱们看页面总页数只有8页,数据量不大,写个循环循环8次便可。下面咱们就来开始实现,依然在昨天的代码的基础上改一改便可。ide
2、开发测试
一、咱们首先须要改一下咱们的业务实现类,由于取值的方式已经不同了,以下图:网站
咱们要去的class为aside中的内容,一样是拿到<a>标签,可是咱们观察得知页面有不少的<a>标签,咱们要取得咱们须要的,以下图:url
/* * 提取结果中的连接地址和连接标题,返回数据 */ for(Element result : results){ Elements links = result.getElementsByTag("a");//能够拿到连接 for(Element link : links){ if(link.siblingElements().hasClass("num")){ String id = link.siblingElements().text(); String linkText = link.text(); LinkTypeData data1 = new LinkTypeData(); if(id!=null && linkText!=null){ data1.setId(id); data1.setLinkText(linkText); } datas.add(data1); } if(link.parent().parent().hasClass("part1")){ LinkTypeData data2 = new LinkTypeData(); String address = link.parent().siblingElements().text(); if(address!=null){ data2.setSummary(address); } datas.add(data2); } if(link.parent().siblingElements().tagName("span").hasClass("biztel")){ LinkTypeData data3 = new LinkTypeData(); String telnum = link.parent().siblingElements().tagName("span").text(); if(telnum!=null){ data3.setContent(telnum); } datas.add(data3); } } // 对取得的html中的 出现问号乱码进行处理 /*linkText = new String(linkText.getBytes(),"GBK").replace('?', ' ').replace(' ', ' '); String id = link.parent().firstElementSibling().text(); id = new String(id.getBytes(),"GBK").replace('?', ' ').replace(' ', ' '); String address = link.parent().nextElementSibling().text(); address = new String(address.getBytes(),"GBK").replace('?', ' ').replace(' ', ' '); String code = link.parent().lastElementSibling().text(); code = new String(code.getBytes(),"GBK").replace('?', ' ').replace(' ', ' ');*/ /*data.setSummary(address); data.setContent(code); data.setId(id);*/ } return datas; }
咱们在昨天的代码基础上进行了更改。这样就取得了咱们想要的数据。spa
3、测试code
接下来咱们就能够改一下咱们的测试类,咱们须要循环8次,而每一次获取到的数据咱们都存进一个新的集合中,而后最后再拿出新的集合的数据写进Excel。htm
/** * 不带查询参数 * @author AoXiang * 2017年3月21日 */ @org.junit.Test public void getDataByClass() throws IOException{ List<LinkTypeData> newList = new ArrayList<LinkTypeData>(); for(int i=1;i<=8;i++){ Rule rule = new Rule( "http://www.aibang.com/?area=bizsearch2&cmd=bigmap&city=%E4%BD%9B%E5%B1%B1&a=%E5%8D%97%E6%B5%B7%E5%8C%BA&q=%E8%8D%AF%E5%BA%97&as=5000&ufcate=&rc=1&zone=&quan=&fm=&p="+i, null,null, "aside", Rule.CLASS, Rule.POST); List<LinkTypeData> datas = ExtractService.extract(rule); for(int j=0;j<datas.size();j++){ newList.add(datas.get(j)); } } // 第一步,建立一个webbook,对应一个Excel文件 HSSFWorkbook wb = new HSSFWorkbook(); // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = wb.createSheet("佛山药店"); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short HSSFRow row = sheet.createRow((int) 0); // 第四步,建立单元格,并设置值表头 设置表头居中 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 建立一个居中格式 HSSFCell cell = row.createCell((short) 0); cell.setCellValue("序号"); cell.setCellStyle(style); cell = row.createCell((short) 1); cell.setCellValue("药店名称"); cell.setCellStyle(style); cell = row.createCell((short) 2); cell.setCellValue("地址"); cell.setCellStyle(style); cell = row.createCell((short) 3); cell.setCellValue("电话"); cell.setCellStyle(style); for(int m=0;m<newList.size();m++){ // 第五步,写入实体数据 row = sheet.createRow((int)m + 1); // 第四步,建立单元格,并设置值 row.createCell((short) 0).setCellValue(newList.get(m).getId()); row.createCell((short) 1).setCellValue(newList.get(m).getLinkText()); row.createCell((short) 2).setCellValue(newList.get(m).getSummary()); row.createCell((short) 3).setCellValue(newList.get(m).getContent()); } // 第六步,将文件存到指定位置 try { FileOutputStream fout = new FileOutputStream("F:/佛山药店.xls"); wb.write(fout); fout.close(); } catch (Exception e) { e.printStackTrace(); } }
咱们运行一下看结果:
好了,咱们已经拿到咱们须要的数据了,而后就能够对这些数据进行分析,为我么所用。
其实,这只是一个简单的网站,通常如今的网站有些分页是JS动态获取的,咱们看不到分页信息,那么,这就须要咱们灵活应变,爬虫技术也不是只有这一种,然而万变不离其宗,掌握了要领和方法,相信不会有任何困难。
源码就不用上传了,有兴趣的同窗能够参考一下,其实就是改了两处地方。
若是您对代码有什么异议欢迎您的留言,咱们一块儿交流!