1. 程式人生 > >簡單多執行緒爬蟲+Jsoup分析

簡單多執行緒爬蟲+Jsoup分析

使用簡單多執行緒和Jsoup分析,得到CSDN的首頁的所有子網頁連線。

執行效果如下圖


------------------------------------------------------------------------------------------------------


---------------------------------------------------------------------------------------------------------------------------------


程式碼如下

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.http.HttpEntity;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class WebCrawler {

	ArrayList<String> allurlSet = new ArrayList<String>();
	ArrayList<String> notCrawlurlSet = new ArrayList<String>();
	HashMap<String, Integer> depth = new HashMap<String, Integer>();
	int crawDepth = 2;
	int threadCount = 10;
	int count = 0;
	public static final Object signal = new Object();// 執行緒間通訊

	public static void main(String args[]) {
		final WebCrawler wc = new WebCrawler();
		wc.addUrl("http://www.csdn.net", 1);
		long start = System.currentTimeMillis();
		System.out.println("**************開始爬蟲**************");
		wc.begin();

	       while(true){  
	            if(wc.notCrawlurlSet.isEmpty()&& Thread.activeCount() == 1||wc.count==wc.threadCount){  
	                long end = System.currentTimeMillis();  
	                System.out.println("總共爬了"+wc.allurlSet.size()+"個網頁");  
	                System.out.println("總共耗時"+(end-start)/1000+"秒");  
	                System.exit(1);  
//	              break;  
	            }
	       }

	}

	private void begin() {
		for (int i = 0; i < threadCount; ++i) {
			new Thread(new Runnable() {
				public void run() {

					while (true) {
						String tmp = getAUrl();
						if (tmp != null) {
							crawler(tmp);
						} else {
							synchronized (signal) {
								try {
									count++;
									System.out.println(Thread.currentThread().getName() + ": 等待");
									signal.wait();
								} catch (Exception e) {
									e.printStackTrace();
								}

							}
						}
					}

				}
			}, "thread-" + i).start();
		}
	}

	public void crawler(String sUrl) {
		URL url;
		try {
			HttpClient client = HttpClients.createDefault();
			HttpGet get = new HttpGet(sUrl);
			get.setHeader("User-Agent",
					"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36");
			CloseableHttpResponse response = (CloseableHttpResponse) client.execute(get);
			HttpEntity entity = response.getEntity();
			String content = EntityUtils.toString(entity);
			int d = depth.get(sUrl);
			System.out.println("爬網頁" + sUrl + "成功,深度為" + d + " 是由執行緒" + Thread.currentThread().getName() + "來爬");

			if (d < crawDepth) {
				Document doc = Jsoup.parseBodyFragment(content);
				Elements es = doc.select("a");
				String temp = "";
				for (Element e : es) {
					temp = e.attr("href");
					if (temp != null) {
						synchronized (signal) {
							addUrl(temp, d + 1);
							if (count > 0) {
								signal.notify();
								count--;
							}
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public synchronized String getAUrl() {
		if (notCrawlurlSet.isEmpty())
			return null;
		String tmpAUrl;
		tmpAUrl = notCrawlurlSet.get(0);
		notCrawlurlSet.remove(0);
		return tmpAUrl;
	}

	public synchronized void addUrl(String url, int d) {
		notCrawlurlSet.add(url);
		allurlSet.add(url);
		depth.put(url, d);
	}

}


相關推薦

簡單執行爬蟲+Jsoup分析

使用簡單多執行緒和Jsoup分析,得到CSDN的首頁的所有子網頁連線。 執行效果如下圖 --------------------------------------------------------------------------------------------

非結構化資料與結構化資料提取---執行爬蟲案例

多執行緒糗事百科案例 案例要求參考上一個糗事百科單程序案例 Queue(佇列物件) Queue是python中的標準庫,可以直接import Queue引用;佇列是執行緒間最常用的交換資料的形式 python下多執行緒的思考 對於資源,加鎖是個重要的環節。因為python原生的list,dict等,

執行記憶體問題分析之mprotect方法【轉】

轉自:https://blog.csdn.net/agwtpcbox/article/details/53230664 http://www.yebangyu.org/blog/2016/02/01/detectmemoryghostinmultithread/ 多執行緒中的記憶體問題,一直被認為是噩夢般

[.net 執行]ConcurrentBag原始碼分析

ConcurrentBag根據操作執行緒,對不同執行緒分配不同的佇列進行資料操作。這樣,每個佇列只有一個執行緒在操作,不會發生併發問題。其內部實現運用了net4.0新加入的ThreadLocal執行緒本地儲存功能。各個佇列間通過連結串列維護。 其內部結構如下:   1、獲取執行緒本地佇列:

簡單執行示例

#include<Windows.h> #include<iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lpParameter);//定義執行緒入口函式(規定格式) DWORD WINAP

java執行爬蟲框架crawler4j的使用

一開始找jar包找了好久都沒找到,後來花了6個積分把所有的依賴包找到了,現在放在百度雲供大家免費下載: 連結:https://pan.baidu.com/s/12MTMy4d4e6hZsmWAdXbUMQ 提取碼:433g 注意這些依賴包是3.5版本的不是最新版本。 如果想使用最新版本的

百度百科執行爬蟲(Java)

BaiduBaikeSpider 百度百科多執行緒爬蟲Java原始碼,資料儲存採用了Oracle11g 簡介 採用了MyEclipes作為整合開發環境,應該是相容eclips 使用方法 下載此原始碼之後使用 (匯入 或者 import)操作匯入此專案 各個類介紹

Python執行爬蟲學習

此程式碼包含以下學習內容: 程式封裝 網頁獲取與解析 retry裝飾器與thread多執行緒 Anime code # -*- coding: utf-8 -*- import requests import demjson from retry imp

[原創]一款小巧、靈活的Java執行爬蟲框架(AiPa)

1.作品簡介 AiPa 是一款小巧,靈活,擴充套件性高的多執行緒爬蟲框架。 AiPa 依賴當下最簡單的HTML解析器Jsoup。 AiPa 只需要使用者提供網址集合,即可在多執行緒下自動爬取,並對一些異常進行處理。 2.下載安裝 AiPa是一個小巧的、只有390KB的jar包。 下載該Jar包匯入到你的專案中

【go語言 socket程式設計系列】從單執行簡單執行的服務端搭建

簡單單執行緒serverdemo 通過下面程式碼簡單搭建一個服務端,並通過telnet模擬客戶端,演示多客戶端同時請求訪問單執行緒伺服器時的阻塞現象。 package main import ( "fmt" "net" "os" ) func main() {

python執行爬蟲時,主執行一直等待錯誤。

1、抓取網站的專輯資訊時,遇到了加上守護執行緒 ,程式執行完主執行緒,唰的一下就結束了,子執行緒在哪裡?嗯,丟掉了 t.setDaemon(True) #設定守護執行緒 把上邊那句註釋掉後,子執行緒…….emmmmm….. 執行了,然後就一直在等待………………………等一個不知道是

AiPa — 小巧、靈活的 Java 執行爬蟲框架

1.框架簡介 AiPa 是一款小巧,靈活,擴充套件性高的多執行緒爬蟲框架。 AiPa 依賴當下最簡單的HTML解析器Jsoup。 AiPa 只需要使用者提供網址集合,即可在多執行緒下自動爬取,並對一些異常進行處理。 2.下載安裝 AiPa是一個小巧的、只有390KB

Python爬蟲從入門到精通(3): BeautifulSoup用法總結及執行爬蟲爬取糗事百科

本文是Python爬蟲從入門到精通系列的第3篇。我們將總結BeautifulSoup這個解析庫以及常用的find和select方法。我們還會利用requests庫和BeauitfulSoup來爬取糗事百科上的段子, 並對比下單執行緒爬蟲和多執行緒爬蟲的爬取效率。 什麼是

執行:原理分析整理

作業系統的設計,可以歸結為三點: (1)以多程序形式,允許多個任務同時執行; (2)以多執行緒形式,允許單個任務分成不同的部分執行; (3)提供協調機制,一方面防止程序之間和執行緒之間產生衝突,另一方面允許程序之間和執行緒之間共享資源。 多核、多處理器(多CPU)、多執

執行爬蟲案例

Queue(佇列物件) Queue是python中的標準庫,可以直接import Queue引用;佇列是執行緒間最常用的交換資料的形式 python下多執行緒的思考 對於資源,加鎖是個重要的環節。因為python原生的list,dict等,都是not thread sa

python執行爬蟲+批量下載鬥圖啦圖片專案(關注、持續更新)

python多執行緒爬蟲專案() 爬取目標:鬥圖啦(起始url:http://www.doutula.com/photo/list/?page=1) 爬取內容:鬥圖啦全網圖片 使用工具:requests庫實現傳送請求、獲取響應。        xpath實現資料解析、提取和清洗        thr

非同步程式設計學習之路(一)-通過Thread實現簡單執行

自上週主管帶我看過kafka內部實現,使用Feature來做的資料批量傳送之後,自此決定要學好併發程式設計。 因為本人在多執行緒上只能說是一個新手,打算從最底層的Thread一步一步記錄我的學習之路。 通過Thread實現多執行緒的方式有兩種,程式碼如下: 一、多執行緒實現(繼承Thre

python爬蟲入門(四)利用執行爬蟲

#!/usr/bin/env python # -*- coding:utf-8 -*- # 使用了執行緒庫 import threading # 佇列 from Queue import Queue # 解析庫 from lxml import etree # 請求處理 impor

python3執行爬蟲爬取某美女圖片網站的指定頁圖片資源,你懂的

Queue(佇列物件) queue是python3中的標準庫,可以直接import queue引用;佇列是執行緒間最常用的交換資料的形式。 python下多執行緒的思考 對於資源,加鎖是個重要的環節。因為python原生的list,dict等,都是not

python執行爬蟲學習--去除html的標籤

import re import urllib page = urllib.urlopen("http://www.baidu.com") html = page.read() patter