环境:jdk1.8、win10、科学上网、eclipse

一直想学下写爬虫,满足一下自己的小愿望。正好过年有时间,就研究了一下,网上的资料良莠不齐,于是我决定自己整理一份,按照我的步骤做,一定是可以的,成功了记得回来点赞。

案例里爬了一个小型视频网站,最终的效果可以达到自动下载该网站的全部视频,且每个视频都有他该有的名字。
如果你要用来爬其他网站,代码里很多地方(比如url,url的解析,字符串的截取,下载的位置)是需要根据具体页面进行修改的,我只能提供一个思路而已,当然要爬我爬的这个网站的话当然就不需要改了。

一、思路:

1,获得要爬的网站主页url

2,对于分页的网站(视频网站一般都会分页的啦)分析url分页的方法,找规律

3,在每个分页上找出视频页面的url,找规律

4,在视频页面,分析url,找出视频的实际下载地址,找到规律

5,开始下载

6,开始happy!!!

二、步骤:

1,mian函数,没什么好说的

 public static void main(String[] args) throws Exception {final String SCORE_URL = "https://www.xxxx/xxx";// 主页(手工打码)final String DOWNLOAD_DIR = "F:/video/";// 下载目录System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");System.err.println("爬取子页面...");List<String> allArticle = getAllVideoPage(SCORE_URL);System.err.println("爬取视频...");Map<String, String> urlMap = getUrlInSource(allArticle);System.err.println("本次下载文件数量:" + urlMap.size());System.err.println("开始下载...");downloadMovie(DOWNLOAD_DIR, urlMap);}

2,这里网站的视频一般不会放在首页上,且视频网站一般都会分页的。所以需要先分析分页的url,然后分析进入视频页面的url,然后保存所有视频页url到一个列表里。难点在于对页面的url分析

例如这是分页的url,这个就有明显的规律了。我们只需要修改 page= 后面的数字就可以获得每个分页的url

然后就要分析进入每个视频页面的url,chrome F12 好我们来看

标出的这行就是进入视频页面的url,这个相信大家都会找,我就不细说了。
然后我们需要将href=后面的双引号里的东西截取出来,然后拼接成视频页面的完整url,具体看我代码
最后把所有视频页的url存入一个list,下一步

 /*** 爬所有视频页 存入一个list* * @param source 主页* @return 视频页 列表* @throws Exception*/private static List<String> getAllVideoPage(String source) throws Exception {List<String> urls = new ArrayList<>();for (int j = 1; j < 5; j++) { // 要爬哪些页数String pageUrl = source;// 拼接子页urlpageUrl = pageUrl + "?sort=new&page=" + j;URL url = new URL(pageUrl);// 连接urlBufferedReader br = connectURL(url);String info = null;for (int i = 0; i < 10000; i++) {info = br.readLine();if (info != null) {// 这里开始根据实际页面上的url进行字符串截取if (info.contains("target=\"_self\"")) {int start = info.indexOf("href") + 6;int end = start + 6;String substring = "https://www.xxx.xxx" + info.substring(start, end);urls.add(substring);}}}}return urls;}

3,现在,我们拥有了一个视频页面url的列表,下面只需要找出每一个视频页面中视频的实际下载地址即可。

依旧,分析页面。很幸运,视频页面就有下载按钮。

我们直接分析页面代码。找到了!!!这个带xxx.mp4的就是下载连接了,我们可以试试看,一点这个链接,浏览器就会开启下载。嗯,没错,就是他。

只有视频下载地址其实我们已经可以开始下载视频,但是这不完美,没有视频的名字怎么行!开始找名字

涂掉的部分就是名字啦,具体截取方法见代码

 /*** 获取视频的URL地址和视频名称存入hashMap* * @param source 视频页 列表* @return 视频名称=下载url* @throws IOException*/private static Map<String, String> getUrlInSource(List<String> source) throws IOException {Map<String, String> hashMap = new HashMap<>();for (int j = 0; j < source.size(); j++) {String pageUrl = source.get(j);URL url = new URL(pageUrl);// 连接urlBufferedReader br = connectURL(url);String info = null;String title = null;// 此处不要==null进行判断,因为网页中有很多行都是null,否则会报java.lang.NullPointerException?for (int i = 0; i < 10000; i++) {info = br.readLine();if (null != info) {// 这里截取视频名称,也是根据页面实际情况if (info.contains("h1 class=\"text-truncate\"")) {int st = info.indexOf("truncate") + 10;int ed = info.lastIndexOf("h1") - 2;title = info.substring(st, ed);}if (info.contains("https://xxx.xxx.xxx/download/mp4")) {// 这里截取视频实际下载url,也是根据页面实际情况int start = info.indexOf("http");int end = info.lastIndexOf("mp4") + 3;String substring = info.substring(start, end);hashMap.put(title, substring);}}}}return hashMap;}

4,现在我们有了一个map,里面是视频的名字和下载地址,接下来就简单啦。下载就完事了。

 /*** 开启多线程下载* * @param DOWNLOAD_DIR* @param urlMap*/private static void downloadMovie(final String DOWNLOAD_DIR, Map<String, String> urlMap) {ExecutorService es = Executors.newFixedThreadPool(8);for (Map.Entry<String, String> entry : urlMap.entrySet()) {final String title = entry.getKey();// 视频名称final String url = entry.getValue();// 视频urles.execute(new Runnable() {@Overridepublic void run() {try {System.out.println("正在下载:    " + title + ".......");File destFile = new File(DOWNLOAD_DIR + title + ".mp4");download(url, destFile);System.out.println("=========> " + title + " 下载完毕!");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}}/*** 通过视频的URL下载该视频并存入本地* * @param url      视频的URL* @param destFile 视频存入的文件夹* @throws IOException*/private static void download(String url, File destFile) throws IOException {URL videoUrl = new URL(url);InputStream is = videoUrl.openStream();FileOutputStream fos = new FileOutputStream(destFile);int len = 0;byte[] buffer = new byte[1024];while ((-1) != (len = is.read(buffer))) {fos.write(buffer, 0, len);}fos.flush();if (null != fos) {fos.close();}if (null != is) {is.close();}}/*** 链接url 返回字节流* * @param url* @return* @throws IOException* @throws ProtocolException* @throws UnsupportedEncodingException*/private static BufferedReader connectURL(URL url)throws IOException, ProtocolException, UnsupportedEncodingException {// 这里的代理服务器端口号 需要自己配置Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7959));HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);// 若遇到反爬机制则使用该方法将程序伪装为浏览器进行访问conn.setRequestMethod("GET");conn.setRequestProperty("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36");BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));return br;}

这里有一些需要说明的,由于很多网站需要科学上网,直接这样连是连不上的,所以我们需要让程序开启代理模式。
看上方代码的最后几行
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7959));
这行代码就是设置代理的,当然前提是你得有代理。参数自然是ip和port啦,那怎么看自己代理的ip和port呢。
以著名的x灯为例:

就是这个了,其他也应该大同小异。

5,最终效果


欢迎留言讨论。
项目完整代码:(稍后添加)

一篇文章教你用 java爬虫 下载全站视频相关推荐

  1. 一篇文章教你学会Java基础I/O流

    文章目录 一.初始IO流 1.什么是流 2.IO流的分类 二.字节输入输出流 1.字节输入流(InputStream) 2.字节输出流(OutputStream) 3.文件拷贝 三.处理流和转换流 写 ...

  2. 硬核来袭!!!一篇文章教你入门Python爬虫网页解析神器——BeautifulSoup详细讲解

    文章目录 一.BeautifulSoup介绍 二.安装 三.bs4数据解析的原理 四.bs4 常用的方法和属性 1.BeautifulSoup构建 1.1 通过字符串构建 1.2 从文件加载 2.Be ...

  3. 一篇文章教你学会Java泛型

    文章目录 一.原生态类型 1.什么是原生态类型 2.使用原生态类型 有什么不好 3.泛型的子类型规则 4.泛型的可擦除性 二.泛型常用形式 1.泛型方法 2.泛型单例工厂 三.有限制的通配符类型 四. ...

  4. 一篇文章教你学会Java基础JDBC

    文章目录 一.搭建JDBC开发环境 1.搭建工程 2.连接数据库工具类JdbcConnectionUtil 3.main方法测试 二.创建Statement或PreparedStatement接口,执 ...

  5. 一篇文章教你学会使用SpringBoot实现文件上传和下载

    文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...

  6. 一篇文章教你学会使用SpringBatch 监听器Listener

    文章目录 一.SpringBatch监听器 二.搭建SpringBatch开发环境 三.监听器详细介绍 1.JobExecutionListener 2.StepExecutionListener 3 ...

  7. 一篇文章让你从JAVA零基础入门`OOP`编程12.19

    一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后,整理的文章,文中对知识点的解释仅为个人理解. 配套PPT,站点源码,等学习资料 一.预科 1.1 JAVA 介 ...

  8. 一篇文章让你从JAVA零基础入门`OOP`编程12.20

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.png)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...

  9. 一期完结《一篇文章让你从JAVA零基础入门`OOP`编程》12.21

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.jpg)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...

  10. 一篇文章教你学会实现模糊搜索结果的关键词高亮显示

    一篇文章教你学会实现模糊搜索结果的关键词高亮显示 话不多说,先看效果图: 代码如下: <!DOCTYPE html> <html lang="en">< ...

最新文章

  1. 美多商城之用户中心(收货地址1)
  2. Javascript全局变量和delete
  3. yarn资源调度(网络搜集)
  4. ServletContext的作用
  5. VisualSVN Server Manager创建版本库以及TortoiseSVN的使用
  6. POJ3009-Curling 2.0
  7. JDK12的新特性:teeing collectors
  8. C语言九十三之输入一个字符x,找到输入的那句话(字符串)里面一样字母的位置。
  9. java无效的源发行版_无效的Java
  10. 修复./mysql/proc
  11. Arduino PID自整定库
  12. ASP.NET五大核心对象解析
  13. c mysql 插入大量数据_C++操作MySQL大量数据插入效率低下的解决方法
  14. UI设计实用素材|线框套件 WRFRM
  15. 怎样用计算机求成绩平均分,2017年计算机一级WPS辅导:WPS2007中求特定比例成绩的平均分...
  16. 优雅的实现Activiti动态调整流程(自由跳转、前进、后退、分裂、前加签、后加签等),含范例代码!...
  17. 前端框架 Angular 11.0.0 正式发布,已经放弃 IE 9 、10
  18. element中el-autocomplete实现中英文搜索功能
  19. ClassNotFoundException:com.tongweb.geronimo.osgi.locator.ProviderLocator
  20. 领带的打法10种——男士必看(图)

热门文章

  1. Qt XDF阅读管理
  2. Java数据结构和算法---程序员常用10种算法
  3. JS实现动态生成二维码,并在中间插入logo
  4. vb6.0连接access数据库
  5. 高校后勤管理系统Java项目-基于SSM
  6. 机器人学基础——坐标
  7. 【软件自动化测试】基于自设网站的软件测试与分析
  8. 价值1000元的微信二维码活码管理系统网站源码分享
  9. 学前教育试题库及答案_学前教育学考试试题及答案
  10. ubuntu18.04超级简单的安装wine QQ教程