刚刚学完Socket,迫不及待的做了这个网页邮箱抓取~~~

现在有越来越多的人热衷于做网络爬虫(网络蜘蛛),也有越来越多的地方需要网络爬虫,比如搜索引擎、资讯采集、舆情监测等等,诸如此类。网络爬虫涉及到的技术(算法/策略)广而复杂,如网页获取、网页跟踪、网页分析、网页搜索、网页评级和结构/非结构化数据抽取以及后期更细粒度的数据挖掘等方方面面,对于新手来说,不是一朝一夕便能完全掌握且熟练应用的,对于作者来说,更无法在一篇文章内就将其说清楚。因此在本篇文章中,我们仅将视线聚焦在网络爬虫的最基础技术——网页抓取方面。

说到网页抓取,往往有两个点是不得不说的,首先是网页编码的识别,另外一个是对网页脚本运行的支持,除此之外,是否支持以POST方式提交请求和支持自动的cookie管理也是很多人所关注的重要方面。其实Java世界里,已经有很多开源的组件来支持各种各样方式的网页抓取了,包括上面提到的四个重点,所以说使用Java做网页抓取还是比较容易的。下面,作者将重点介绍其中的六种方式。

自己以前做过微商,而且还掏钱买过抓取网络邮箱的软件~现在O(∩_∩)O哈哈~我自己做~当然啦,没有别人做得好~只是功能还是差不多啦~

给一个带协议的网站~然后深入网页中查找邮箱~

因为博主知识有限~线程池目前还没有学~导致无法控制线程~~~见谅~
还有~就是没有设置停止按钮~也是因为没学线程池~水平不够啊~
只能关闭软件来停止程序~

package cn.hncu.bs;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.swing.JOptionPane; /**
*
* @author 陈浩翔
* @version 1.0 2016-5-12
*/
public class SpiderUi extends javax.swing.JFrame { public SpiderUi() {
super("网络蜘蛛1.0-陈浩翔版权所有!");
initComponents(); } private void initComponents() { jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
tfdUrl = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
tfdTime = new javax.swing.JTextField();
jLabel4 = new javax.swing.JLabel();
btnRun = new javax.swing.JButton();
jButton1 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new java.awt.Dimension(400, 400));
getContentPane().setLayout(null); jLabel1.setFont(new java.awt.Font("Dialog", 1, 24));
jLabel1.setForeground(new java.awt.Color(255, 0, 51));
jLabel1.setText("\u7f51\u7edc\u8718\u86db-\u7f51\u9875\u90ae\u7bb1\u6293\u53d6\u56681.0");
getContentPane().add(jLabel1);
jLabel1.setBounds(30, 20, 350, 70); jLabel2.setFont(new java.awt.Font("Dialog", 1, 14));
jLabel2.setText("\u9012\u5f52\u6df1\u5165\u5c42\u6570:");
getContentPane().add(jLabel2);
jLabel2.setBounds(20, 190, 110, 30); tfdUrl.setFont(new java.awt.Font("Dialog", 1, 12));
getContentPane().add(tfdUrl);
tfdUrl.setBounds(20, 140, 350, 30); jLabel3.setFont(new java.awt.Font("Dialog", 1, 14));
jLabel3.setText("\u8d77\u59cbURL:");
getContentPane().add(jLabel3);
jLabel3.setBounds(20, 100, 70, 30); tfdTime.setFont(new java.awt.Font("Dialog", 1, 14));
getContentPane().add(tfdTime);
tfdTime.setBounds(20, 230, 60, 30); jLabel4.setFont(new java.awt.Font("Dialog", 0, 11));
jLabel4.setText("\u5373\u641c\u7d22\u7f51\u9875\u90ae\u7bb1\u65f6,\u641c\u7d22\u6df1\u5165\u7684\u5c42\u6570,\u5efa\u8bae200\u5de6\u53f3");
getContentPane().add(jLabel4);
jLabel4.setBounds(90, 230, 250, 30); btnRun.setFont(new java.awt.Font("Dialog", 1, 18));
btnRun.setForeground(new java.awt.Color(0, 51, 255));
btnRun.setText("\u5f00\u59cb\u6293\u53d6");
btnRun.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRunActionPerformed(evt);
}
});
getContentPane().add(btnRun);
btnRun.setBounds(40, 300, 110, 50); jButton1.setFont(new java.awt.Font("Dialog", 1, 18));
jButton1.setForeground(new java.awt.Color(0, 51, 255));
jButton1.setText("\u5e2e\u52a9");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
getContentPane().add(jButton1);
jButton1.setBounds(230, 300, 120, 50); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(this, "抓取的邮箱存储在D:\\net\\mail.txt文件中\r\nURL存储在D:\\net\\http.txt文件中");
} private void btnRunActionPerformed(java.awt.event.ActionEvent evt) {
int time;
try {
time = Integer.parseInt(tfdTime.getText());
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(this, "输入的层数格式错误!应该为整数!");
return;
} try {
String inet = tfdUrl.getText();
URL url = new URL(inet);
//System.out.println(url.getHost());
File file = new File("D://net");
if (!file.exists()) {
file.mkdir();
} DataOutputStream dout = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(
"D:\\net\\mail.txt", true)));
DataOutputStream doutHttp = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(
"D:\\net\\http.txt", true)));
new Thread(new RunThread(url, time, dout, doutHttp)).start();
//System.out.println("一个线程读取完!");
} catch (MalformedURLException e) {
JOptionPane.showMessageDialog(this, "请输入正确的URL地址!!");
return;
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "请输入正确的URL地址!!");
return;
}
} public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new SpiderUi().setVisible(true);
}
});
} private javax.swing.JButton btnRun;
private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JTextField tfdTime;
private javax.swing.JTextField tfdUrl;
} class RunThread implements Runnable {
private URL url = null;
private int time = 0;
private DataOutputStream dout = null;
DataOutputStream doutHttp = null; public RunThread() {
} public RunThread(URL url, int time, DataOutputStream dout,
DataOutputStream doutHttp) {
this.url = url;
this.time = time;
this.dout = dout;
this.doutHttp = doutHttp;
} @Override
public void run() {
try {
if (time == 0) {
return;
}
BufferedReader br = new BufferedReader(new InputStreamReader( url.openStream()));
String regex = "\\w+@\\w+(\\.\\w+)+"; Pattern p = Pattern.compile(regex); Pattern pUrl = Pattern
.compile("http://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?"); String line = null;
while ((line = br.readLine()) != null) {
Matcher m = p.matcher(line); Matcher mUrl = pUrl.matcher(line);
while (mUrl.find()) {
try {
BufferedReader br2 = new BufferedReader(
new InputStreamReader(new FileInputStream(
"http.txt")));
String s = null;
boolean is = false;
while ((s = br2.readLine()) != null) {
if (s.equals(mUrl.group())) {
is = true;
break;
}
}
if (is) {
continue;
}
if (mUrl.group().endsWith("jpg")) {
continue;
}
if (mUrl.group().endsWith("png")) {
continue;
}
//System.out.println(mUrl.group());
doutHttp.writeBytes(mUrl.group() + "\r\n");
doutHttp.flush();//流刷新缓存
new Thread(new RunThread(new URL(mUrl.group()), time--,
dout, doutHttp)).start();
//creat(mUrl.group(), new URL(mUrl.group()),time--, dout,doutHttp);
} catch (Exception e) {
//System.out.println("URL错误");
return;
}
} while (m.find()) {
BufferedReader br2 = new BufferedReader(new InputStreamReader(new FileInputStream("chx.txt")));
String s = null;
boolean is = false; while ((s = br2.readLine()) != null) {
if (s.equals(m.group())) {
is = true;
break;
}
} if (is) {
continue; }
dout.writeBytes(m.group() + "\r\n");
dout.flush();
//System.out.println(m.group());
} }
} catch (FileNotFoundException e) {
//System.out.println("文件错误");
return;
} catch (IOException e) {
//System.out.println("URL异常");
return;
}
}
}

程序主界面图:

Java---网络蜘蛛-网页邮箱抓取器~源码的更多相关文章

  1. Java+JQuery实现网页显示本地文件目录(含源码)

    原文地址:http://www.cnblogs.com/liaoyu/p/uudisk.html 源码地址:https://github.com/liaoyu/uudisk 前段时间为是练习JQuer ...

  2. Java网络蜘蛛/网络爬虫 Spiderman

    Spiderman - 又一个Java网络蜘蛛/爬虫 Spiderman 是一个基于微内核+插件式架构的网络蜘蛛,它的目标是通过简单的方法就能将复杂的目标网页信息抓取并解析为自己所需要的业务数据. 主 ...

  3. Android登录client,验证码的获取,网页数据抓取与解析,HttpWatch基本使用

    大家好,我是M1ko.在互联网时代的今天,假设一个App不接入互联网.那么这个App一定不会有长时间的生命周期,因此Android网络编程是每个Android开发人员必备的技能.博主是在校大学生,自学 ...

  4. python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容

    python3.4学习笔记(十七) 网络爬虫使用Beautifulsoup4抓取内容 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖 ...

  5. [转]使用Scrapy建立一个网站抓取器

    英文原文:Build a Website Crawler based upon Scrapy 标签: Scrapy Python 209人收藏此文章, 我要收藏renwofei423 推荐于 11个月 ...

  6. 【Android 我的博客APP】1.抓取博客首页文章列表内容——网页数据抓取

    打算做个自己在博客园的博客APP,首先要能访问首页获取数据获取首页的文章列表,第一步抓取博客首页文章列表内容的功能已实现,在小米2S上的效果图如下: 思路是:通过编写的工具类访问网页,获取页面源代码, ...

  7. 爬虫---selenium动态网页数据抓取

    动态网页数据抓取 什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页 ...

  8. PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构

    百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...

  9. 网页信息抓取进阶 支持Js生成数据 Jsoup的不足之处

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23866427 今天又遇到一个网页数据抓取的任务,给大家分享下. 说道网页信息抓取 ...

随机推荐

  1. [访问系统] Api_Win32_Mac类工具包 (转载)

    点击下载 Api_Win32_Mac.zip using System; using System.Collections.Generic; using System.Linq; using Syst ...

  2. Linux C++服务器程序设计范式

    <Unix网络编程>30章详细介绍了几种服务器设计范式.总结了其中的几种,记录一下: 多进程的做法: 1.每次创建一个新的请求,fork一个子进程,处理该连接的数据传输. 2.预先派生一定 ...

  3. Sdut 2151 Phone Numbers (山东省ACM第一届省赛题 A)

    题目描述 We know thatif a phone number A is another phone number B's prefix, B is not able to becalled. ...

  4. ffmpeg与RTMP流媒体连接用法(翻译) http://www.chinavideo.org/forum.php?mod=viewthread&tid=15423

    最近浏览国外网站时候发现,翻译不准确的敬请谅解. 1.将文件当做直播送至liveffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/liv ...

  5. GCC选项-Xlinker和-Wl区别

    写下给自己备忘,在一次使用GCC的过程中发现了原来传递给链接器ld可以同时使用Xlinker和Wl两种命令,这两个命令都可以正确传递给ld作为使用,现在总结下两者的区别. Xlinker后面跟的参数第 ...

  6. JQuery 字符串截取

    //字符串截取,全小写 strObj.substring(startIndex,endIndex); //需要注意大小写 strObj.lastIndexOf(String splitObj); // ...

  7. print,print_r,echo,var_dump,var_export比较

    print string 1个参数 返回1 语言结构echo 多个string 无返回 语言结构 print_r array 如果想捕捉 print_r() 的输出,可使用 return 参数.若此参 ...

  8. iOS: 学习笔记, 使用FMDatabase操作sqlite3

    使用FMDatabase操作sqlite3数据库非常简单和方便 // // main.m // iOSDemo0602_sqlite3 // // Created by yao_yu on 14-6- ...

  9. JSON和XML的比较

    整理日: 2015/4/5 ◆可读性 JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负. ◆可扩展性 XML天生有很好的扩展性,JSON当然也有,没有什么是X ...

  10. 菜鸟的ubuntu学习笔记

    初识ubuntu感觉这个系统绝对够高大上,简洁的桌面,流畅的操作界面,在加上神秘的终端控制,突然感觉自己的世界真的好渺小,所以我下定决心在接下来的日子里我要告别windows,把ubuntu学好,尝试 ...