Warning: Illegal string offset 'download' in /www/wwwroot/www.oilcn.net.cn/wp-content/themes/wpzt-hot/template-parts/single/single-pc.php on line 4

网站源码到哪里下载迅雷下载 迅雷下载地址(asp网站模板源码免费无限下载)

21次
2021-06-23

之前有看过一段时间爬虫,了解了爬虫的原理,以及一些实现的方式,本项目完成于半年前,一直放到哪里,现在跟你们分享进去。

网络爬虫简略的原理就是把程序想像成为一个小虫子,一旦出来了一个正门,这个小虫子如同步入了新世界一样,只要符合他的口味的东西都会置于自己的盒子里,但是他还不满足,只要看到可以打开的门,他都要出来瞧瞧,里面有没有他想要的东西有就装上去,直到每位门里都看了一遍,确定没有了以后,他才肯舍弃,这样下去,他的箱子早已装满了想要的东西。

上述内容叙述上去就是:网络爬虫就是一个手动提取网页内容的程序,这个程序的行为象一个蟑螂似的,爬来爬去。一般的网路爬虫都有一个或则多个网页的url作为开始,从开始的网页上获取url,并把符合条件的内容保存下去,这样经常进行下来,直到条件不符合的时侯,程序执行结束。

以下也是简略的一个爬虫,爬取一个下载网站上的迅雷下载链接,用到了两个辅助队列,一个存链接作为判定当前链接是否早已打开过,另一个是进行操作的队列,存出来的链接就会进行操作。最后获取至的下载链接存在set集合中网站源码到哪里下载迅雷下载 迅雷下载地址,以保证链接不会重复。

网站源码到哪里下载迅雷下载 迅雷下载地址(asp网站模板源码免费无限下载) (https://www.oilcn.net.cn/) 综合教程 第1张

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

由于在网页上显示的也是一串文字,当用户点击后,他的链接会经过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")
    );
}

网站源码到哪里下载迅雷下载 迅雷下载地址(asp网站模板源码免费无限下载) (https://www.oilcn.net.cn/) 综合教程 第2张

改造后的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);
   }
}

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

网站源码到哪里下载迅雷下载 迅雷下载地址(asp网站模板源码免费无限下载) (https://www.oilcn.net.cn/) 综合教程 第3张

网站源码到哪里下载迅雷下载 迅雷下载地址(asp网站模板源码免费无限下载) (https://www.oilcn.net.cn/) 综合教程 第4张

所以以上就当是增加了一下剖析源码的能力……

爬虫代码并没有做任何的优化,可以说效率十分低,程序用到了数组,并且在程序运行的过程中打开的链接会产生一个环型,也就是打开一个链接,之后程序执行的过程中会重新找到这个链接,所以这条路线就断了。

网站源码到哪里下载迅雷下载 迅雷下载地址(asp网站模板源码免费无限下载) (https://www.oilcn.net.cn/) 综合教程 第5张

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

网站源码到哪里下载迅雷下载 迅雷下载地址(asp网站模板源码免费无限下载) (https://www.oilcn.net.cn/) 综合教程 第6张

从运行时间跟有效链接可以看出效率太低

网站源码到哪里下载迅雷下载 迅雷下载地址(asp网站模板源码免费无限下载) (https://www.oilcn.net.cn/) 综合教程 第7张

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

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

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 set = new TreeSet();
   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 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,所以把这个极其不完美的项目置于了前面,就当练手网站源码到哪里下载迅雷下载 迅雷下载地址,项目地址:

END

发表评论