1. 程式人生 > >利用htmlparser爬蟲獲取指定完整的完整區域資訊

利用htmlparser爬蟲獲取指定完整的完整區域資訊

package com.hundsun.pc;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;

public class Url {
	ArrayList<String> links= new ArrayList<String>();  
	final static String url="http://www.diqudaima.com";
	public static void main(String[] args) {
		String vistor = null ;
		try {
			LinkQueue queue = new LinkQueue();
			queue.addUnvisitedUrl("/zhejiang/hangzhoushi/");
			do{
				try {
					HttpClient http = new DefaultHttpClient();
					vistor = queue.unVisitedUrlDeQueue().toString();
					System.out.println("開始訪問:" + url + vistor);
					HttpGet hg = new HttpGet(url + vistor);
					HttpResponse hr;
					hr = http.execute(hg);
					HttpEntity he = hr.getEntity();//
					Url Url = new Url();
					if (he != null) {
						String charset = EntityUtils.getContentCharSet(he);
						InputStream is = he.getContent();
						BufferedReader br = new BufferedReader(
								new InputStreamReader(is, "GBK"));
						String line = null;
						int i = 0;
						while ((line = br.readLine()) != null) {
							Url.geUrl(line, queue);
						}
					}
					queue.addVisitedUrl(vistor);
					http.getConnectionManager().shutdown();
					System.out.println("獲取區域資訊數:"+queue.getMap().size()+"已經訪問連結數:"+queue.getVisitedUrl().size()+"異常連結數:"+queue.getErrorUrl().size());
				} catch (Exception e) {
					System.out.println("訪問異常:"+url+vistor);
					queue.adderrorUrl(vistor);
					queue.addUnvisitedUrl(vistor);
				} 
			}while(!queue.isUnvisitedUrlsEmpty());
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			
		}
	}
	public  void geUrl(String html,LinkQueue queue){
		try{
			 NodeFilter filter = new TagNameFilter("li");
			 Parser p=new Parser();  
		     p.setInputHTML(html);  
		     NodeList list = p.extractAllNodesThatMatch(filter);  
		     for (int i = 0; i < list.size(); i++) {  
		    	 Node textnode = (Node) list.elementAt(i);
		    	 NodeList listChildren =textnode.getChildren();
		    	 String key="";
		    	 String value="";
		    	 for (int j = 0; j < listChildren.size(); j++) {  
		    		 Node textnodeChildren = (Node) listChildren.elementAt(j);
		    		 if(textnodeChildren.getClass()==LinkTag.class){
		    			 LinkTag nodeChildren = (LinkTag)textnodeChildren;
		    			 key=nodeChildren.getLinkText();
		    			 queue.addUnvisitedUrl(nodeChildren.getLink());
		    		 }else{
		    			 value=textnodeChildren.getText();
		    			 if(value.split("郵編").length>1)
		    				 value= value.substring(value.indexOf("地區編碼:")+5, value.indexOf("郵編:"));
		    			 if(value.startsWith("[")){
		    				 value=value.replace("[", "");
			    			 value=value.replace("]", "");
		    			 }
		    			 if(key.equals("")){
		    				 String[] args =  value.split("\\[");
		    				 key = args[0];
		    				 value =  args[1].replace("]", "");
		    			 }
		    		 }
		    	 }
		    	 System.out.println("key="+key+"       value="+value);
		    	 if(!key.equals(""))
		    		 queue.getMap().put(key, value);
            }  
		}catch (Exception e) {
			e.printStackTrace();
		}
		 
	}

輔助類

package com.hundsun.pc;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * Created by amosli on 14-7-9.
 */
public class LinkQueue {
    //已經訪問的佇列
    private static Set visitedUrl = new HashSet();
    //已經訪問的佇列
    private static Set errorUrl = new HashSet();
    //未訪問的佇列
    private static Queue unVisitedUrl = new Queue();
    private Map map = new HashMap<String,String>();
    //獲得URL佇列
    public static Queue getUnVisitedUrl() {
        return unVisitedUrl;
    }
    public static Set getVisitedUrl() {
        return visitedUrl;
    }
    //新增到訪問過的URL佇列中
    public static void addVisitedUrl(String url) {
        visitedUrl.add(url);
    }
    public static void adderrorUrl(String url) {
    	errorUrl.add(url);
    }

    //刪除已經訪問過的URL
    public static void removeVisitedUrl(String url){
        visitedUrl.remove(url);
    }
    //未訪問的URL出佇列
    public static Object unVisitedUrlDeQueue(){
        return unVisitedUrl.deQueue();
    }
    //保證每個URL只被訪問一次,url不能為空,同時已經訪問的URL佇列中不能包含該url,而且因為已經出隊列了所未訪問的URL佇列中也不能包含該url
    public static void addUnvisitedUrl(String url){
        if(url!=null&&!url.trim().equals("")&&!visitedUrl.contains(url)&&!unVisitedUrl.contains(url))
        unVisitedUrl.enQueue(url);
    }
    //獲得已經訪問過的URL的數量
    public static int getVisitedUrlNum(){
        return visitedUrl.size();
    }

    //判斷未訪問的URL佇列中是否為空
    public static boolean isUnvisitedUrlsEmpty(){
        return unVisitedUrl.empty();
    }
	public Map getMap() {
		return map;
	}
	public void setMap(Map map) {
		this.map = map;
	}
	public static Set getErrorUrl() {
		return errorUrl;
	}
	public static void setErrorUrl(Set errorUrl) {
		LinkQueue.errorUrl = errorUrl;
	}
    
    
}


執行結果如下圖



相關推薦

利用htmlparser爬蟲獲取指定完整完整區域資訊

package com.hundsun.pc; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Ar

zabbix:利用zabbix api獲取指定組中的主機的名字並將其修改

思路講解:首先利用hostgroup.get方法獲取zabbix組的id與名字,然後檢索獲得指定組的id,再利用host.get獲取該指定組下的所有主機的id與名字,最後利用host.update根據主機的id更新主機的名字。 程式碼如下: #!/usr/bin/env python

zabbix:利用zabbix api獲取指定組中的主機的名字並將其修改

思路講解:首先利用hostgroup.get方法獲取zabbix組的id與名字,然後檢索獲得指定組的id,再利用host.get獲取該指定組下的所有主機的id與名字,最後利用host.update根據主機的id更新主機的名字。 程式碼如下: #!/usr/bin

利用python爬蟲獲取黃金價格

繼續練手,根據之前獲取汽油價格的方式獲取了金價,暫時沒錢投資,看看而已 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 獲取每天黃金價格 @author: yufei @site: http://www.a

利用python爬蟲獲取豆瓣讀書資料建立書單

0. 寫在前面 網路爬蟲: A Web crawler, sometimes called a spider, is an Internet bot that systematically browses the World Wide Web, t

字串遞迴獲取指定字元位置內容資訊

針對目前字串處理indexof 無法直接獲取指定到的位置字元處理 /// <summary> /// 字串擷取,獲取 /// 原字串:啊啊啊\\不不不\\擦擦擦\\嗯嗯嗯\\打算 /// 次數是1: 啊啊啊\\

通過ip地址獲取ip地址的區域資訊

return $res1['data']["country"].$res1['data'][ "region"].$res1['data']["city"]."_".$res1['data'][ "isp"];

編寫網路爬蟲獲取餓了麼商家資訊(一)

利用HttpClient和Jsoup兩種工具分別進行爬取資料 maven座標: <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons

python 獲取指定pool的成員資訊

2. 獲取pool的成員: pool 方法: get_ltm_pool_members sub __get_pool_members { my ($self, $pool, $module)= @_; return $self->_

獲取中文的完整拼音並輸出

stat rtert bin tca spa nat ++ () one 1.添加maven依賴      <dependency> <groupId>com.belerweb</groupId>

python 利用爬蟲獲取頁面上下拉框裏的所有國家

span googl lec ram chrome color 模塊 獲取 ica 前段時間,領導說列一下某頁面上的所有國家信息,話說這個國家下拉框裏的國家有兩三百個,是第三方模塊導入的,手動從頁面拷貝,不切實際,於是想著用爬蟲去獲取這個國家信息,並保存到文件裏。 下面是具

前端獲取http和完整項目名

tex etc TE sch 需要 h+ ext contex 斜杠 <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+reques

python xpath 獲取指定頁面中指定區域的html代碼

pytho sts clas xpath nbsp install .get element XML   最近一個朋友問我怎麽把一個指定區域的內容轉成pdf,網上查了一下python裏面有個wkhtmltopdf模塊可以將str、file、url轉成pdf,我們今天不聊

2018 - Python 3.7 爬蟲利用 Scrapy 框架 獲取圖片並下載(二)

一、 通過命令構建一個爬蟲專案 二、定義 item 三、啟用 pipeline 管道 四、編寫爬蟲 Spider 五、執行爬蟲 六、結果檢視 未安裝 Scrapy 框架,見上一篇文章:框架安裝及配置 一、 通過命令構建一個爬蟲專

Python爬蟲1-獲取指定網頁原始碼

1、任務簡介 前段時間一直在學習Python基礎知識,故未更新部落格,近段時間學習了一些關於爬蟲的知識,我會分為多篇部落格對所學知識進行更新,今天分享的是獲取指定網頁原始碼的方法,只有將網頁原始碼抓取下來才能從中提取我們需要的資料。 2、任務程式碼 Python獲取指定網頁

利用 FilesystemIterator 獲取指定目錄下的所有檔案

/** * 獲取指定目錄下的所有檔案 * @param null $path * @return array */ public function getFileByPath($path = null) { $dirs = new \FilesystemIterator($path); $ar

利用 FilesystemIterator 獲取指定目錄下的所有文件

目錄 files details csdn 所有 lena turn func article /** * 獲取指定目錄下的所有文件 * @param null $path * @return array */ public function getFileByPath($

獲取模型中完整的多對多資料

可獲取到model中query多對多的完整資料 query = queryset.order_by(ordering).first() for topic in query._meta.many_to_many: lista = l

【原創】網頁全站下載器4.0黑色版,利用爬蟲獲取所有js、css、img!

此程式是作者原創,轉載請註明出處(csdn:pythoning183)!!!!!!!版本號:WebFileSpider4.0使用前,點個贊謝謝!此下載器可以下載任意網頁的原始碼和所有js、css、img檔案,包括隱藏網頁和js和css裡隱藏的檔案,實現了幾乎不遺漏的模仿建站,

Python unittest利用discover獲取指定目錄或多級目錄下的測試用例

最近在寫介面自動化框架,由python+requests+unittest構建(其他還有些匯入模組,這裡暫且不說),目前還在搭建當中,整體其框架結構如下: 在編寫Common下的RunTools元件(主要封裝的是獲取測試用例、執行測試、生成測試報告、傳送郵件等相關函式)