• 基于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类中的方法掉用,看了这篇博客之后 我相信你可以在网上白嫖资源了哈哈哈       

    你学到东西了吗 

  • 相关阅读:
    盒子垂直水平居中
    Sahi (2) —— https/SSL配置(102 Tutorial)
    Sahi (1) —— 快速入门(101 Tutorial)
    组织分析(1)——介绍
    Java Servlet (1) —— Filter过滤请求与响应
    CAS (8) —— Mac下配置CAS到JBoss EAP 6.4(6.x)的Standalone模式(服务端)
    JBoss Wildfly (1) —— 7.2.0.Final编译
    CAS (7) —— Mac下配置CAS 4.x的JPATicketRegistry(服务端)
    CAS (6) —— Nginx代理模式下浏览器访问CAS服务器网络顺序图详解
    CAS (5) —— Nginx代理模式下浏览器访问CAS服务器配置详解
  • 原文地址:https://www.cnblogs.com/j-1-z-2-s-3/p/13379636.html
Copyright © 2020-2023  润新知