详解Java两种方式简单实现:爬取网页并且保存
对于网络,我一直处于好奇的态度。以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错误,就要调试很多时间,太浪费时间。
后来一想,既然早早给自己下了保证,就先实现它吧,从简单开始,慢慢增加功能,有时间就实现一个,并且随时优化代码。
下面是我简单实现爬取指定网页,并且保存的简单实现,其实有几种方式可以实现,这里慢慢添加该功能的几种实现方式。
UrlConnection爬取实现
packagehtml; importjava.io.BufferedReader; importjava.io.FileOutputStream; importjava.io.FileWriter; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.io.OutputStreamWriter; importjava.net.MalformedURLException; importjava.net.URL; importjava.net.URLConnection; publicclassSpider{ publicstaticvoidmain(String[]args){ Stringfilepath="d:/124.html"; Stringurl_str="http://www.hao123.com/"; URLurl=null; try{ url=newURL(url_str); }catch(MalformedURLExceptione){ e.printStackTrace(); } Stringcharset="utf-8"; intsec_cont=1000; try{ URLConnectionurl_con=url.openConnection(); url_con.setDoOutput(true); url_con.setReadTimeout(10*sec_cont); url_con.setRequestProperty("User-Agent","Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)"); InputStreamhtm_in=url_con.getInputStream(); Stringhtm_str=InputStream2String(htm_in,charset); saveHtml(filepath,htm_str); }catch(IOExceptione){ e.printStackTrace(); } } /** *Method:saveHtml *Description:saveStringtofile *@paramfilepath *filepathwhichneedtobesaved *@paramstr *stringsaved */ publicstaticvoidsaveHtml(Stringfilepath,Stringstr){ try{ /*@SuppressWarnings("resource") FileWriterfw=newFileWriter(filepath); fw.write(str); fw.flush();*/ OutputStreamWriterouts=newOutputStreamWriter(newFileOutputStream(filepath,true),"utf-8"); outs.write(str); System.out.print(str); outs.close(); }catch(IOExceptione){ System.out.println("Erroratsavehtml..."); e.printStackTrace(); } } /** *Method:InputStream2String *Description:makeInputStreamtoString *@paramin_st *inputstreamwhichneedtobeconverted *@paramcharset *encoderofvalue *@throwsIOException *ifanerroroccurred */ publicstaticStringInputStream2String(InputStreamin_st,Stringcharset)throwsIOException{ BufferedReaderbuff=newBufferedReader(newInputStreamReader(in_st,charset)); StringBufferres=newStringBuffer(); Stringline=""; while((line=buff.readLine())!=null){ res.append(line); } returnres.toString(); } }
实现过程中,爬取的网页的中文乱码问题,是个比较麻烦的事情。
HttpClient爬取实现
HttpClient实现爬取网页时,遇到了很多问题。其一,就是存在两个版本的HttpClient,一个是sun内置的,另一个是apache开源的一个项目,似乎sun内置用的不太多,我也就没有实现,而是采用了apache开源项目(以后说的HttpClient都是指apache的开源版本);其二,在使用HttpClient时,最新的版本已经不同于以前的版本,从HttpClient4.x版本后,导入的包就已经不一样了,从网上找的很多部分都是HttpClient3.x版本的,所以如果使用最新的版本,还是看帮助文件为好。
我用的是Eclipse,需要配置环境导入引用包。
首先,下载HttpClient,地址是:http://hc.apache.org/downloads.cgi,我是用的事HttpClient4.2版本。
然后,解压缩,找到了/lib文件夹下的commons-codec-1.6.jar,commons-logging-1.1.1.jar,httpclient-4.2.5.jar,httpcore-4.2.4.jar(版本号根据下载的版本有所不同,还有其他的jar文件,我这里暂时用不到,所以先导入必须的);
最后,将上面的jar文件,加入classpath中,即右击工程文件=>BulidPath=>ConfigureBuildPath=>AddExternalJar..,然后添加上面的包就可以了。
还用一种方法就是讲上面的包,直接复制到工程文件夹下的lib文件夹中。
下面是实现代码:
packagehtml; importjava.io.BufferedReader; importjava.io.FileOutputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.InputStreamReader; importjava.io.OutputStreamWriter; importorg.apache.http.HttpEntity; importorg.apache.http.HttpResponse; importorg.apache.http.client.*; importorg.apache.http.client.methods.HttpGet; importorg.apache.http.impl.client.DefaultHttpClient; publicclassSpiderHttpClient{ publicstaticvoidmain(String[]args)throwsException{ //TODOAuto-generatedmethodstub Stringurl_str="http://www.hao123.com"; Stringcharset="utf-8"; Stringfilepath="d:/125.html"; HttpClienthc=newDefaultHttpClient(); HttpGethg=newHttpGet(url_str); HttpResponseresponse=hc.execute(hg); HttpEntityentity=response.getEntity(); InputStreamhtm_in=null; if(entity!=null){ System.out.println(entity.getContentLength()); htm_in=entity.getContent(); Stringhtm_str=InputStream2String(htm_in,charset); saveHtml(filepath,htm_str); } } /** *Method:saveHtml *Description:saveStringtofile *@paramfilepath *filepathwhichneedtobesaved *@paramstr *stringsaved */ publicstaticvoidsaveHtml(Stringfilepath,Stringstr){ try{ /*@SuppressWarnings("resource") FileWriterfw=newFileWriter(filepath); fw.write(str); fw.flush();*/ OutputStreamWriterouts=newOutputStreamWriter(newFileOutputStream(filepath,true),"utf-8"); outs.write(str); outs.close(); }catch(IOExceptione){ System.out.println("Erroratsavehtml..."); e.printStackTrace(); } } /** *Method:InputStream2String *Description:makeInputStreamtoString *@paramin_st *inputstreamwhichneedtobeconverted *@paramcharset *encoderofvalue *@throwsIOException *ifanerroroccurred */ publicstaticStringInputStream2String(InputStreamin_st,Stringcharset)throwsIOException{ BufferedReaderbuff=newBufferedReader(newInputStreamReader(in_st,charset)); StringBufferres=newStringBuffer(); Stringline=""; while((line=buff.readLine())!=null){ res.append(line); } returnres.toString(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。