好玩的代码

检索污污的网站 - 好玩的代码

2017-03-28  本文已影响123人  野狗道人闯红灯

学了爬虫之后,可以根据网站节点规律爬取一些有用的信息,进行分析。当然也可以从用这种技术做一些更好玩的事情,比如遍历域名,然后根据设定的关键字来检查这个域名代表的网站的内容是什么偏向的,比如偏向是污污的那种。

思路

思路比较简单。首先是遍历网站 ,遍历到某个网站的时候,只需要这个网站首页的文本内容。然后设立一些有偏向的关键字,比如美女、性感什么的,这个时候使用正则表达式对整个网页进行匹配,如果匹配数量足够多,就可以判定这是一个有某种偏向的网站。

实现

遍历

这个没啥技术含量,来个for循环就ok了,因为网站实在太多,多少位都有可能,我们也不期望把全世界的小网站都找出来,就自己设定一下某个范围的就可以了。然后为了让爬取效率更高一些,这里使用多线程爬取。

public static void main(String[] args) {
        
        char[] charArr = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                '0','1','2','3','4','5','6','7','8','9'};
        ArrayList<String> urlList = new ArrayList<String>();
        
        for(final char ch0 : charArr) {
            for(final char ch1 : charArr) {
                for(final char ch2 : charArr) {
                    new Thread(new Runnable() {
                        
                        @Override
                        public void run() {
                            YellowNetSniffer yellow = new YellowNetSniffer();
                            yellow.crawl("http://www.av" + ch0 + ch1 + ch2 + ".com");
                        }
                    }).start();
                }
            }
        }
    }

爬取匹配

说到底就两句话。获取首页内容,用正则表达式匹配相似度。

public boolean crawl(String url) {
        
        //第一步,获取网站首页文本内容,这里使用了一下Jsoup,自己写输入流来实现也很简单
        Document doc = null;
        try {
            doc = Jsoup.connect(url)
                    .header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
                    .timeout(1000 * 5)
                    .get("gbk");
        } catch (Exception e) {
            return false;
        }
        String content = doc.text();
        
        //第二步,使用正则表达式匹配关键字
        String patternStr = "(人妻|情色|色情|18岁|18歲|性爱|少妇|乱伦|美女|巨乳|诱惑|欧美|成人|有碼|無碼|有码|无码|激情|制服|巨乳|撸管|丝袜|sexy|sex|fuck|fucked|breast|naked)";

        Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(content);
        
        int count = 0;
        String str = "";
        while(matcher.find()) {
            int start = matcher.start();
            int end = matcher.end();
            str += content.substring(start, end) + "@";
            count++;
        }
        if (count > 0) {
            System.out.println(url);
            System.out.println(str);
            System.out.println("击中" + count + "次");
            System.out.println();
            return true;
        }
        else {
            return false;
        }
    }

扩展

因为 Jsoup是一个很好的第三方爬虫工具,所以本文就用了这个类库。但是只用这个工具做了一步获取网站文本内容的工作。其实这一步也完全可以自己用输入流来实现。自己写的话也会比较自由,我记得之前遇到Jsoup里面有一个坑,拿出来的东西是乱码,最后这一步还是用自己写的东西解决的。

public class HtmlInputStream {
    
    
    public static String getContent(String originurl) {
        StringBuilder result = new StringBuilder();
        try {
            URL url = new URL(originurl);
            URLConnection conn = url.openConnection();
            conn.setRequestProperty("user-agent",
                    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" +
                    "    X-Requested-With:XMLHttpRequest");
            
            InputStream inOrigin = (InputStream) conn.getContent();
            InputStreamReader in = new InputStreamReader(inOrigin, "UTF-8");
            
            int ch;
            while((ch = in.read()) != -1) {
                result.append((char)ch);
            }
            
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return result.toString();
    }
}

最后

最后就可以尽情浏览啦~~打完收工!

欢迎关注【Funny新青年】微信公众号~

上一篇 下一篇

猜你喜欢

热点阅读