利用jsoup来爬取网站匿名IP实践

大二时接触到了java代码的爬虫功能,正好系统的需要,需要获取一些匿名的IP地址。

解决思路是通过jsoup包去解析html,从而获取匿名IP地址,

再通过设置IP地址以及端口号去访问一个网址从而验证匿名IP地址是否可用。

部分代码示例:

由于原有系统需要从数据库中获取ip地址,所以先写一个简单数据库连接工厂类:

	public static Connection getConnection(){
		try {
			Class.forName(driver);
			return DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("##获取数据库连接失败!##");
			return null;
		}
	}


接下来就是jsoup登场了,

由Jsoup.connect(String url)静态方法获取一个Connect,再通过connect来获取一个Document对象。

这里的document就相当于(DOM)Document Object Model的document,也就是html页面的某一个节点。

/**
	 * 由于该代理网站表格中有10页,故仅需循环10次解析相应网页
	 * 得到10个解析后的网页,以string的形式
	 * @return org.jsoup.nodes.Document
	 */
	public List getDocument() {
		List list = new ArrayList();
		StringBuilder url1 = new StringBuilder();
		url1.append("http://www.kuaidaili.com/ops/proxylist/"); //从该网址
		for (int i = 1; i < 11; i++) {
			StringBuilder url = new StringBuilder();
			url.append(url1);
			url.append(i + "");
			url.append("/");
			System.out.println("url拼接成功!"+url);
			Connection connJsoup = Jsoup.connect(url.toString());
			
			Document dochtml = new Document(url.toString());
			try {
				dochtml = connJsoup.timeout(20000).get();
				System.out.println("获取document成功!");
			} catch (Exception e) {
				e.printStackTrace();
				System.out.println("#connJsoup.timeout(20000).get();出错!!!#");
			}
			list.add(dochtml);
		}
		return list;
	}


获取完10个document对象后,就需要来从10个html对象中解析出我们所需要的匿名ip:

  /**
     * 具体执行方法
     */
    public void action(){
    	List list = getIpAndPort(getDocument());
    	for(int i = 0;i < list.size();i++){
    		try {
				if(getHtmlResultString(list.get(i))){
					insert(list.get(i));
				}
			} catch (Exception e) {
				System.out.println("action 方法执行失败!");
				e.printStackTrace();
			}
    		System.out.println("第"+i+"个ip已分析完");
    	}
    }


/**
	 * 得到每个ip检验后的结果
	 * @return
	 * @throws Exception 
	 */
	public boolean getHtmlResultString(IpInfo ipInfo) throws Exception{
		
		String myIp = new String();
		try {
			InetAddress ia = InetAddress.getLocalHost();
			myIp = ia.getHostAddress();
		} catch (UnknownHostException e) {
			e.printStackTrace();
			System.out.println("####获取本机ip地址失败####");
		}

		if(getHtml1(ipInfo) == null ){
			return false;
		}else{
        	return true;
        }
	}

	/**
	 * 通过解析后的网页得到里面的ip和端口
	 * 
	 * @param strs
	 * @return
	 */
	public List getIpAndPort(List documents) {
		List list = new ArrayList();
		for (int i = 0; i < documents.size(); i++) {
			Element body = documents.get(i).body();
			
			Element targetDiv = body.getElementById("freelist");
			Elements trs = targetDiv.getElementsByTag("tr");
			for (int j = 1; j < trs.size(); j++) {
				Elements tds = trs.get(j).children();
				if (tds.get(2).text().trim().equals("高匿名")) {
					IpInfo ii = new IpInfo();
					
					ii.setIpaddress(tds.get(0).text().trim());
					ii.setPort(tds.get(1).text().trim());
					list.add(ii);
					System.out.println("获取高匿名ip成功!"+ii.toString());
				}
			}
		}
		return list;
	}

最后执行完后,通过设置匿名ip以及端口去测试,这里的判断依据是,如果超时或者报错,就说明该匿名ip不可用。

    public String getHtml1(IpInfo ipInfo){
    	@SuppressWarnings("resource")
		WebClient wc = new WebClient(BrowserVersion.CHROME);
    	wc.getOptions().setCssEnabled(false);
    	wc.getOptions().setJavaScriptEnabled(false);
    	ProxyConfig pc = new ProxyConfig(ipInfo.getIpaddress(), Integer.parseInt(ipInfo.getPort()));
    	wc.getOptions().setProxyConfig(pc);
    	HtmlPage html;
		try {
			html = wc.getPage("http://www.ip138.com/ip2city.asp");
		} catch (FailingHttpStatusCodeException | IOException e) {
			System.out.println("这个ip不行!");
			return null;
		}
    	return html.asXml();
    }

部分运行结果图:

利用jsoup来爬取网站匿名IP实践_第1张图片


想法很美好,现实却是残酷的,因为从公网爬取到的大部分免费IP都用不了的。

赠人玫瑰手留余香,希望能帮助到有需要的童鞋。












你可能感兴趣的:(网络爬虫学习)