導航:首頁 > 編程語言 > java爬蟲例子

java爬蟲例子

發布時間:2024-02-08 09:31:15

A. java jsoup 爬蟲 怎麼防止重復爬取

正好最近在學習這方面的內容。

兩種思路:

  1. 可以將當前爬取的url存在一個list中作登記專,在下一次開屬始爬子鏈接的時候進行比對,如果已經存在在list中則跳過,如果不存在那麼繼續爬

  2. 可以將所有的url網路先遍歷一遍存在list中,然後根據list而不是再次訪問子鏈接url進行爬取,在url存入list的過程中進行查重處理

順便為了方便控制。建議設置爬取深度,在一定深度內進行爬取。

B. Java網路爬蟲怎麼實現

網路爬蟲是一個自動提取網頁的程序,它為搜索引擎從萬維網上下載網頁,是搜索引擎的重要組成。
傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。對於垂直搜索來說,聚焦爬蟲,即有針對性地爬取特定主題網頁的爬蟲,更為適合。

以下是一個使用java實現的簡單爬蟲核心代碼
public void crawl() throws Throwable {
while (continueCrawling()) {
CrawlerUrl url = getNextUrl(); //獲取待爬取隊列中的下一個URL
if (url != null) {
printCrawlInfo();
String content = getContent(url); //獲取URL的文本信息

//聚焦爬蟲只爬取與主題內容相關的網頁,這里採用正則匹配簡單處理
if (isContentRelevant(content, this.regexpSearchPattern)) {
saveContent(url, content); //保存網頁至本地

//獲取網頁內容中的鏈接,並放入待爬取隊列中
Collection urlStrings = extractUrls(content, url);
addUrlsToUrlQueue(url, urlStrings);
} else {
System.out.println(url + " is not relevant ignoring ...");
}

//延時防止被對方屏蔽
Thread.sleep(this.delayBetweenUrls);
}
}
closeOutputStream();
}
private CrawlerUrl getNextUrl() throws Throwable {
CrawlerUrl nextUrl = null;
while ((nextUrl == null) && (!urlQueue.isEmpty())) {
CrawlerUrl crawlerUrl = this.urlQueue.remove();
//doWeHavePermissionToVisit:是否有許可權訪問該URL,友好的爬蟲會根據網站提供的"Robot.txt"中配置的規則進行爬取
//isUrlAlreadyVisited:URL是否訪問過,大型的搜索引擎往往採用BloomFilter進行排重,這里簡單使用HashMap
//isDepthAcceptable:是否達到指定的深度上限。爬蟲一般採取廣度優先的方式。一些網站會構建爬蟲陷阱(自動生成一些無效鏈接使爬蟲陷入死循環),採用深度限制加以避免
if (doWeHavePermissionToVisit(crawlerUrl)
&& (!isUrlAlreadyVisited(crawlerUrl))
&& isDepthAcceptable(crawlerUrl)) {
nextUrl = crawlerUrl;
// System.out.println("Next url to be visited is " + nextUrl);
}
}
return nextUrl;
}
private String getContent(CrawlerUrl url) throws Throwable {
//HttpClient4.1的調用與之前的方式不同
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url.getUrlString());
StringBuffer strBuf = new StringBuffer();
HttpResponse response = client.execute(httpGet);
if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
HttpEntity entity = response.getEntity();
if (entity != null) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(entity.getContent(), "UTF-8"));
String line = null;
if (entity.getContentLength() > 0) {
strBuf = new StringBuffer((int) entity.getContentLength());
while ((line = reader.readLine()) != null) {
strBuf.append(line);
}
}
}
if (entity != null) {
nsumeContent();
}
}
//將url標記為已訪問
markUrlAsVisited(url);
return strBuf.toString();
}
public static boolean isContentRelevant(String content,
Pattern regexpPattern) {
boolean retValue = false;
if (content != null) {
//是否符合正則表達式的條件
Matcher m = regexpPattern.matcher(content.toLowerCase());
retValue = m.find();
}
return retValue;
}
public List extractUrls(String text, CrawlerUrl crawlerUrl) {
Map urlMap = new HashMap();
extractHttpUrls(urlMap, text);
extractRelativeUrls(urlMap, text, crawlerUrl);
return new ArrayList(urlMap.keySet());
}
private void extractHttpUrls(Map urlMap, String text) {
Matcher m = (text);
while (m.find()) {
String url = m.group();
String[] terms = url.split("a href=\"");
for (String term : terms) {
// System.out.println("Term = " + term);
if (term.startsWith("http")) {
int index = term.indexOf("\"");
if (index > 0) {
term = term.substring(0, index);
}
urlMap.put(term, term);
System.out.println("Hyperlink: " + term);
}
}
}
}
private void extractRelativeUrls(Map urlMap, String text,
CrawlerUrl crawlerUrl) {
Matcher m = relativeRegexp.matcher(text);
URL textURL = crawlerUrl.getURL();
String host = textURL.getHost();
while (m.find()) {
String url = m.group();
String[] terms = url.split("a href=\"");
for (String term : terms) {
if (term.startsWith("/")) {
int index = term.indexOf("\"");
if (index > 0) {
term = term.substring(0, index);
}
String s = //" + host + term;
urlMap.put(s, s);
System.out.println("Relative url: " + s);
}
}
}

}
public static void main(String[] args) {
try {
String url = "";
Queue urlQueue = new LinkedList();
String regexp = "java";
urlQueue.add(new CrawlerUrl(url, 0));
NaiveCrawler crawler = new NaiveCrawler(urlQueue, 100, 5, 1000L,
regexp);
// boolean allowCrawl = crawler.areWeAllowedToVisit(url);
// System.out.println("Allowed to crawl: " + url + " " +
// allowCrawl);
crawler.crawl();
} catch (Throwable t) {
System.out.println(t.toString());
t.printStackTrace();
}
}

C. 用java寫爬蟲程序,有個網站獲取不到鏈接,求指導

//讀取網頁上的內容方法---------------------2010.01.25 public String getOneHtml(String htmlurl) throws IOException {
URL url;
String temp;
final StringBuffer sb = new StringBuffer();
try {
url = new URL(htmlurl);
// 讀取網頁全部內容
final BufferedReader in = new BufferedReader(new InputStreamReader(
url.openStream(),"GBK"));
while ((temp = in.readLine()) != null) {
sb.append(temp);
}
in.close();
} catch (final MalformedURLException me) {
System.out.println("你輸入的URL格式有問題!請仔細輸入");
me.getMessage();

} catch (final IOException e) {
e.printStackTrace();

}
return sb.toString();
}上面這個方法是根據你傳入的url爬取整個網頁的內容,然後你寫個正則表達式去匹配這個字元串的內容。

D. 如何用JAVA寫一個知乎爬蟲

下面說明知乎爬蟲的源碼和涉及主要技術點:
(1)程序package組織

(2)模擬登錄(爬蟲主要技術點1)
要爬去需要登錄的網站數據,模擬登錄是必要可少的一步,而且往往是難點。知乎爬蟲的模擬登錄可以做一個很好的案例。要實現一個網站的模擬登錄,需要兩大步驟是:(1)對登錄的請求過程進行分析,找到登錄的關鍵請求和步驟,分析工具可以有IE自帶(快捷鍵F12)、Fiddler、HttpWatcher;(2)編寫代碼模擬登錄的過程。

(3)網頁下載(爬蟲主要技術點2)
模擬登錄後,便可下載目標網頁html了。知乎爬蟲基於HttpClient寫了一個網路連接線程池,並且封裝了常用的get和post兩種網頁下載的方法。

(4)自動獲取網頁編碼(爬蟲主要技術點3)
自動獲取網頁編碼是確保下載網頁html不出現亂碼的前提。知乎爬蟲中提供方法可以解決絕大部分亂碼下載網頁亂碼問題。

(5)網頁解析和提取(爬蟲主要技術點4)
使用Java寫爬蟲,常見的網頁解析和提取方法有兩種:利用開源Jar包Jsoup和正則。一般來說,Jsoup就可以解決問題,極少出現Jsoup不能解析和提取的情況。Jsoup強大功能,使得解析和提取異常簡單。知乎爬蟲採用的就是Jsoup。

(6)正則匹配與提取(爬蟲主要技術點5)
雖然知乎爬蟲採用Jsoup來進行網頁解析,但是仍然封裝了正則匹配與提取數據的方法,因為正則還可以做其他的事情,如在知乎爬蟲中使用正則來進行url地址的過濾和判斷。

(7)數據去重(爬蟲主要技術點6)
對於爬蟲,根據場景不同,可以有不同的去重方案。(1)少量數據,比如幾萬或者十幾萬條的情況,使用Map或Set便可;(2)中量數據,比如幾百萬或者上千萬,使用BloomFilter(著名的布隆過濾器)可以解決;(3)大量數據,上億或者幾十億,Redis可以解決。知乎爬蟲給出了BloomFilter的實現,但是採用的Redis進行去重。

(8)設計模式等Java高級編程實踐
除了以上爬蟲主要的技術點之外,知乎爬蟲的實現還涉及多種設計模式,主要有鏈模式、單例模式、組合模式等,同時還使用了Java反射。除了學習爬蟲技術,這對學習設計模式和Java反射機制也是一個不錯的案例。
4. 一些抓取結果展示

E. java爬蟲讀取某一張指定圖片的url,求解答

使用jsoup解析到這個url就行,dom結構如下:

F. java爬蟲抓取指定數據

如何通過Java代碼實現對網頁數據進行指定抓取,我總結了有以下幾個步驟中會使用到Jsoup.Jar包:

1、在工程中導入Jsoup.jar包

2、獲取網址url指定HTML或者文檔指定的body

3、獲取網頁中超鏈接的標題和鏈接

4、獲取指定博客文章的內容

5、獲取網頁中超鏈接的標題和鏈接的結果

G. Java多線程爬蟲實現

一、需求



1.定時抓取固定網站新聞標題、內容、發表時間和來源。


2.程序需要支持分布式、多線程



二、設計


1.網站是固定,但是未來也可能添加新的網站去抓取,每個網站內容節點設計都不一樣,這樣就需要支持動態可配置來新增網站以方便未來的擴展,這樣就需要每次都需要開發介入。


2.網站html節點的結構可能發生變化,所以也要支持提取節點可配置。


3.怎樣支持分布式?暫時最簡單的想法就是:多機器部署程序,還有新搞一台或者部署程序其中一台製作一個定時任務,定時開啟每台機器應該抓取哪個網站,暫時不能支持同一個網站同時可以支持被多台機器同時抓取,這樣會比較麻煩,要用到分布式隊列。所以暫時一個網站同時只會被單台機器抓取。


4.多線程,怎樣多線程?多線程抓取我這邊有兩個實現:


(1)一個線程抓取一個網站,維護一罩拿個自己的url隊列做廣度抓取,同時抓取多個網站。如圖:



(2)多個線程同時抓取不同的網站。如圖:




以上兩飢悶做張辦法其實各有優點,也給有缺點,看我們怎麼取捨了。


方法1:每個線程創建一個自己的隊列,圖中的queue可以不用concurrentQueue,優點:不涉及到控制並發,每個網站一個線程抓取一個網站,抓取完畢即自動回收銷毀線程。控制方便。缺點:線程數不可以擴展,例如當只有3個網站,你最多隻能開3個線程來抓取,不能開更多,有一定的局限性。


方法2:N個線程同時抓取N個網站,線程數和網站數目不掛鉤,優點:線程數可以調整並且和和抓取網站數量無關。3個網站我們可以開4個5個或者10個這個可以根據您的硬體資源進行調整。缺點:需要控制並發,並且要控制什麼時候銷毀線程(thread1空閑,並且queue為空不代表任務可以結束,可能thread2結果還沒返回),當被抓取的網站響應較慢時,會拖慢整個爬蟲進度。



三、實現


抓取方式最終還是選擇了方法二,因為線程數可配置!


使用技術:


jfinal用了之後才發現這東西不適合,但是由於項目進度問題,還是使用了。


maven項目管理


jettyserver


mysql


eclipse開發


項目需要重點攻破的難點:


(1)合理的控制N個線程正常的抓取網站,並且當所有爛衡線程工作都完成了並且需要抓取的隊列為空時,N個線程同時退出銷毀。


(2)不同網站設計節點不一樣,需要通過配置解決各個網站需要抓取的URL和抓取節點內容在html節點的位置。


(3)個性化內容處理,由於html結構設計問題,北大青鳥認為抓取的內容可能有些多餘的html標簽,或者多餘的內容該怎麼處理。


H. 使用java語言爬取自己的淘寶訂單看看買了哪些東西

Java爬蟲框架WebMagic簡介及使用

一、介紹

webmagic的是一個無須配置、便於二次開發的爬蟲框架,它提供簡單靈活的API,只需少量代碼即可實現一個爬蟲。webmagic採用完全模塊化的設計,功能覆蓋整個爬蟲的生命周期(鏈接提取、頁面下載、內容抽取、持久化),支持多線程抓取,分布式抓取,並支持自動重試、自定義UA/cookie等功能。




二、概覽

WebMagic項目代碼分為核心和擴展兩部分。核心部分(webmagic-core)是一個精簡的、模塊化的爬蟲實現,而擴展部分則包括一些便利的、實用性的功能(例如註解模式編寫爬蟲等)。
WebMagic的結構分為Downloader、PageProcessor、Scheler、Pipeline四大組件,並由Spider將它們彼此組織起來。這四大組件對應爬蟲生命周期中的下載、處理、管理和持久化等功能。而Spider則將這幾個組件組織起來,讓它們可以互相交互,流程化的執行,可以認為Spider是一個大的容器,它也是WebMagic邏輯的核心。

2.1 WebMagic的四個組件

I. Java網路爬蟲怎麼實現

網路爬蟲是一個自動提取網頁的程序,它為搜索引擎從萬維網上下載網頁,是搜索引擎的重要組成。x0dx0a傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統的一定停止條件。對於垂直搜索來說,聚焦爬蟲,即有針對性地爬取特定主題網頁的爬蟲,更為適合。x0dx0ax0dx0a以下是一個使用java實現的簡單爬蟲核心代碼:x0dx0apublic void crawl() throws Throwable { x0dx0a while (continueCrawling()) { x0dx0a CrawlerUrl url = getNextUrl(); //獲取待爬取隊列中的下一個URL x0dx0a if (url != null) { x0dx0a printCrawlInfo(); x0dx0a String content = getContent(url); //獲取URL的文本信息 x0dx0a x0dx0a //聚焦爬蟲只爬取與主題內容相關的網頁,這里採用正則匹配簡單處理 x0dx0a if (isContentRelevant(content, this.regexpSearchPattern)) { x0dx0a saveContent(url, content); //保存網頁至本地 x0dx0a x0dx0a //獲取網頁內容中的鏈接,並放入待爬取隊列中 x0dx0a Collection urlStrings = extractUrls(content, url); x0dx0a addUrlsToUrlQueue(url, urlStrings); x0dx0a } else { x0dx0a System.out.println(url + " is not relevant ignoring ..."); x0dx0a } x0dx0a x0dx0a //延時防止被對方屏蔽 x0dx0a Thread.sleep(this.delayBetweenUrls); x0dx0a } x0dx0a } x0dx0a closeOutputStream(); x0dx0a}x0dx0aprivate CrawlerUrl getNextUrl() throws Throwable { x0dx0a CrawlerUrl nextUrl = null; x0dx0a while ((nextUrl == null) && (!urlQueue.isEmpty())) { x0dx0a CrawlerUrl crawlerUrl = this.urlQueue.remove(); x0dx0a //doWeHavePermissionToVisit:是否有許可權訪問該URL,友好的爬蟲會根據網站提供的"Robot.txt"中配置的規則進行爬取 x0dx0a //isUrlAlreadyVisited:URL是否訪問過,大型的搜索引擎往往採用BloomFilter進行排重,這里簡單使用HashMap x0dx0a //isDepthAcceptable:是否達到指定的深度上限。爬蟲一般採取廣度優先的方式。一些網站會構建爬蟲陷阱(自動生成一些無效鏈接使爬蟲陷入死循環),採用深度限制加以避免 x0dx0a if (doWeHavePermissionToVisit(crawlerUrl) x0dx0a && (!isUrlAlreadyVisited(crawlerUrl)) x0dx0a && isDepthAcceptable(crawlerUrl)) { x0dx0a nextUrl = crawlerUrl; x0dx0a // System.out.println("Next url to be visited is " + nextUrl); x0dx0a } x0dx0a } x0dx0a return nextUrl; x0dx0a}x0dx0aprivate String getContent(CrawlerUrl url) throws Throwable { x0dx0a //HttpClient4.1的調用與之前的方式不同 x0dx0a HttpClient client = new DefaultHttpClient(); x0dx0a HttpGet httpGet = new HttpGet(url.getUrlString()); x0dx0a StringBuffer strBuf = new StringBuffer(); x0dx0a HttpResponse response = client.execute(httpGet); x0dx0a if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { x0dx0a HttpEntity entity = response.getEntity(); x0dx0a if (entity != null) { x0dx0a BufferedReader reader = new BufferedReader( x0dx0a new InputStreamReader(entity.getContent(), "UTF-8")); x0dx0a String line = null; x0dx0a if (entity.getContentLength() > 0) { x0dx0a strBuf = new StringBuffer((int) entity.getContentLength()); x0dx0a while ((line = reader.readLine()) != null) { x0dx0a strBuf.append(line); x0dx0a } x0dx0a } x0dx0a } x0dx0a if (entity != null) { x0dx0a nsumeContent(); x0dx0a } x0dx0a } x0dx0a //將url標記為已訪問 x0dx0a markUrlAsVisited(url); x0dx0a return strBuf.toString(); x0dx0a}x0dx0apublic static boolean isContentRelevant(String content, x0dx0aPattern regexpPattern) { x0dx0a boolean retValue = false; x0dx0a if (content != null) { x0dx0a //是否符合正則表達式的條件 x0dx0a Matcher m = regexpPattern.matcher(content.toLowerCase()); x0dx0a retValue = m.find(); x0dx0a } x0dx0a return retValue; x0dx0a}x0dx0apublic List extractUrls(String text, CrawlerUrl crawlerUrl) { x0dx0a Map urlMap = new HashMap(); x0dx0a extractHttpUrls(urlMap, text); x0dx0a extractRelativeUrls(urlMap, text, crawlerUrl); x0dx0a return new ArrayList(urlMap.keySet()); x0dx0a} x0dx0aprivate void extractHttpUrls(Map urlMap, String text) { x0dx0a Matcher m = (text); x0dx0a while (m.find()) { x0dx0a String url = m.group(); x0dx0a String[] terms = url.split("a href=\""); x0dx0a for (String term : terms) { x0dx0a // System.out.println("Term = " + term); x0dx0a if (term.startsWith("http")) { x0dx0a int index = term.indexOf("\""); x0dx0a if (index > 0) { x0dx0a term = term.substring(0, index); x0dx0a } x0dx0a urlMap.put(term, term); x0dx0a System.out.println("Hyperlink: " + term); x0dx0a } x0dx0a } x0dx0a } x0dx0a} x0dx0aprivate void extractRelativeUrls(Map urlMap, String text, x0dx0a CrawlerUrl crawlerUrl) { x0dx0a Matcher m = relativeRegexp.matcher(text); x0dx0a URL textURL = crawlerUrl.getURL(); x0dx0a String host = textURL.getHost(); x0dx0a while (m.find()) { x0dx0a String url = m.group(); x0dx0a String[] terms = url.split("a href=\""); x0dx0a for (String term : terms) { x0dx0a if (term.startsWith("/")) { x0dx0a int index = term.indexOf("\""); x0dx0a if (index > 0) { x0dx0a term = term.substring(0, index); x0dx0a } x0dx0a String s = //" + host + term; x0dx0a urlMap.put(s, s); x0dx0a System.out.println("Relative url: " + s); x0dx0a } x0dx0a } x0dx0a } x0dx0a x0dx0a}x0dx0apublic static void main(String[] args) { x0dx0a try { x0dx0a String url = ""; x0dx0a Queue urlQueue = new LinkedList(); x0dx0a String regexp = "java"; x0dx0a urlQueue.add(new CrawlerUrl(url, 0)); x0dx0a NaiveCrawler crawler = new NaiveCrawler(urlQueue, 100, 5, 1000L, x0dx0a regexp); x0dx0a // boolean allowCrawl = crawler.areWeAllowedToVisit(url); x0dx0a // System.out.println("Allowed to crawl: " + url + " " + x0dx0a // allowCrawl); x0dx0a crawler.crawl(); x0dx0a } catch (Throwable t) { x0dx0a System.out.println(t.toString()); x0dx0a t.printStackTrace(); x0dx0a } x0dx0a}

J. 如何用java爬蟲爬取招聘信息

debug?側邊雙擊兩下,出現藍色小點,反鍵運行下面有一個,debug運行模式。

閱讀全文

與java爬蟲例子相關的資料

熱點內容
加密狗檢測工具下載 瀏覽:889
智慧燈app怎麼使用 瀏覽:617
tcl手機升級程序 瀏覽:188
跳出了icloud密碼重置 瀏覽:110
哪裡能查信用卡數據 瀏覽:191
結婚請柬哪個app靠譜 瀏覽:932
qq無法閱讀pdf文件 瀏覽:284
ai導出pdf文件有輪廓線 瀏覽:819
刷機時數據線插台式電腦哪裡 瀏覽:432
手機qq怎樣隱身登陸 瀏覽:339
cdelete導致程序崩潰 瀏覽:783
小米4手機設置鈴聲在哪個文件夾里 瀏覽:184
linuxnet論壇源碼下載 瀏覽:241
手機修改文件後綴名 瀏覽:32
jsvideofullscreen 瀏覽:120
夢幻模擬戰1修改代碼 瀏覽:928
cad有nc編程功能嗎怎麼用 瀏覽:573
js調用外部js 瀏覽:273
蘋果手機照片後期軟體 瀏覽:333
linux自動備份oracle資料庫 瀏覽:447

友情鏈接