java自己写的网络爬虫

前言:学习了java中io流,总想干个什么,于是想到了网络爬虫。在实际的coding中,才发现io流真的很不错。

功能:爬取页面图片

图片展示:


代码部分:(1)PaChongMain.java

package my.first;

import java.util.ArrayList;
import java.util.List;

public class PaChongMain {
/**
* 传入一个网址
*/
public static void main(String[] args) {
long startTime=System.currentTimeMillis(); 
//String url="http://588ku.com/";
String url="http://www.mmonly.cc/gxtp/";  //输入网址
//String url="http://image.baidu.com/";  //百度获取不到全部的html
GetHtml getHtml=new GetHtml();   
String html=getHtml.getUrl(url);//获取html字符串
//System.out.println(html);
GetImgSrc getImgSrc=new GetImgSrc();  //
List<String> out=new ArrayList<String>();//储存爬取的图片的网络地址
out=getImgSrc.getSrc(html);         //html与img的正则匹配
SaveImage saveImage=new SaveImage();  //根据图片的地址保存图片
saveImage.save(out);                //保存的方法 
long endTime=System.currentTimeMillis(); 
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
}

代码部分:(2)GetHtml.java

package my.first;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetHtml {

public  String    getUrl(String web){
URL url=null;
InputStream input=null;
FileOutputStream out=null;
StringBuffer string=new StringBuffer();
List<String> result=new ArrayList<String>();
int aa=0;
for (int j = 0; j < 20; j++) {

try{
//string=new StringBuffer();
   url=new URL(web);
   URLConnection connection=url.openConnection();//打开url连接
    input=connection.getInputStream();//得到输入流
   //input=new FileInputStream("D:\\bai.txt");  //文本输入流,从文本导入html
   System.out.println(input.toString());
   out=new FileOutputStream("D:\\img.txt",true);//对应的输出流
   int len=0;//能读到字节个数
   byte[] a=new byte[1024];
   while((len=input.read(a))!=-1){
out.write(a,0,len);  //输出到本地
char[] b=new char[1024];
for(int i=0;i<len;i++){
b[i]=(char)a[i];
}
string.append(b);    //输入数据到可变字符串数组
   }
}
catch (Exception e) {
// TODO: handle exception
}
//找出此html中的其他的链接地址
while(aa<1){
String OtherHrefRegx="href=\"([\\d\\s\\w./:]+(\\.html))\"";
String OtherHref=string.toString();

    Pattern p=Pattern.compile(OtherHrefRegx);
    Matcher m=p.matcher(OtherHref);
    while(m.find()){
    String s=m.group(1);
    if(s.indexOf("http")==-1){
    s="http://bpic.588ku.com"+s;//增加一些不是完整的html
    }
    result.add(s);
    }
    for(String str:result){
    System.out.println(str);
     
    }
    aa=1;
}   //while语句的结束
web=result.get(j);
}  //循环语句的结束

try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return string.toString();
}
}

代码部分:(3)GetImgSrc.java

package my.first;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GetImgSrc {
         public  List<String> getSrc(String html){
        //匹配图片的地址
        String regx="src=\"([\\d\\s\\w./:]+(\\.jpg|\\.png|\\.gif))\"";
        List<String> result=new ArrayList<String>();
        Pattern p=Pattern.compile(regx);
        Matcher m=p.matcher(html);
        while(m.find()){
        String s=m.group(1);
        if(s.indexOf("http")==-1){
        s="http://www.mmonly.cc"+s;//增加一些不是完整的html
        }
        result.add(s);
        }
        int i=0;
        for(String str:result){
        i++;
        System.out.println(str);
        }
        System.out.println(i);
        return result;
         }
}


代码部分:(4)SaveImage.java

package my.first;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;

public class SaveImage {
      public void save(List<String> out) {
     File file=new File("D:\\image");//存放的文件夹
     if(!file.exists()){
     file.mkdir();
     }
     InputStream input=null;
     FileOutputStream os=null;
     for (int i= 0; i <200; i++) {
     String string=out.get(i);
     String st=string.substring(string.length()-4,string.length());
      File file2=new File(file,i+st);
      try {
//file2.createNewFile();
    URL url=new URL(string);
    input=url.openStream();
    os=new FileOutputStream(file2);
    int len=0;
    byte[] b=new byte[1024];
    while((len=input.read(b))!=-1){
    os.write(b,0,len);
    }
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     
     }
     try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
      }
}


尾声:实践是检验真理的唯一标准。别人写好的代码,你去用心思考并敲一遍代码,效果杠杆的。如果有不懂

           或者建议,欢迎指 出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值