http编程系列(一)——URL使用和爬取博客图片小DEMO
- 2019 年 10 月 30 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luo4105/article/details/72486512
URL简介和基本使用
浏览网页基本都用的http协议,java中也可以进行请求http服务器,并获得服务器响应。Java实现网络爬虫、抢购是用http进行。这里接收通过URL去访问http协议服务器,下图是网络请求流程。
简单例子
String urlStr = "http://127.0.0.1:8080/study_ssmvc/restful?id=1&name=2"; URL url = new URL(urlStr); URLConnection conn= url.openConnection(); InputStream is = conn.getInputStream(); is.close();
这是一个简单的访问代码,其中,openConnection()是打开连接,getInputStream()作用是发送请求并收到响应,响应是InputStream。
这里写一个post带参请求
String urlStr = "http://127.0.0.1:8080/study_ssmvc/restful"; URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); conn.setConnectTimeout(60*1000); conn.setReadTimeout(60*1000); conn.setDoOutput(true); conn.setDoInput(true); String param = "id=1&name=2"; conn.getOutputStream().write(param.getBytes()); System.out.println("发送请求前"); InputStream is = conn.getInputStream();
这里连接类是HttpURLConnection,继承URLConnection。HttpURLConnection可以设置请求类型,请求header中的属性。
同时这里要说一下OutputStream和InputSteam,
在这里OutputStream是输出流,这里的作用是设置参数。
InputSteam是输入流,这里是收到响应。
当代码执行到conn.getInputStream()时,它会发出http请求,并接收响应。
URL不仅可以连接网页,也可以连接http服务器上的图片、视频、文件,并通过InputStream去接收它们。
下载csdn博客图片DEMO
小demo,根据网址,下载某篇csdn博客上所有的图片
思路如下,
1.通过URLConnection获得响应网页代码
2.通过正则表达式得到所有匹配的图片链接,据我观察,csdn博客图片都是” https://img-blog.csdn.net/…/gravity/Center”这类格式。
3.遍历图片链接,下载图片
实现
@Test public voiddownloadPic() throwsIOException { URLurl=new URL("http://blog.csdn.net/luo4105/article/details/72326621"); URLConnection urlConnection = url.openConnection(); urlConnection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0;Windows NT; DigExt)"); InputStream is= urlConnection.getInputStream(); StringBuffer bf= newStringBuffer(); byte[]bytes=new byte[1024]; intc; while((c = is.read(bytes)) != -1) { String s = new String(bytes, 0, c, "UTF-8"); bf.append(s); } String imgPattern = "https://img-blog.csdn.net.*Center"; Pattern pattern= Pattern.compile(imgPattern); Matcher matcher= pattern.matcher(bf); while(matcher.find()) { String e=matcher.group(0); System.out.println(e); URL urlPic=new URL(e); System.out.println(urlPic.getPath().substring(1)); URLConnection urlPicConn = urlPic.openConnection(); urlPicConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0;Windows NT; DigExt)"); InputStream isPic = urlPicConn.getInputStream(); FileOutputStream fos = new FileOutputStream("spiders/"+ urlPic.getPath().substring(1)+ ".jpg"); byte[] picbytes = newbyte[1024]; int r; while((r = isPic.read(picbytes)) != -1) { fos.write(picbytes, 0, r); } fos.close(); isPic.close(); } is.close(); }
图片下载
代码地址:https://code.csdn.net/luo4105/study_http/tree/master/src/com/lc/https/CsdnPicSpider.java
参考资料
1.http://ifeve.com/java-networking/