最近使用java实现了一个简单的网页数据抓取,下面是实现原理及实现代码:
原理:使用java.net下面的URL对象获取一个链接,下载目标网页的源代码,利用jsoup解析源代码中的数据,获取你想要的内容
1.首先是根据网址下载源代码:
/** * 根据网址和编码下载源代码 * @param url 目标网址 * @param encoding 编码 * @return */ public static String getHtmlResourceByURL(String url,String encoding){ //存储源代码容器 StringBuffer buffer = new StringBuffer(); URL urlObj = null; URLConnection uc = null; InputStreamReader isr = null; BufferedReader br =null; try { //建立网络连接 urlObj = new URL(url); //打开网络连接 uc = urlObj.openConnection(); //建立文件输入流 isr = new InputStreamReader(uc.getInputStream(),encoding); InputStream is = uc.getInputStream(); //建立文件缓冲写入流 br = new BufferedReader(isr); FileOutputStream fos = new FileOutputStream("F:\\java-study\\downImg\\index.txt"); //建立临时变量 String temp = null; while((temp = br.readLine()) != null){ buffer.append(temp + "\n"); } // fos.write(buffer.toString().getBytes()); // fos.close(); } catch (MalformedURLException e) { e.printStackTrace(); System.out.println("网络不给力,请检查网络设置。。。。"); }catch (IOException e){ e.printStackTrace(); System.out.println("你的网络连接打开失败,请稍后重新尝试!"); }finally { try { isr.close(); } catch (IOException e) { e.printStackTrace(); } } return buffer.toString(); }
2.根据下载源代码解析数据,获取你想要的内容,这里我获取的是图片,你也可以获取贴吧里邮箱,电话号码等
/** * 获取图片路劲 * @param url 网络路径 * @param encoding 编码 */ public static void downImg(String url,String encoding){ String resourceByURL = getHtmlResourceByURL(url, encoding); //2.解析源代码,根据网络图像地址,下载到服务器 Document document = Jsoup.parse(resourceByURL); //获取页面中所有的图片标签 Elements elements = document.getElementsByTag("img"); for(Element element:elements){ //获取图像地址 String src = element.attr("src"); //包含http开头 if (src.startsWith("http") && src.indexOf("jpg") != -1) { getImg(src, "F:\\java-study\\downImg"); } } }
3.根据获取的图片路径,下载图片,这里我下载的是携程网的内容
/** * 下载图片 * @param imgUrl 图片地址 * @param filePath 存储路劲 * */ public static void getImg(String imgUrl,String filePath){ String fileName = imgUrl.substring(imgUrl.lastIndexOf("/")); try { //创建目录 File files = new File(filePath); if (!files.exists()) { files.mkdirs(); } //获取地址 URL url = new URL(imgUrl); //打开连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //获取输入流 InputStream is = connection.getInputStream(); File file = new File(filePath + fileName); //建立问价输入流 FileOutputStream fos = new FileOutputStream(file); int temp = 0; while((temp = is.read()) != -1){ fos.write(temp); } is.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } }
最后是调用过程
public static void main(String[] args) { //1.根据网址和页面编码集获取网页源代码 String encoding = "gbk"; String url = "http://vacations.ctrip.com/"; //2.解析源代码,根据网络图像地址,下载到服务器 downImg(url, encoding); }
总结:根据上面的实现的简单数据爬取,存在着一些问题,我爬取的旅游页面有很多图片,根据img属性获取其src中的地址,从而下载该图片,但是该页面有很多图片,结果自己却只能爬到一小部分,如下图:
我将下载的源代码写入文件,和原网页中做对比,基本上页面旅游的图片一张没有,源代码中也没有,不知道为什么,请求广大网友的解答