基于HTTP协议和HttpURLConnection完成网上资源的爬取

Posted j-1-z-2-s-3

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于HTTP协议和HttpURLConnection完成网上资源的爬取相关的知识,希望对你有一定的参考价值。

我们有时候会不会有这种困扰: 在网上看到一个很好看的视频想下载保存下来,却发现没有下载选项,会不会觉得很失望. 看了这篇博客后,保管能减少你这样的烦恼. 

我们利用HTTP协议和HttpURLConnection完成网上资源的爬取,这样不用网站提供下载选项我们也能拿到我们自己想要的资源 甚至有些收费的视频也能弄到手哦.   多学点技术,就可以少花点钱嘛

废话不多说,上代码

/**
* 网络文件下载器
* @author 雷神
*
*/
public class FileDownloader {

public void download(String url,File file) throws MalformedURLException, FileNotFoundException {
URL urlObj = new URL(url);

//获取文件名称
String path = urlObj.getPath();
int index = path.lastIndexOf("/");
String fname = path.substring(index+1);
//文件名组合目录获得要下载的文件名,创建输出流
File files = new File(file,fname);
OutputStream os = new FileOutputStream(files);
System.out.println("开始下载...");
new Thread(()->{
HttpURLConnection conn = null;
InputStream is = null;

//打开连接
try {
conn = (HttpURLConnection) urlObj.openConnection();
conn.setRequestMethod("GET");
int stateCode = conn.getResponseCode();
if(stateCode == HttpURLConnection.HTTP_OK){
is = conn.getInputStream();
byte[] b = new byte[1024];
int len = 0;
while((len = is.read(b))!= -1){
os.write(b, 0, len);
}
System.out.println("下载完成");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(os != null){
os.close();
}
if(is != null){
is.close();
}
if(conn != null){
conn.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}

}).start();


}


public static void main(String[] args) throws IOException, FileNotFoundException {
//获得网上资源链接
String url = "https://img2.huashi6.com/images/resource/2015/07/15/51430h533p0.png?imageView2/3/q/100/interlace/1/w/448/h/320";
//传入资源和要目标目录
new FileDownloader().download(url,new File("D:/老婆们"));
}
}

开始代码分析:

谈到网上爬取,就不得不说到URL类, URL又称之为统一资源定位器,一般用于表示一个网络地址(本地网,外部网络),通过该地址可以定位到网络中的资源 

一个URL地址通常由以下几个部分构成:

  • 协议(双方约定的通信标准: http:// ftp:// jdbc:mysql://)

  • 主机地址或域名(资源所在服务器地址:softeem.com 119.231.8.9 192.168.0.1)

  • 端口(服务器中指定服务对外数据交换接口,唯一:80 3306)

  • 请求资源(服务器根地址中资源所在的相对位置:/sales/home.html test)

  • 查询路径(?之后的内容:page=1 user=root&password=123456)

而我们现在需要的就是其中的请求资源地址 通过URL类中的getPath()方法可以获得不含查询路径的资源地址

在网页上按f12 点击network选项卡 选择你想要的文件,将RequeryURL中的地址复制下来,通过此地址获得一个URL对象

调用getPath()方法得到一个类似这样的资源路径:

技术图片

 

 我们要下载此文件肯定要得到它的文件名,所以我们取得最后"/"的索引 通过subString()方法截取"/"之后的所有字符串,得到文件名 然后通过传过来的父目录,创建一个新的File对象 获得它的文件输出流. (这样准备工作都做好,我们可以准备读取网上的资源了)

 这里我们为了防止文件读取异常 可能会阻塞了其他功能的执行 我们建立了一个线程,如果只需要下载文件,那么线程可以不用建立

为了下载资源 我们首先要做的是打开一个我们主机和网络的链接 : 通过OpenConnection()实现,获得链接后,我们需要设置我们的请求头 setRequestMethod("GET"); GET代表我们需要向该网址获得资源

接着我们需要判断该网页的状态码 其实在我们按f12的时候上面就已经显示状态码了,调用getResponseCode()方法获得状态码,状态码200代表请求成功

所以当我们获得的状态码等于200时 就可以读取并下载文件了

最后通过getInputStream()方法获得目标文件的输入流,接着用我们早已准备好的文件输出流,对目标文件进行循环读取写入.      这样网上的资源就能传到我们指定的目录了!!!!

 

其实思路很简单 主要就是对HttpConnection和URL类中的方法掉用,看了这篇博客之后 我相信你可以在网上白嫖资源了哈哈哈       

你学到东西了吗 

以上是关于基于HTTP协议和HttpURLConnection完成网上资源的爬取的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议和Fiddler

HTTP协议和Fiddler

HTTP协议和WEB框架

转载 https协议和http协议的区别

linux服务之http协议和httpd的配置

TCP/IP协议和HTTP协议