導航:首頁 > 編程語言 > java好用的爬蟲

java好用的爬蟲

發布時間:2024-01-27 04:15:40

java和python在爬蟲方面的優勢和劣勢是什麼

爬蟲,其實網路爬蟲(Webcrawler)的一種簡寫,爬蟲就是預先制定的規則,自動地抓取萬維網網頁頁面信息的程序或者腳本,它們被廣泛用於互聯網搜索引擎或其他類似網站,可以自動採集所有其能夠訪問到的頁面內容,以獲取或更新這些網站的內容和檢索方式。從功能上來講,爬蟲一般分為數據採集,處理,儲存三個部分。

在爬蟲技術開發方面,爬蟲分為三類爬蟲:

(1)分布式爬蟲:Nutch

(2)JAVA爬蟲:Crawler4j、WebMagic、WebCollector

(3)非JAVA爬蟲:scrapy(基於Python語言開發)

分布式爬蟲一般應用於大量數據兄游賀爬取,用於爬取海量URL的場景。

java爬蟲是發展的最為完善的一種爬蟲。由於java語言的健壯性和整個生態的原因,java爬蟲發展出了一整台爬蟲的機制,不管是類庫、開發、調試,整個過程都是十分規范和簡單的。並且有很多開源項目可以參考和使用羨派,社區非常活躍和完善。能夠適用於很多企業開發應用場景。

Python爬蟲,python可以用30行代碼,完成JAVA50行代碼乾的任務。python寫代碼的確快,但是在調試代碼的階段,python代碼的調試往往會耗費遠遠多於編碼階段省下的時間。使用python開發,要保證程序的正確性和穩定性,就需要寫更多的測試模塊。當然如果爬取規模不大、爬取業務不復雜,使用python這種爬蟲也是蠻不錯的,可以輕松完成爬取任務。

所以,如果提問者需要學習爬蟲,可以先考慮下自己學爬蟲的目的是什麼比較好,根據你的目的去進行磨棚技術選型才是最省力的一種,不過一般作為個人開發者的話,Python還是最實用的。

② java 實現網路爬蟲用哪個爬蟲框架比較好

有些人問,開發網路爬蟲應該選擇Nutch、Crawler4j、WebMagic、scrapy、WebCollector還是其他的?這里按照我的經驗隨便扯淡一下:

上面說的爬蟲,基本可以分3類:

1.分布式爬蟲:Nutch

2.JAVA單機爬蟲:Crawler4j、WebMagic、WebCollector

3. 非JAVA單機爬蟲:scrapy

第一類:分布式爬蟲

爬蟲使用分布式,主要是解決兩個問題:

1)海量URL管理

2)網速

現在比較流行的分布式爬蟲,是Apache的Nutch。但是對於大多數用戶來說,Nutch是這幾類爬蟲里,最不好的選擇,理由如下:

1)Nutch是為搜索引擎設計的爬蟲,大多數用戶是需要一個做精準數據爬取(精抽取)的爬蟲。Nutch運行的一套流程里,有三分之二是為了搜索引擎而設計的。對精抽取沒有太大的意義。也就是說,用Nutch做數據抽取,會浪費很多的時間在不必要的計算上。而且如果你試圖通過對Nutch進行二次開發,來使得它適用於精抽取的業務,基本上就要破壞Nutch的框架,把Nutch改的面目全非,有修改Nutch的能力,真的不如自己重新寫一個分布式爬蟲框架了。

2)Nutch依賴hadoop運行,hadoop本身會消耗很多的時間。如果集群機器數量較少,爬取速度反而不如單機爬蟲快。

3)Nutch雖然有一套插件機制,而且作為亮點宣傳。可以看到一些開源的Nutch插件,提供精抽取的功能。但是開發過Nutch插件的人都知道,Nutch的插件系統有多蹩腳。利用反射的機制來載入和調用插件,使得程序的編寫和調試都變得異常困難,更別說在上面開發一套復雜的精抽取系統了。而且Nutch並沒有為精抽取提供相應的插件掛載點。Nutch的插件有隻有五六個掛載點,而這五六個掛載點都是為了搜索引擎服務的,並沒有為精抽取提供掛載點。大多數Nutch的精抽取插件,都是掛載在「頁面解析」(parser)這個掛載點的,這個掛載點其實是為了解析鏈接(為後續爬取提供URL),以及為搜索引擎提供一些易抽取的網頁信息(網頁的meta信息、text文本)。

4)用Nutch進行爬蟲的二次開發,爬蟲的編寫和調試所需的時間,往往是單機爬蟲所需的十倍時間不止。了解Nutch源碼的學習成本很高,何況是要讓一個團隊的人都讀懂Nutch源碼。調試過程中會出現除程序本身之外的各種問題(hadoop的問題、hbase的問題)。

5)很多人說Nutch2有gora,可以持久化數據到avro文件、hbase、mysql等。很多人其實理解錯了,這里說的持久化數據,是指將URL信息(URL管理所需要的數據)存放到avro、hbase、mysql。並不是你要抽取的結構化數據。其實對大多數人來說,URL信息存在哪裡無所謂。

6)Nutch2的版本目前並不適合開發。官方現在穩定的Nutch版本是nutch2.2.1,但是這個版本綁定了gora-0.3。如果想用hbase配合nutch(大多數人用nutch2就是為了用hbase),只能使用0.90版本左右的hbase,相應的就要將hadoop版本降到hadoop 0.2左右。而且nutch2的官方教程比較有誤導作用,Nutch2的教程有兩個,分別是Nutch1.x和Nutch2.x,這個Nutch2.x上寫的是可以支持到hbase 0.94。但是實際上,這個Nutch2.x的意思是Nutch2.3之前、Nutch2.2.1之後的一個版本,這個版本在官方的SVN中不斷更新。而且非常不穩定(一直在修改)。

所以,如果你不是要做搜索引擎,盡量不要選擇Nutch作為爬蟲。有些團隊就喜歡跟風,非要選擇Nutch來開發精抽取的爬蟲,其實是沖著Nutch的名氣(Nutch作者是Doug Cutting),當然最後的結果往往是項目延期完成。

如果你是要做搜索引擎,Nutch1.x是一個非常好的選擇。Nutch1.x和solr或者es配合,就可以構成一套非常強大的搜索引擎了。如果非要用Nutch2的話,建議等到Nutch2.3發布再看。目前的Nutch2是一個非常不穩定的版本。

③ java爬蟲抓取指定數據

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

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

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

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

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

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

④ java網路爬蟲:抓取全國學校名稱,地區、級別(中小學)等信息怎麼弄

樓主您好,
我抓取過高校的名稱
到招聘網站(智聯什麼的)學校頁面

小學的可能不好找吧(可以到人人網試試)
用jsoup解析到名稱即可(用法和jquery一樣)

⑤ java網路爬蟲

1,網路機器人Java編程指南,淺顯易懂,有點過時,但適合新手
2,自己動手寫網路爬蟲,有點基礎還可以看看,寫的有點亂,很多內容交代不清楚,並且大篇幅代碼抄襲。。。
3,搜索引擎 ——原理、技術與系統,北大天網為案例,很好很強大,有點學術味道
4,Web數據挖掘 Bing Liu,劉兵的書,強烈推薦
5,搜索引擎:信息檢索實踐,很好的書,強烈推薦
還有一些論文,自己去找吧
案例的話,可以研究下Nutch爬蟲部分代碼,寫的很清晰
有了以上這些,應該算是入門了~

⑥ java爬蟲代理如何實現

爬蟲離不開的就是代理伺服器了,如果我們不用http來爬蟲,ip不更改的情況下,是很難進行的內。當我們在使用爬蟲容爬取網站資料,速度快,可以不知疲倦地連續工作。但是由於爬蟲軟體在訪問網站時,行為過於頻繁,遠超人力操作速度,就很容易被網站察覺,而封掉用戶的IP。
所以,使用爬蟲軟體時,為了防止IP被封,或者IP已經被封,還想用自己的IP訪問封了自己IP的網站時,就要用到代理IP了。http能夠對我們的ip地址進行更改,這一操作能夠有效減少了網站的ip限制的影響,對爬蟲是很有幫助的。Ipidea含有240+國家地區的ip,真實住宅網路高度匿名強力保護本地信息。

⑦ 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}

⑧ java爬蟲公司有哪些做的比較好的

知道一個java爬蟲公司,瑞雪採集雲,還是有一些特點的:

瑞雪採集雲是一個PaaS在線開發平台,與圖形配置化爬蟲客戶端工具相比,瑞雪採集雲提供的是通用採集能力,能夠滿足企業客戶數據採集業務的長期需求。

主要特點如下:
(一) 一站式通用能力集成,指數級提高開發效率。平台封裝了豐富的通用功能,開發者不需要關心 Ajax和Cookie等底層細節,只需要利用平台封裝好API,把主要精力放在業務上,工作效率提供10倍。
(二) 開發自由度高,支持復雜網站的採集。支持Java/Python編寫應用插件,藉助高級語言的高自由度能夠處理復雜網站的採集。平台提供業內首個基於Web瀏覽器的在線開發環境,無需安裝任何客戶端,提高應用源代碼在客戶內部的共享。
(三) 分布式任務調度機制,並發採集效率高。把採集工作分解為多個採集工序,一個大任務被拆解為在不同工序上執行的大量小任務,然後被分配到海量爬蟲機集群上被分布式並發執行,確保系統達到最高的採集效率。
(四) 強大的任務管理機制,確保數據完整性。平台擁有強大的任務狀態機制,支持任務重發、支持利用結束碼管理任務的不同結束狀態,根據具體情況選擇不同的後續處理,保證不遺漏目標數據,確保最終目標數據的完整性。
(五) 學習時間短,能夠支撐業務的快速發展。平台提供豐富的在線幫助文檔,開發者能夠在1小時內快速掌握平台的基本使用,當有新的數據採集需求時,新的開發者能夠立即學習開發採集爬蟲程序,快速對應相關業務的發展。
(六) 支持私有化部署,保證數據安全。支持平台所有模塊的私有化部署,讓客戶擁有瑞雪採集雲平台的全部能力,保證客戶開發的應用插件代碼和目標數據的絕對安全。

⑨ java jsoup 爬蟲 怎麼防止重復爬取

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

兩種思路:

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

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

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

閱讀全文

與java好用的爬蟲相關的資料

熱點內容
mdfldf是什麼文件 瀏覽:569
文件在桌面怎麼刪除干凈 瀏覽:439
馬蘭士67cd機版本 瀏覽:542
javaweb爬蟲程序 瀏覽:537
word中千位分隔符 瀏覽:392
迷你編程七天任務的地圖怎麼過 瀏覽:844
word2003格式不對 瀏覽:86
百度雲怎麼編輯文件在哪裡 瀏覽:304
起名app數據哪裡來的 瀏覽:888
微信怎麼去泡妞 瀏覽:52
百度廣告html代碼 瀏覽:244
qq瀏覽器轉換完成後的文件在哪裡 瀏覽:623
jsp中的session 瀏覽:621
壓縮完了文件去哪裡找 瀏覽:380
武裝突襲3浩方聯機版本 瀏覽:674
網路機頂盒移動網路 瀏覽:391
iphone手機百度雲怎麼保存到qq 瀏覽:148
資料庫設計與實踐讀後感 瀏覽:112
js對象是什麼 瀏覽:744
網頁文件存pdf 瀏覽:567

友情鏈接