一篇文章教你用 java爬虫 下载全站视频
环境: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爬虫 下载全站视频相关推荐
- 一篇文章教你学会Java基础I/O流
文章目录 一.初始IO流 1.什么是流 2.IO流的分类 二.字节输入输出流 1.字节输入流(InputStream) 2.字节输出流(OutputStream) 3.文件拷贝 三.处理流和转换流 写 ...
- 硬核来袭!!!一篇文章教你入门Python爬虫网页解析神器——BeautifulSoup详细讲解
文章目录 一.BeautifulSoup介绍 二.安装 三.bs4数据解析的原理 四.bs4 常用的方法和属性 1.BeautifulSoup构建 1.1 通过字符串构建 1.2 从文件加载 2.Be ...
- 一篇文章教你学会Java泛型
文章目录 一.原生态类型 1.什么是原生态类型 2.使用原生态类型 有什么不好 3.泛型的子类型规则 4.泛型的可擦除性 二.泛型常用形式 1.泛型方法 2.泛型单例工厂 三.有限制的通配符类型 四. ...
- 一篇文章教你学会Java基础JDBC
文章目录 一.搭建JDBC开发环境 1.搭建工程 2.连接数据库工具类JdbcConnectionUtil 3.main方法测试 二.创建Statement或PreparedStatement接口,执 ...
- 一篇文章教你学会使用SpringBoot实现文件上传和下载
文章目录 一.搭建SpringBoot开发环境 1.创建项目 2.配置application.properties参数 3.实体响应类和异常信息类 4.创建FileController 二.接口测试 ...
- 一篇文章教你学会使用SpringBatch 监听器Listener
文章目录 一.SpringBatch监听器 二.搭建SpringBatch开发环境 三.监听器详细介绍 1.JobExecutionListener 2.StepExecutionListener 3 ...
- 一篇文章让你从JAVA零基础入门`OOP`编程12.19
一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后,整理的文章,文中对知识点的解释仅为个人理解. 配套PPT,站点源码,等学习资料 一.预科 1.1 JAVA 介 ...
- 一篇文章让你从JAVA零基础入门`OOP`编程12.20
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.png)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...
- 一期完结《一篇文章让你从JAVA零基础入门`OOP`编程》12.21
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(QQ_3336392096.jpg)] 一篇文章让你从JAVA零基础入门OOP编程 前言: 此文为玄子,复习ACCP-S1课程后, ...
- 一篇文章教你学会实现模糊搜索结果的关键词高亮显示
一篇文章教你学会实现模糊搜索结果的关键词高亮显示 话不多说,先看效果图: 代码如下: <!DOCTYPE html> <html lang="en">< ...
最新文章
- 美多商城之用户中心(收货地址1)
- Javascript全局变量和delete
- yarn资源调度(网络搜集)
- ServletContext的作用
- VisualSVN Server Manager创建版本库以及TortoiseSVN的使用
- POJ3009-Curling 2.0
- JDK12的新特性:teeing collectors
- C语言九十三之输入一个字符x,找到输入的那句话(字符串)里面一样字母的位置。
- java无效的源发行版_无效的Java
- 修复./mysql/proc
- Arduino PID自整定库
- ASP.NET五大核心对象解析
- c mysql 插入大量数据_C++操作MySQL大量数据插入效率低下的解决方法
- UI设计实用素材|线框套件 WRFRM
- 怎样用计算机求成绩平均分,2017年计算机一级WPS辅导:WPS2007中求特定比例成绩的平均分...
- 优雅的实现Activiti动态调整流程(自由跳转、前进、后退、分裂、前加签、后加签等),含范例代码!...
- 前端框架 Angular 11.0.0 正式发布,已经放弃 IE 9 、10
- element中el-autocomplete实现中英文搜索功能
- ClassNotFoundException:com.tongweb.geronimo.osgi.locator.ProviderLocator
- 领带的打法10种——男士必看(图)