写了一个爬虫的小例子:
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
public class SpiderTest{
public static void main(String[] args) throws IOException, InterruptedException {
URL url =new URL("http://www.baidu.com");
Proxy proxy = new Proxy(Proxy.Type.HTTP,new InetSocketAddress("118.26.147.119",80));
HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);
connection.setConnectTimeout(10000);
connection.setReadTimeout(100000);
connection.setRequestMethod("GET");
connection.setUseCaches(true);
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
connection.connect();
System.out.println(connection.getResponseCode());
int i = connection.getResponseCode();
String content = "";
if(i==HttpURLConnection.HTTP_OK){
InputStream in = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in,"gbk"));
String line = "";
while((line=br.readLine())!=null){
content+=line+"\n\r";
}
System.out.println(content);
}
}
}
package test;
import java.io.IOException;
import java.util.Scanner;
public class ControlTest {
public static void main(String[] args) throws IOException {
Process process = Runtime.getRuntime().exec("java SpiderTest");
Process process2 = Runtime.getRuntime().exec("java SpiderTest");
Process process3 = Runtime.getRuntime().exec("java SpiderTest");
Process process4 = Runtime.getRuntime().exec("java SpiderTest");
Process process5 = Runtime.getRuntime().exec("java SpiderTest");
Process process6 = Runtime.getRuntime().exec("java SpiderTest");
Process process7 = Runtime.getRuntime().exec("java SpiderTest");
Process process8 = Runtime.getRuntime().exec("java SpiderTest");
Process process9 = Runtime.getRuntime().exec("java SpiderTest");
Process process11 = Runtime.getRuntime().exec("java SpiderTest");
Process process12 = Runtime.getRuntime().exec("java SpiderTest");
Process process13 = Runtime.getRuntime().exec("java SpiderTest");
Process process14 = Runtime.getRuntime().exec("java SpiderTest");
Process process15 = Runtime.getRuntime().exec("java SpiderTest");
Process process16 = Runtime.getRuntime().exec("java SpiderTest");
System.out.print(process);
}
}
1、这里面我在ControlTest 这里面执行的process是不是独立的 进程?
2、我如果想往里面传参数的话是不是只能通过String args[]传参数?
3、我如何监控这些进程的运行情况,在windows的进程管理器中只能看到javaw.exe进程。
4、我这个是把编译好的SpiderTest.class文件放到了根目录下,有没有办法直接执行build里的class文件?
谢谢!
5 个解决方案
#1
1、这里面我在ControlTest 这里面执行的process是不是独立的进程?
是,Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例。
2、我如果想往里面传参数的话是不是只能通过String args[]传参数?
进程间通讯方法不止一种。命令行参数可以。
3、我如何监控这些进程的运行情况,在windows的进程管理器中只能看到javaw.exe进程。
java SpiderTest 也是java应用,所以只能看到java进程。
可以考虑进程间通讯。
4、我这个是把编译好的SpiderTest.class文件放到了根目录下,有没有办法直接执行build里的class文件?
java -cp build完成路径 SpiderTest
是,Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例。
2、我如果想往里面传参数的话是不是只能通过String args[]传参数?
进程间通讯方法不止一种。命令行参数可以。
3、我如何监控这些进程的运行情况,在windows的进程管理器中只能看到javaw.exe进程。
java SpiderTest 也是java应用,所以只能看到java进程。
可以考虑进程间通讯。
4、我这个是把编译好的SpiderTest.class文件放到了根目录下,有没有办法直接执行build里的class文件?
java -cp build完成路径 SpiderTest
#2
如果你是同一台机器上,多个进程感觉真没有必要,一般采用多线程就能够很好的解决了啊。
#3
我现在想抓取多个网站内容,每个网站用多线程去抓:
那么我用多线程来区分不同网站,再用多个爬虫分别在多个线程去抓网站会不会出问题?
如果用一个进程抓一个网站,同时有多个线程控制多个爬虫去抓是不是更好一点?
#4
这样做没有任何好处. 缺点倒是有一些: 比如,除了你的工作线程意外,每个java虚拟机都开了若干额外的线程(例如GC线程),消耗系统资源; 额外的内存占用等等.
有人研究吧不同Java程序跑在同一个虚拟机里,没有人研究吧同一个程序泡在多个虚拟机里. (试验集群除外)
有人研究吧不同Java程序跑在同一个虚拟机里,没有人研究吧同一个程序泡在多个虚拟机里. (试验集群除外)
#5
那我现在想在同一时刻对多个网站进行抓取,并且每个网站都有多个爬虫线程运行,这种情况怎么办?线程中嵌套线程么?
#1
1、这里面我在ControlTest 这里面执行的process是不是独立的进程?
是,Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例。
2、我如果想往里面传参数的话是不是只能通过String args[]传参数?
进程间通讯方法不止一种。命令行参数可以。
3、我如何监控这些进程的运行情况,在windows的进程管理器中只能看到javaw.exe进程。
java SpiderTest 也是java应用,所以只能看到java进程。
可以考虑进程间通讯。
4、我这个是把编译好的SpiderTest.class文件放到了根目录下,有没有办法直接执行build里的class文件?
java -cp build完成路径 SpiderTest
是,Runtime.exec() 方法创建一个本机进程,并返回 Process 子类的一个实例。
2、我如果想往里面传参数的话是不是只能通过String args[]传参数?
进程间通讯方法不止一种。命令行参数可以。
3、我如何监控这些进程的运行情况,在windows的进程管理器中只能看到javaw.exe进程。
java SpiderTest 也是java应用,所以只能看到java进程。
可以考虑进程间通讯。
4、我这个是把编译好的SpiderTest.class文件放到了根目录下,有没有办法直接执行build里的class文件?
java -cp build完成路径 SpiderTest
#2
如果你是同一台机器上,多个进程感觉真没有必要,一般采用多线程就能够很好的解决了啊。
#3
我现在想抓取多个网站内容,每个网站用多线程去抓:
那么我用多线程来区分不同网站,再用多个爬虫分别在多个线程去抓网站会不会出问题?
如果用一个进程抓一个网站,同时有多个线程控制多个爬虫去抓是不是更好一点?
#4
这样做没有任何好处. 缺点倒是有一些: 比如,除了你的工作线程意外,每个java虚拟机都开了若干额外的线程(例如GC线程),消耗系统资源; 额外的内存占用等等.
有人研究吧不同Java程序跑在同一个虚拟机里,没有人研究吧同一个程序泡在多个虚拟机里. (试验集群除外)
有人研究吧不同Java程序跑在同一个虚拟机里,没有人研究吧同一个程序泡在多个虚拟机里. (试验集群除外)
#5
那我现在想在同一时刻对多个网站进行抓取,并且每个网站都有多个爬虫线程运行,这种情况怎么办?线程中嵌套线程么?