Utilice httpclient y multiproceso para cepillar el código de tráfico

Se originó en cantar, porque hay pocos amigos en cantar, las visitas son bajas y no quiero agregar parientes y amigos, es principalmente demasiado problemático, así que reflexioné sobre el mecanismo de acceso de cantar y me preparé para usar biblioteca httpclient de java Escaneando el tráfico, pensando en la reutilización dinámica de IP, pensé en usar subprocesos múltiples para actualizar, pero descubrí que la velocidad no aumentó, todavía está pasando una URL a la siguiente URL, el orden de cepillado aquí es aleatorio. El problema principal es la IP del proxy. Encontré más de 1,000 IP en Internet. Muchas de ellas son demasiado lentas para responder, por lo que configuré un mecanismo de tiempo de espera. Si excede un período de tiempo, se lanzará una excepción y se ignorará. ¡Es solo que la velocidad es demasiado lenta y debe mejorarse! ! Cualquiera que tenga buenas sugerencias de mejora puede compartir y pedir consejo.


Nota: La siguiente es la primera versión del código que se escribió por primera vez. Más tarde, pensé en el problema del código, porque en la prueba real, se descubrió que, aunque se usaron subprocesos, realmente no desempeñaba el papel de multiproceso, y no se obtuvo la eficiencia Mejora, porque el problema también es una forma importante de aprender, por lo que no cambiaré la primera versión del código, para que todos la usen como referencia. Publiqué una versión mejorada del código de acceso de cepillado de subprocesos múltiples en la parte posterior. Después de probar este código, se descubrió que la velocidad había mejorado significativamente. ¡Los resultados son reales y efectivos!riendo a carcajadas


Las razones de los defectos de la primera versión del código a continuación se enumeran a continuación:

Principalmente debido a mi vaga comprensión de los métodos de inicio y ejecución en la programación multiproceso al principio, primero hablemos de la diferencia entre los dos:

(1) inicio :

Utilice el método de inicio para iniciar el subproceso, que realmente realiza una operación de subprocesos múltiples. Esto es para continuar ejecutando el siguiente código sin esperar la ejecución del código del método de ejecución. Inicie un subproceso llamando al método de inicio de la clase Thread. Este subproceso está en un estado listo y no se está ejecutando. Una vez que se obtiene el segmento de tiempo de la CPU, se ejecuta el método de ejecución. La ejecución aquí se convierte en el cuerpo del subproceso, que contiene el contenido necesario de este hilo ejecutado, el método de ejecución termina y este hilo termina.

(2) ejecutar :

El método de ejecución es solo un método ordinario de la clase. Si llama al método de ejecución directamente, todavía hay solo el hilo principal en el programa. Todavía hay solo una ruta de ejecución del programa, o debe ejecutarse secuencialmente, o puede continuar después de ejecutar el método de ejecución Ejecutar el código de la faceta, para que no se logre el propósito de escribir el hilo.


Por lo tanto, en la primera versión del código, se ejecuta mi método de inicio de subprocesos, por lo que no se generan otros subprocesos, por lo que no se logra el propósito de subprocesos múltiples.



web_look.java

import java.io.*;
import java.util.*;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpConnectionParams;

public class Web_look {
	
	public static void main(String[] args) throws IOException
	 {
		 int count=0;
		 Map<String,String> map =new HashMap<String,String>();
		 
		 FileReader reader=new FileReader("c://IP.txt");//读取代理IP地址
		 BufferedReader br=new BufferedReader(reader);
		 String str=null;
		 while((str=br.readLine())!=null)//格式写成IP+端口
		 {
			 String result[]=str.split("@");
			 String info[]=result[0].split(":");
			 map.put(info[0], info[1]);
		 }
		 Set<String> set=map.keySet();
		 Iterator<String> iter=set.iterator();
		 
		 
	     HttpClient client = new HttpClient();   
	     //设置超时时间
	     client.setTimeout(10000);
	     client.setConnectionTimeout(10000);
	     //设置cookie管理策略
	     client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
	     
	     while(iter.hasNext())//不断的取出IP和端口
	     {
	    	String key=iter.next();
			System.out.println(key+":"+map.get(key));
	    	//用try-catch来忽略超时异常继续执行
			try{
				//设置代理服务器地址和端口
			    client.getHostConfiguration().setProxy(key,Integer.parseInt(map.get(key)));
			    //这是用刷的是唱吧的访问量,亲测有效,只不过效率不是怎么高,因为代理服务器有快有慢,所以设置了超时机制。
			    //而且,貌似一个IP不能连续刷多首歌曲,所以就只能附带刷刷别的网页好了。
			    MyThread song1= new MyThread("http://changba.com/s/TKSPrlyJgkd4cUir8pGZkQ?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
			    MyThread song2= new MyThread("http://changba.com/s/48SlsCcpHNiNXPji_VyU5Q?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song3= new MyThread("http://changba.com/s/0GP_YQzqRJOJUHjDbRpPBg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song4= new MyThread("http://changba.com/s/XXCW9aOqzkiQW1ha1hSMvg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song5= new MyThread("http://changba.com/s/7HpyApA4gWXoh-V0usAMfw?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song6= new MyThread("http://changba.com/s/8y6IvXu-8uwUrrT7uEtHEA?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
//			    MyThread song7= new MyThread("http://changba.com/s/lyBc498kdr9N4DgR5lqFCg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk",client);
			    
			    
			    song1.run();
			    song2.run();
//			    song3.run();
//			    song4.run();
//			    song5.run();
//			    song6.run();
//			    song7.run();

			    
			    
			    //使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https
				//使用POST方法 
			    //HttpMethod method = new PostMethod("http://changba.com/s/0yKWymXZXeGZcF0P3mM8Bg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk"); 
			    //设置请求头,来模拟浏览器登陆,有些网站需要,有些网站不需要,看具体是什么网站了
//  		    method.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;"); 
//			    method.setRequestHeader("Accept-Language", "zh-cn"); 
//			    method.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3"); 
//			    method.setRequestHeader("Accept-Charset","encoding"); 
//			    method.setRequestHeader("Keep-Alive", "300"); 
//			    method.setRequestHeader("Connection", "Keep-Alive"); 
//			    method.setRequestHeader("Cache-Control", "no-cache"); 
			    
			    //client.executeMethod(method);
			    //打印服务器返回的状态
			    //System.out.println(method.getStatusLine());
			    //打印返回的信息
			    //System.out.println(method.getResponseBodyAsString());
			    //释放连接,否则会报错recycle
			    //method.releaseConnection();
			}catch(Exception e)
			{
				e.printStackTrace();
			}
			count++;
			System.out.println("第"+count+"个IP地址");
	     }
   }
}

Mythread.java

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.PostMethod;


public class MyThread extends Thread{
	private String web_name;
	private HttpClient client;
	public MyThread(String web_name,HttpClient client)
	{
		this.web_name=web_name;
		this.client=client;
	}
	public void run()
	{
		HttpMethod method = new PostMethod(web_name);
		try
		{
			client.executeMethod(method);
			System.out.println(method.getStatusLine());
			System.out.println(method.getResponseBodyAsString());
			method.releaseConnection();
			
		}catch(Exception e)
		{
			e.printStackTrace();
			
		}
	}
}

El multi-threading aquí no tiene el efecto esperado, porque parece que acceder a múltiples canciones a la misma IP en Sing Bar es solo la primera visitada, por lo que aunque esté escrito con múltiples threads, solo se visita la primera. El número de visitas a la canción se ha incrementado en 1 y el resto permanece sin cambios. Por lo tanto, si hay otras páginas, puede agregar otras páginas a multiproceso para actualizar.

——————————————————————————————————————————————— - el línea divisoria ----------------------------------------------- - ———


A continuación, publicaré mi versión mejorada. Esta versión realmente implementa el acceso de múltiples subprocesos y es más flexible. Puede usar múltiples subprocesos para escanear la misma página web o diferentes, y puede elegir diferentes archivos de direcciones IP.

web_look.java

import java.io.*;
import java.util.*;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.params.HttpConnectionParams;

public class Web_look {
	
	public static void main(String[] args) throws IOException
	 {
		
			String web_name=null;
			web_name="http://changba.com/s/0yKWymXZXeGZcF0P3mM8Bg?code=Gt1bjDM0qnHCJdoHUPnwOOfDhUzYnTz-KfffnVr9zf7j8kkd7OlN9bo9NlHq5j6rFeHPZ8iGR3663XuAiDYOEcYV2ky5V8Bk";
	    	//用try-catch来忽略超时异常继续执行
			try{
				Thread threads[]=new Thread[5];
			    threads[0]= new Thread(new MyThread(web_name,"c://IP.txt"));
			    threads[1]= new Thread(new MyThread(web_name,"c://IP1.txt"));
			    threads[2]= new Thread(new MyThread(web_name,"c://IP2.txt"));
			    threads[3]= new Thread(new MyThread(web_name,"c://IP3.txt"));
			    threads[4]= new Thread(new MyThread(web_name,"c://IP4.txt"));
			   
			    for(int i=0;i<5;i++)
			    {
			    	threads[i].start();
			    }
			}catch(Exception e)
			{
				e.printStackTrace();
			}
	     }
}


MyThread.java

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.PostMethod;


public class MyThread implements Runnable{
	private String web_name;
	private String IP_file;
	private HttpClient client = new HttpClient();  
	private String str=null;
	private FileReader reader;
	private BufferedReader br;
	private Map<String,String> map =new HashMap<String,String>();
	
	public MyThread(String web_name,String IP_file)
	{
		this.web_name=web_name;
		this.IP_file=IP_file;
	}
	
	public void run()
	{
		
		try {
			reader=new FileReader(IP_file);
			br=new BufferedReader(reader);
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}//读取代理IP地址
		try {
			while((str=br.readLine())!=null)//格式写成IP+端口
			 {
				 String result[]=str.split("@");
				 String info[]=result[0].split(":");
				 map.put(info[0], info[1]);
			 }
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		 Set<String> set=map.keySet();
		 Iterator<String> iter=set.iterator();
		    
	    //设置超时时间
	    client.setTimeout(10000);
	    client.setConnectionTimeout(10000);
	    //设置cookie管理策略
	    client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
	    
	    while(iter.hasNext())//不断的取出IP和端口
	     {
	    	String key=iter.next();
			System.out.println(key+":"+map.get(key));
			try
			{
				//设置代理服务器地址和端口
			    client.getHostConfiguration().setProxy(key,Integer.parseInt(map.get(key)));
			    //这是用刷的是唱吧的访问量,亲测有效,只不过效率不是怎么高,因为代理服务器有快有慢,所以设置了超时机制。
			    //而且,貌似一个IP不能连续刷多首歌曲,所以就只能附带刷刷别的网页好了。
			    
			}catch(Exception e)
			{
				e.printStackTrace();
			}
			HttpMethod method = new PostMethod(web_name);
			try
			{
				System.out.println(IP_file);
				client.executeMethod(method);
				
				//System.out.println(method.getStatusLine());
				//System.out.println(method.getResponseBodyAsString());
				method.releaseConnection();
				
			}catch(Exception e)
			{
				e.printStackTrace();
				
			}
	     }
	}
}




Supongo que te gusta

Origin blog.csdn.net/u012457196/article/details/37520033
Recomendado
Clasificación