java爬蟲,java爬蟲與python爬蟲的區別

本文目錄一覽:

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();

}

}

java爬蟲抓取指定數據

根據java網絡編程相關的內容,使用jdk提供的相關類可以得到url對應網頁的html頁面代碼。

針對得到的html代碼,通過使用正則表達式即可得到我們想要的內容。

比如,我們如果想得到一個網頁上所有包括“java”關鍵字的文本內容,就可以逐行對網頁代碼進行正則表達式的匹配。最後達到去除html標籤和不相關的內容,只得到包括“java”這個關鍵字的內容的效果。

從網頁上爬取圖片的流程和爬取內容的流程基本相同,但是爬取圖片的步驟會多一步。

需要先用img標籤的正則表達式匹配獲取到img標籤,再用src屬性的正則表達式獲取這個img標籤中的src屬性的圖片url,然後再通過緩衝輸入流對象讀取到這個圖片url的圖片信息,配合文件輸出流將讀到的圖片信息寫入到本地即可。

java爬蟲 異步加載數據怎麼解決

給題主兩種思路參考:

1、內置一個瀏覽器內核

內置瀏覽器就是在抓取的程序中,啟動一個瀏覽器內核,使我們獲取到 js 渲染後的頁面,這樣我們就跟採集靜態頁面一樣了。這種工具常用的有以下三種: – Selenium – HtmlUnit – PhantomJs

這些工具都能幫助我們解決數據異步加載的問題,但是他們都存在缺陷,那就是效率不高而且不穩定。

2、反向解析法

什麼是反向解析法呢?我們 js 渲染頁面的數據是通過 Ajax 的方式從後端獲取的,我們只需要找到對應的 Ajax 請求連接就 OK,這樣我們就獲取到了我們需要的數據,反向解析法的好處就是這種方式獲取的數據都是 json 格式的數據,解析起來也比較方便,另一個好處就是相對頁面來說,接口的變化概率更小。同樣它有兩個不足之處,一個是在 Ajax 時你需要有耐心有技巧,因為你需要在一大推請求中找到你想要的,另一個不足的地方就是對 JavaScript 渲染的頁面束手無策。

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。 …展開下面說明知乎爬蟲的源碼和涉及主要技術點:

(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. 一些抓取結果展示收起

java適合寫爬蟲嗎?

JAVA也可以實現爬蟲,比如jsoup包,一個非常方便解析html的工具呢。

不過相對來說,java語言笨重,稍微有些麻煩。

java爬蟲 長時間無返回

可能是代碼異常。

寫代碼總是會出異常的,尤其是爬蟲這類程序,無法確保每次請求都能穩定地返回統一的結果,比如反爬蟲策略提升代理IP超時程序異常等等,處理好這些問題,才能保證爬蟲程序持續地運行下去,反爬蟲策略,超時設置網絡總是不會一如既往的穩定如一,可能代理IP某個時間不穩定,也可能目標服務器某個時間不穩定,還有自身機器的網絡也可能不穩定,如果不設置好超時,程序也不好跑下去。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/197640.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 20:05
下一篇 2024-12-03 20:05

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29

發表回復

登錄後才能評論