Java爬虫爬取网站电影下载链接

news/2024/5/12 8:13:09/文章来源:https://blog.csdn.net/weixin_33743248/article/details/93920976

之前有看过一段时间爬虫,了解了爬虫的原理,以及一些实现的方法,本项目完成于半年前,一直放在那里,现在和大家分享出来。

网络爬虫简单的原理就是把程序想象成为一个小虫子,一旦进去了一个大门,这个小虫子就像进入了新世界一样,只要符合他的口味的东西就会放在自己的袋子里,但是他还不满足,只要见到可以打开的门,他都要进去看看,里面有没有他想要的东西有就装起来,直到每个门里都看了一遍,确定没有了之后,他才肯放弃,这样下来,他的袋子已经装满了想要的东西。

上述内容表述起来就是:网络爬虫就是一个自动提取网页内容的程序,这个程序的行为像一个虫子似的,爬来爬去。一般的网络爬虫都有一个或者多个网页的url作为开始,从开始的网页上获取url,并把符合条件的内容保存下来,这样一直进行下去,直到条件不符合的时候,程序执行结束。

以下只是简单的一个爬虫,爬取一个下载网站上的迅雷下载链接,用到了两个辅助队列,一个存链接作为判断当前链接是否已经打开过,另一个是进行操作的队列,存进去的链接都会进行操作。最后获取到的下载链接存在set集合中,以保证链接不会重复。


-------------------------------以下是一个分析源码的过程,后期发现这个编码没有用上---------------------------------------------------------------------

由于在网页上显示的只是一串文字,当用户点击后,他的链接会经过url编码,编码成迅雷能够识别的链接,网站上使用的是javascript的url编码,java自带了一个url编码,和网站上的不一致,我们需要java的url编码的源码,通过分析源码其实很难简单地发现对什么字符编码,对什么不进行编码,和javascript的url编码比较之后,对其进行改造,经过比对,发现java的编码,对'@','[',']',':','/'不处理,只需要增加他们进去就行

static {

    dontNeedEncoding = new BitSet(256);int i;for (i = 'a'; i <= 'z'; i++) {dontNeedEncoding.set(i);}for (i = 'A'; i <= 'Z'; i++) {dontNeedEncoding.set(i);}for (i = '0'; i <= '9'; i++) {dontNeedEncoding.set(i);}dontNeedEncoding.set(' '); /* encoding a space to a + is done
                                * in the encode() method */
    dontNeedEncoding.set('-');dontNeedEncoding.set('_');dontNeedEncoding.set('.');dontNeedEncoding.set('*');dfltEncName = AccessController.doPrivileged(new GetPropertyAction("file.encoding"));
}
改造后的url编码类,去掉了没有用的语句,增加对对'@','[',']',':','/'特殊字符的编码

package url;import java.io.UnsupportedEncodingException;
import java.io.CharArrayWriter;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.nio.charset.IllegalCharsetNameException;
import java.nio.charset.UnsupportedCharsetException;
import java.util.BitSet;public class URLEncoders {static BitSet dontNeedEncoding;static final int caseDiff = ('a' - 'A');static String dfltEncName = null;static {dontNeedEncoding = new BitSet(256);int i;for (i = 'a'; i <= 'z'; i++) {dontNeedEncoding.set(i);}for (i = 'A'; i <= 'Z'; i++) {dontNeedEncoding.set(i);}for (i = '0'; i <= '9'; i++) {dontNeedEncoding.set(i);}dontNeedEncoding.set(' '); /*
                            * encoding a space to a + is done in the
                            * encode() method
                            */
      dontNeedEncoding.set('-');dontNeedEncoding.set('_');dontNeedEncoding.set('.');dontNeedEncoding.set('*');dontNeedEncoding.set('@');dontNeedEncoding.set('[');dontNeedEncoding.set(']');dontNeedEncoding.set(':');dontNeedEncoding.set('/');}@Deprecated
   public static String encode(String s) {String str = null;try {str = encode(s, dfltEncName);} catch (UnsupportedEncodingException e) {}return str;}public static String encode(String s, String enc)throws UnsupportedEncodingException {boolean needToChange = false;StringBuffer out = new StringBuffer(s.length());Charset charset;CharArrayWriter charArrayWriter = new CharArrayWriter();if (enc == null)throw new NullPointerException("charsetName");try {charset = Charset.forName(enc);} catch (IllegalCharsetNameException e) {throw new UnsupportedEncodingException(enc);} catch (UnsupportedCharsetException e) {throw new UnsupportedEncodingException(enc);}for (int i = 0; i < s.length();) {int c = (int) s.charAt(i);if (dontNeedEncoding.get(c)) {if (c == ' ') {c = '+';needToChange = true;}out.append((char) c);i++;} else {do {charArrayWriter.write(c);if (c >= 0xD800 && c <= 0xDBFF) {if ((i + 1) < s.length()) {int d = (int) s.charAt(i + 1);if (d >= 0xDC00 && d <= 0xDFFF) {charArrayWriter.write(d);i++;}}}i++;} while (i < s.length()&& !dontNeedEncoding.get((c = (int) s.charAt(i))));charArrayWriter.flush();String str = new String(charArrayWriter.toCharArray());byte[] ba = str.getBytes(charset);for (int j = 0; j < ba.length; j++) {out.append('%');char ch = Character.forDigit((ba[j] >> 4) & 0xF, 16);if (Character.isLetter(ch)) {ch -= caseDiff;}out.append(ch);ch = Character.forDigit(ba[j] & 0xF, 16);if (Character.isLetter(ch)) {ch -= caseDiff;}out.append(ch);}charArrayWriter.reset();needToChange = true;}}return (needToChange ? out.toString() : s);}
}

所以当我研究好了以上的编码之后才发现,迅雷会识别未经过编码的链接,三种链接迅雷都可以下载,如下图:


所以以上就当是提高了一下分析源码的能力……

爬虫代码并没有做任何的优化,可以说效率非常低,程序用到了递归,并且在程序运行的过程中打开的链接会形成一个环形,也就是打开一个链接,之后程序执行的过程中会再次找到这个链接,所以这条路线就断了。

程序在执行过程中,如果当前访问的网址时间过长,会抛出异常,也会影响效率。

从运行时间和有效链接可以看出效率很低

其实爬虫的代码很简单,从网页获取代码,对其进行解析这么一个过程

主程序:并没有调用其他的方法,那个编码类也没有用上

package function;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import queue.Queue;import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Pattern;public class Crawler {public static Queue q1 = new Queue();public static Queue q2 = new Queue();public static Set<String> set = new TreeSet<String>();public static int i = 0;public static void main(String[] args) {Document doc = null;try {long begin = System.currentTimeMillis();doc = Jsoup.connect("http://www.dytt8.net/index.htm").get();Elements links = doc.select("a[href]");for (Element link : links) {String linkHref = link.attr("href");Pattern pattern = Pattern.compile("^/html/+(.)+.html");Pattern pattern0 = Pattern.compile("http://www.dytt8.net/html/+(.)+.html");Pattern pattern1 = Pattern.compile("^ftp://+((.)+)+");if (pattern.matcher(linkHref).matches() == true
                  || pattern0.matcher(linkHref).matches() == true) {q1.insertQueue(linkHref);q2.insertQueue(linkHref);open("http://www.dytt8.net" + q1.outQueue());}}Iterator<String> it = set.iterator();// while(it.hasNext()){
         // String url=(String)it.next();
         // int last=url.lastIndexOf(".");
         // int last1=url.lastIndexOf("]");
         // // System.out.print(url.substring(last1+1, last)+"     ");
         // System.out.println(URLEncoders.encode(url,"utf-8"));
         // }
         System.out.println("一共爬取" + q2.size() + "条链接");long end = System.currentTimeMillis();System.out.println("用时" + (end - begin) + "ms");System.out.println("一共" + set.size() + "条下载链接");} catch (IOException e) {// TODO Auto-generated catch block
         e.printStackTrace();}}public static void open(String url) {Document doc = null;try {doc = Jsoup.connect(url).get();Elements links = doc.select("a[href]");for (Element link : links) {String linkHref = link.attr("href");Pattern pattern = Pattern.compile("^/html/+(.)+.html");Pattern pattern0 = Pattern.compile("http://www.dytt8.net/html/+(.)+.html");Pattern pattern1 = Pattern.compile("^ftp://+((.)+)+");if (pattern.matcher(linkHref).matches() == true
                  || pattern0.matcher(linkHref).matches() == true) {q1.insertQueue(linkHref);q2.insertQueue(linkHref);if (q2.contains(linkHref) == false) {open("http://www.dytt8.net" + q1.outQueue());}} else if (pattern1.matcher(linkHref).matches() == true) {System.out.println(linkHref);set.add(linkHref);}}} catch (IOException e) {// TODO Auto-generated catch block
         e.printStackTrace();}}
}
试着弄了一下github,所以把这个非常不完美的项目放在了上面,就当练手,项目地址:https://github.com/Ai-yoo/Java_Applaction.git

转载于:https://www.cnblogs.com/duzhentong/p/7816595.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_753893.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

htm怎么让图片和搜索框在同一行_网站文章关键词排名具体怎么优化?- 最蜘蛛池博客...

一些网站是首页做排名&#xff0c;一些网站是栏目页做排名&#xff0c;一些网站是靠大量的文章内容做排名。一个优化结果得当的网站&#xff0c;正常情况下应该是有大量的文章内容页排名的。大量的文章页排名&#xff0c;意味这大量的精准点击&#xff0c;意味者收录的页面向栏…

Ecshop文章分类列表页如何自定义Title以提高SEO效果

以ECshop官方默认模板为例&#xff1a; 1&#xff09;、修改数据库结构&#xff0c;给数据表 ecs_article_cat增加一个字段 “page_title” 进入ECSHOP后台》数据库管理》SQL查询&#xff0c;输入下面SQL语句&#xff0c;并提交。注意数据表前缀&#xff0c;这里使用的是模板前…

切勿用搜索引擎搜索填报志愿网页_可怕!百度又惹众怒,这回是高考志愿填报假网站...

正值考生填报高考志愿的关键时期25日&#xff0c;新华社的一则消息引发社会广泛关注题为&#xff1a;考生切勿用搜索引擎搜索填报志愿网页不明情况的“吃瓜群众”顿时“懵逼”用搜索引擎不是更快捷方便的获取信息吗&#xff1f;这到底是咋回事叻&#xff1f;骏铭君今天就跟你们…

“2016年上半年网站安全报告”,大多数网站存在漏洞,平均每家773个

互联网安全在当下已经成为了老生常谈的话题&#xff0c;同时也已经上升到了国家战略的高度&#xff0c;而随着“互联网”时代的到来&#xff0c;以及互联网新业务核心技术的快速发展&#xff0c;信息安全防护的要求也越来越高。 正因如此&#xff0c;我们也更加需要掌握更多更全…

php 王者页面,王者陶瓷 官方网站

康德曾经说过■世上有两件东西能够深深震撼人心一件是我们心中崇高的道德准则一件是我们头顶上灿烂的星空星空总是让人那么着迷无垠而深邃的魅力圣洁而恒久的静谧未知而震撼的神秘沧海桑田&#xff0c;生灵万千对星空的喜爱如出一辙而现在……王者瓷砖将那片星空摘下制成王者天…

html自定义页面,使用自定义html页面实现网站客户例子

操作步骤&#xff1a;主要js代码&#xff1a;function iaopen(url){var ref window.open(url, _blank, hiddenyes);ref.show();}function exit(){navigator.notification.confirm("你确定要退出程序吗?",function(i){if(i1){}if(i2){navigator.app.exitApp()}},&qu…

网站架构核心设计知识(二)之高可用

转载于:https://www.cnblogs.com/htkj/p/10942011.html

御用导航提示页面_网站导航的重要性 - 神马蜘蛛池博客

原出处&#xff1a;蜘蛛池博客原文链接&#xff1a;网站导航的重要性 - 蜘蛛池博客网站导航优化是什么&#xff1f;我信赖许多人在导航目录的优化这块操作还存在有待前进的空间&#xff0c;从前从前通知你千万不要掉进网站优化骗局提到过网站导航的重要性&#xff0c;网站导航的…

前端md5加密_post登陆分析实例,网站自定义password加密方式的分析

前端加密主流的有这么几种方式&#xff1a;RSA、MD5、自定义加密函数&#xff0c;其中自定义加密函数的可变性更加强&#xff0c;在实际分析中也更加有难度。今天分析一个自定义加密的网站来说明这一点&#xff0c;网站是空中网&#xff0c;首先填个假信息抓个包看看。表单数据…

php网站水印功能代码,php图片水印功能代码(支持图片与文字)

/** 功能&#xff1a;php图片水印 (水印支持图片或文字)* 参数&#xff1a;* $groundImage背景图片&#xff0c;即需要加水印的图片&#xff0c;暂只支持GIF,JPG,PNG格式&#xff1b;* $waterPos水印位置&#xff0c;有10种状态&#xff0c;0为随机位置&#xff1b;*1为顶端居左…

linux不规则窗口,实例21 不规则窗体 - PyQt4 精彩实例分析_Linux编程_Linux公社-Linux系统门户网站...

常见的窗体通常是各种方形的对话框&#xff0c;如前面实例中实现的所有对话框都是这样的。但有时也会需要用到非方形的窗体&#xff0c;如圆形&#xff0c;椭圆形甚至是不规则形状的对话框。本实例即实现了一个对PNG图形外沿为形状的不规则形状对话框&#xff0c;如下图所示。在…

域名实名认证多长时间_如何在阿里云申请域名丨建站系列

域名&#xff1a;由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点&#xff0c;人们设计出了域名&#xff0c;并通过网域名称系统&#xff08;DNS&#xff0c;Domain Name System&#xff09;来将域名和IP地址相互映射&#xff0c;使人更方便地访问互联网&…

网站统计中的数据收集原理及实现

http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具&#xff0c;比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目…

网站开发中经常用到的javaScript技术

1.1 屏蔽键盘所有键<script language"javascript"><!--function document.onkeydown(){ event.keyCode 0; event.returnvalue false;}--></script> 1.2 屏蔽鼠标右键 在body标签里加上οncοntextmenuself.event.returnvaluefalse 或者 <…

微软网站上已开始应用Silverlight技术

昨天我打开微软网站首页时&#xff0c;惊奇的发现&#xff0c;有动画效果的广告已经由Silverlight取代了原先的Flash来实现&#xff0c;因为被提示需要安装Sliverlight的运行时。 我想&#xff0c;随着Silverlight正式发布(1.0版本已经到RC了)&#xff0c;它的…

无法从该网站添加应用_Microsoft Edge Dev更新 可安装Chrome网上应用店里的主题

本周&#xff0c;谷歌向 Edge Dev 通道推送了 86.0.594.2 版本更新&#xff0c;添加了可从 Chrome 网上应用店获取主题的功能。此外 Edge Dev 迎来了可靠性修复和其它改进&#xff0c;并且为那些喜欢对浏览器进行各种调整的用户引入了一个新的标记(flags)。启用之后&#xff0c…

QQ分享网站显示自定义的缩略图标题和介绍

点我立即购买 <strong>效果图</strong> 在网页的head处添加 <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

Linux_13/ 虚拟网站主机功能,Vsftpd

虚拟网站主机Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号&#xff0c;实现提供多个网站同时为外部提供访问服务的技术&#xff0c;如图10-12所示&#xff0c;用户请求的资源不同&#xff0c;最终获取到的网页内容也各不相同。 ------------------…

大型网站架构不得不考虑的10个问题

为什么80%的码农都做不了架构师&#xff1f;>>> 这里的大型网站架构只包括高互动性高交互性的数据型大型网站&#xff0c;基于大家众所周知的原因&#xff0c;我们就不谈新闻类和一些依靠HTML静态化就可以实现的架 构了&#xff0c;我们以高负载高数据交换高数据流动…

如何制作自己的网站

在当今的互联网时代&#xff0c;门户网站已经成为越来越多企业不可或缺的组成部分。企业如何自己制作网站&#xff1f;如果你们公司有懂网站建设这方面的人&#xff0c;可以让他给你们公司做个网站。一般做网站&#xff0c;域名空间买好了。下面就是网站程序的设计制作。如果要…