簡單多執行緒爬蟲+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