??網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,在社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁(yè)追逐者),是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動(dòng)索引、模擬程序或者蠕蟲。
創(chuàng)新互聯(lián)是一家專業(yè)提供同德企業(yè)網(wǎng)站建設(shè),專注與成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、H5頁(yè)面制作、小程序制作等業(yè)務(wù)。10年已為同德眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
爬蟲可以爬取ajax信息么?
?網(wǎng)頁(yè)上有一些異步加載的數(shù)據(jù),爬取這些數(shù)據(jù)有兩種方法:使用模擬瀏覽器,或者分析ajax的http請(qǐng)求,自己生成ajax請(qǐng)求的url,獲取返回的數(shù)據(jù)。如果是自己生成ajax請(qǐng)求,使用開(kāi)源爬蟲的意義在哪里?其實(shí)是要用開(kāi)源爬蟲的線程池和URL管理功能(比如斷點(diǎn)爬取)。
?如果我已經(jīng)可以生成我所需要的ajax請(qǐng)求(列表),如何用這些爬蟲來(lái)對(duì)這些請(qǐng)求進(jìn)行爬取?
?爬蟲往往都是設(shè)計(jì)成廣度遍歷或者深度遍歷的模式,去遍歷靜態(tài)或者動(dòng)態(tài)頁(yè)面。爬取ajax信息屬于deep web(深網(wǎng))的范疇,雖然大多數(shù)爬蟲都不直接支持。但是也可以通過(guò)一些方法來(lái)完成。比如WebCollector使用廣度遍歷來(lái)遍歷網(wǎng)站。爬蟲的第一輪爬取就是爬取種子集合(seeds)中的所有url。簡(jiǎn)單來(lái)說(shuō),就是將生成的ajax請(qǐng)求作為種子,放入爬蟲。用爬蟲對(duì)這些種子,進(jìn)行深度為1的廣度遍歷(默認(rèn)就是廣度遍歷)。
爬蟲支持多線程么、爬蟲能用代理么、爬蟲會(huì)爬取重復(fù)數(shù)據(jù)么、爬蟲能爬取JS生成的信息么?
?能不能爬js生成的信息和爬蟲本身沒(méi)有太大關(guān)系。爬蟲主要是負(fù)責(zé)遍歷網(wǎng)站和下載頁(yè)面。爬js生成的信息和網(wǎng)頁(yè)信息抽取模塊有關(guān),往往需要通過(guò)模擬瀏覽器(htmlunit,selenium)來(lái)完成。這些模擬瀏覽器,往往需要耗費(fèi)很多的時(shí)間來(lái)處理一個(gè)頁(yè)面。所以一種策略就是,使用這些爬蟲來(lái)遍歷網(wǎng)站,遇到需要解析的頁(yè)面,就將網(wǎng)頁(yè)的相關(guān)信息提交給模擬瀏覽器,來(lái)完成JS生成信息的抽取。
爬蟲怎么保存網(wǎng)頁(yè)的信息?
?有一些爬蟲,自帶一個(gè)模塊負(fù)責(zé)持久化。比如webmagic,有一個(gè)模塊叫pipeline。通過(guò)簡(jiǎn)單地配置,可以將爬蟲抽取到的信息,持久化到文件、數(shù)據(jù)庫(kù)等。還有一些爬蟲,并沒(méi)有直接給用戶提供數(shù)據(jù)持久化的模塊。比如crawler4j和webcollector。讓用戶自己在網(wǎng)頁(yè)處理模塊中添加提交數(shù)據(jù)庫(kù)的操作。至于使用pipeline這種模塊好不好,就和操作數(shù)據(jù)庫(kù)使用ORM好不好這個(gè)問(wèn)題類似,取決于你的業(yè)務(wù)。
爬蟲怎么爬取要登陸的網(wǎng)站?
?這些開(kāi)源爬蟲都支持在爬取時(shí)指定cookies,模擬登陸主要是靠cookies。至于cookies怎么獲取,不是爬蟲管的事情。你可以手動(dòng)獲取、用http請(qǐng)求模擬登陸或者用模擬瀏覽器自動(dòng)登陸獲取cookie。
爬蟲怎么抽取網(wǎng)頁(yè)的信息?
?開(kāi)源爬蟲一般都會(huì)集成網(wǎng)頁(yè)抽取工具。主要支持兩種規(guī)范:CSS SELECTOR和XPATH。至于哪個(gè)好,這里不評(píng)價(jià)。
明明代碼寫對(duì)了,爬不到數(shù)據(jù),是不是爬蟲有問(wèn)題,換個(gè)爬蟲能解決么?
?如果代碼寫對(duì)了,又爬不到數(shù)據(jù),換其他爬蟲也是一樣爬不到。遇到這種情況,要么是網(wǎng)站把你封了,要么是你爬的數(shù)據(jù)是javascript生成的。爬不到數(shù)據(jù)通過(guò)換爬蟲是不能解決的。
爬蟲速度怎么樣?
?單機(jī)開(kāi)源爬蟲的速度,基本都可以講本機(jī)的網(wǎng)速用到極限。爬蟲的速度慢,往往是因?yàn)橛脩舭丫€程數(shù)開(kāi)少了、網(wǎng)速慢,或者在數(shù)據(jù)持久化時(shí),和數(shù)據(jù)庫(kù)的交互速度慢。而這些東西,往往都是用戶的機(jī)器和二次開(kāi)發(fā)的代碼決定的。
爬蟲被網(wǎng)站封了怎么辦?
?爬蟲被網(wǎng)站封了,一般用多代理(隨機(jī)代理)就可以解決。但是這些開(kāi)源爬蟲一般沒(méi)有直接支持隨機(jī)代理ip的切換。
(1)是否支持分布式:是
(2)可擴(kuò)展性:中。Apache Nutch并不是一個(gè)可擴(kuò)展性很強(qiáng)的爬蟲,它是一個(gè)專門為搜索引擎定制的網(wǎng)絡(luò)爬蟲,雖然Apache Nutch具有一套強(qiáng)大的插件機(jī)制,但通過(guò)定制插件并不能修改爬蟲的遍歷算法、去重算法和爬取流程。
(3)適用性:Apache Nutch是為搜索引擎定制的爬蟲,具有一套適合搜索引擎的URL維護(hù)機(jī)制(包括URL去重、網(wǎng)頁(yè)更新等),但這套機(jī)制并不適合目前大多數(shù)的精抽取業(yè)務(wù)(即結(jié)構(gòu)化數(shù)據(jù)采集)。
(4)上手難易度:難。需要使用者熟悉網(wǎng)絡(luò)爬蟲原理、hadoop開(kāi)發(fā)基礎(chǔ)及l(fā)inux shell,且需要熟悉Apache Ant
(1)可擴(kuò)展性:強(qiáng)
(2)適用性:WebCollector適用于精抽取業(yè)務(wù)。
(3)上手難易度:簡(jiǎn)單
(1)是否支持分布式:否
(2)可擴(kuò)展性:強(qiáng)
(3)適用性:WebMagic適用于精抽取業(yè)務(wù)。
(4)上手難易度:簡(jiǎn)單。
(1) 是否支持分布式:否
(2)可擴(kuò)展性:低。Crawler4j實(shí)際上是一個(gè)單機(jī)版的垂直爬蟲,其遍歷算法是一種類似泛爬的算法,雖然可以添加一些限制,但仍不能滿足目前大部分的精抽取業(yè)務(wù)。另外,Crawler4j并沒(méi)有提供定制http請(qǐng)求的接口,因此Crawler4j并不適用于需要定制http請(qǐng)求的爬取業(yè)務(wù)(例如模擬登陸、多代理切換)。
(3)上手難易度:簡(jiǎn)單
??傳統(tǒng)的網(wǎng)絡(luò)爬蟲傾向于整站下載,目的是將網(wǎng)站內(nèi)容原樣下載到本地,數(shù)據(jù)的最小單元是單個(gè)網(wǎng)頁(yè)或文件。而WebCollector可以通過(guò)設(shè)置爬取策略進(jìn)行定向采集,并可以抽取網(wǎng)頁(yè)中的結(jié)構(gòu)化信息。
??WebCollector是爬蟲框架,HttpClient是Http請(qǐng)求組件,Jsoup是網(wǎng)頁(yè)解析器(內(nèi)置了Http請(qǐng)求功能)。
一些程序員在單線程中通過(guò)迭代或遞歸的方法調(diào)用HttpClient和Jsoup進(jìn)行數(shù)據(jù)采集,這樣雖然也可以完成任務(wù),但存在兩個(gè)較大的問(wèn)題:
(1)單線程速度慢,多線程爬蟲的速度遠(yuǎn)超單線程爬蟲。
(2)需要自己編寫任務(wù)維護(hù)機(jī)制。這套機(jī)制里面包括了URL去重、斷點(diǎn)爬取(即異常中斷處理)等功能。
WebCollector框架自帶了多線程和URL維護(hù),用戶在編寫爬蟲時(shí)無(wú)需考慮線程池、URL去重和斷點(diǎn)爬取的問(wèn)題。
??WebCollector目前有單機(jī)版和Hadoop版(WebCollector-Hadoop),單機(jī)版能夠處理千萬(wàn)級(jí)別的URL,對(duì)于大部分的精數(shù)據(jù)采集任務(wù),這已經(jīng)足夠了。WebCollector-Hadoop能夠處理的量級(jí)高于單機(jī)版,具體數(shù)量取決于集群的規(guī)模。
??WebCollector采用一種粗略的廣度遍歷,但這里的遍歷與網(wǎng)站的拓?fù)錁?shù)結(jié)構(gòu)沒(méi)有任何關(guān)系,用戶不需要在意遍歷的方式。
?網(wǎng)絡(luò)爬蟲會(huì)在訪問(wèn)頁(yè)面時(shí),從頁(yè)面中探索新的URL,繼續(xù)爬取。WebCollector為探索新URL提供了兩種機(jī)制,自動(dòng)解析和手動(dòng)解析。
maven引入依賴
<dependencies> <dependency> <groupId>cn.edu.hfut.dmic.webcollector</groupId> <artifactId>WebCollector</artifactId> <version>2.73-alpha</version> </dependency> </dependencies>
自動(dòng)解析
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;import cn.edu.hfut.dmic.webcollector.model.Page;import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;public class AutoNewsCrawler extends BreadthCrawler { public AutoNewsCrawler(String crawlPath, boolean autoParse) { super(crawlPath, autoParse); this.addSeed("http://news.hfut.edu.cn/list-1-1.html");//種子頁(yè)面,起始頁(yè)面
//正則規(guī)則設(shè)置 尋找符合http://news.hfut.edu.cn/show-xxxxxxhtml的url
this.addRegex("http://news.hfut.edu.cn/show-.*html"); this.addRegex("-.*\\.(jpg|png|gif).*"); //不要爬取包含 #的URL
this.addRegex("-.*#.*");
setThreads(50);//線程數(shù)
getConf().setTopN(100);//設(shè)置每次迭代中爬取數(shù)量的上限
//設(shè)置是否為斷點(diǎn)爬取,如果設(shè)置為false,任務(wù)啟動(dòng)前會(huì)清空歷史數(shù)據(jù)。
//如果設(shè)置為true,會(huì)在已有crawlPath(構(gòu)造函數(shù)的第一個(gè)參數(shù))的基礎(chǔ)上繼
//續(xù)爬取。對(duì)于耗時(shí)較長(zhǎng)的任務(wù),很可能需要中途中斷爬蟲,也有可能遇到
//死機(jī)、斷電等異常情況,使用斷點(diǎn)爬取模式,可以保證爬蟲不受這些因素
//的影響,爬蟲可以在人為中斷、死機(jī)、斷電等情況出現(xiàn)后,繼續(xù)以前的任務(wù)
//進(jìn)行爬取。斷點(diǎn)爬取默認(rèn)為false*/// setResumable(true);
} /*
visit函數(shù)定制訪問(wèn)每個(gè)頁(yè)面時(shí)所需進(jìn)行的操作
*/
@Override
public void visit(Page page, CrawlDatums next) {
String url = page.url(); //如果頁(yè)面地址如何我們要求
if (page.matchUrl("http://news.hfut.edu.cn/show-.*html")) {
String title = page.select("div[id=Article]>h3").first().text();//獲取url標(biāo)題
String content = page.selectText("div#artibody");
System.out.println("URL:\n" + url);//地址
System.out.println("title:\n" + title);//標(biāo)題
System.out.println("content:\n" + content);//內(nèi)容
/*如果你想添加新的爬取任務(wù),可以向next中添加爬取任務(wù),
這就是上文中提到的手動(dòng)解析*/
/*WebCollector會(huì)自動(dòng)去掉重復(fù)的任務(wù)(通過(guò)任務(wù)的key,默認(rèn)是URL),
因此在編寫爬蟲時(shí)不需要考慮去重問(wèn)題,加入重復(fù)的URL不會(huì)導(dǎo)致重復(fù)爬取*/
/*如果autoParse是true(構(gòu)造函數(shù)的第二個(gè)參數(shù)),爬蟲會(huì)自動(dòng)抽取網(wǎng)頁(yè)中符合正則規(guī)則的URL,
作為后續(xù)任務(wù),當(dāng)然,爬蟲會(huì)去掉重復(fù)的URL,不會(huì)爬取歷史中爬取過(guò)的URL。
autoParse為true即開(kāi)啟自動(dòng)解析機(jī)制*/
//next.add("http://xxxxxx.com");
}
} public static void main(String[] args) throws Exception {
AutoNewsCrawler crawler = new AutoNewsCrawler("crawl", true);
crawler.start(4);//啟動(dòng)爬蟲
}
}運(yùn)行接入如下所示:

手動(dòng)解析
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;import cn.edu.hfut.dmic.webcollector.model.Page;import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;public class ManualNewsCrawler extends BreadthCrawler { public ManualNewsCrawler(String crawlPath, boolean autoParse) { super(crawlPath, autoParse); /*add 10 start pages and set their type to "list"
"list" is not a reserved word, you can use other string instead
*/
for(int i = 1; i <= 10; i++) { this.addSeed("http://news.hfut.edu.cn/list-1-" + i + ".html", "list");//種子頁(yè)面,起始頁(yè)面
}
setThreads(50);//線程數(shù)
getConf().setTopN(100);//設(shè)置每次迭代中爬取數(shù)量的上限
//設(shè)置是否為斷點(diǎn)爬取,如果設(shè)置為false,任務(wù)啟動(dòng)前會(huì)清空歷史數(shù)據(jù)。
//如果設(shè)置為true,會(huì)在已有crawlPath(構(gòu)造函數(shù)的第一個(gè)參數(shù))的基礎(chǔ)上繼
//續(xù)爬取。對(duì)于耗時(shí)較長(zhǎng)的任務(wù),很可能需要中途中斷爬蟲,也有可能遇到
//死機(jī)、斷電等異常情況,使用斷點(diǎn)爬取模式,可以保證爬蟲不受這些因素
//的影響,爬蟲可以在人為中斷、死機(jī)、斷電等情況出現(xiàn)后,繼續(xù)以前的任務(wù)
//進(jìn)行爬取。斷點(diǎn)爬取默認(rèn)為false*/// setResumable(true);
} /*
visit函數(shù)定制訪問(wèn)每個(gè)頁(yè)面時(shí)所需進(jìn)行的操作
* */
@Override
public void visit(Page page, CrawlDatums next) {
String url = page.url(); if (page.matchType("list")) {
next.add(page.links("div[class=' col-lg-8 '] li>a")).type("content");
}else if(page.matchType("content")) { /*if type is "content"*/
/*extract title and content of news by css selector*/
String title = page.select("div[id=Article]>h3").first().text();
String content = page.selectText("div#artibody", 0); //read title_prefix and content_length_limit from configuration
title = getConf().getString("title_prefix") + title;
content = content.substring(0, getConf().getInteger("content_length_limit"));
System.out.println("URL:\n" + url);
System.out.println("title:\n" + title);
System.out.println("content:\n" + content);
}
} public static void main(String[] args) throws Exception {
ManualNewsCrawler crawler = new ManualNewsCrawler("crawl", false);
crawler.getConf().setExecuteInterval(5000);
crawler.getConf().set("title_prefix","PREFIX_");
crawler.getConf().set("content_length_limit", 20);
crawler.start(4);//啟動(dòng)爬蟲
}
}運(yùn)行結(jié)果如下圖所示:

文章標(biāo)題:java之網(wǎng)絡(luò)爬蟲介紹
本文路徑:http://www.chinadenli.net/article10/gpcggo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、定制開(kāi)發(fā)、網(wǎng)站維護(hù)、服務(wù)器托管、關(guān)鍵詞優(yōu)化、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容