1. 程式人生 > >轉:Nutch學習筆記--抓取過程簡析

轉:Nutch學習筆記--抓取過程簡析

筆記中 通過配置抓取地址http://blog.tianya.cn  並執行抓取命令 nohup ./bin/nutch crawl urls -dir data -threads 100 -depth 3 &

進行了抓取。本次筆記主要對抓取的過程進行說明。

首先這裡簡要列下抓取命令常用引數:

引數:

  • -dir dir 指定用於存放抓取檔案的目錄名稱。
  • -threads threads 決定將會在獲取是並行的執行緒數。
  • -depth depth 表明從根網頁開始那應該被抓取的連結深度。
  • -topN N 決定在每一深度將會被取回的網頁的最大數目。

我們之前的抓取命令中:nohup ./bin/nutch crawl urls -dir data -threads 100 -depth 3 &

depth配置為3,也就是限定了抓取深度為3,即告訴Crawler需要執行3次“產生/抓取/更新”就可以抓取完畢了。那麼現在要解釋下兩個問題,一是何謂一次“產生/抓取/更新”,二是每一次過程都做了哪些事情。

下面慢慢來解釋,先檢視日誌

[email protected]:~/data/nutch/release-1.6/runtime/local$ pwd
/home/hu/data/nutch/release-1.6/runtime/local
[email protected]:~/data/nutch/release-1.6/runtime/local$ less nohup.out

………

Injector: starting at 2013-12-08 21:36:58
Injector: crawlDb: data/crawldb
Injector: urlDir: urls
Injector: Converting injected urls to crawl db entries.
Injector: total number of urls rejected by filters: 0
Injector: total number of urls injected after normalization and filtering: 1
Injector: Merging injected urls into crawl db.
Injector: finished at 2013-12-08 21:37:15, elapsed: 00:00:17
Generator: starting at 2013-12-08 21:37:15
Generator: Selecting best-scoring urls due for fetch.
Generator: filtering: true
Generator: normalizing: true
Generator: jobtracker is 'local', generating exactly one partition.
Generator: Partitioning selected urls for politeness.
Generator: segment: data/segments/20131208213723
Generator: finished at 2013-12-08 21:37:30, elapsed: 00:00:15
Fetcher: Your 'http.agent.name' value should be listed first in 'http.robots.agents' property.
Fetcher: starting at 2013-12-08 21:37:30
Fetcher: segment: data/segments/20131208213723
Using queue mode : byHost
Fetcher: threads: 100
Fetcher: time-out divisor: 2
QueueFeeder finished: total 1 records + hit by time limit :0

……………

Fetcher: finished at 2013-12-08 21:37:37, elapsed: 00:00:07
ParseSegment: starting at 2013-12-08 21:37:37
ParseSegment: segment: data/segments/20131208213723
Parsed (14ms):http://blog.tianya.cn/
ParseSegment: finished at 2013-12-08 21:37:45, elapsed: 00:00:07
CrawlDb update: starting at 2013-12-08 21:37:45
CrawlDb update: db: data/crawldb
CrawlDb update: segments: [data/segments/20131208213723]
CrawlDb update: additions allowed: true
CrawlDb update: URL normalizing: true
CrawlDb update: URL filtering: true
CrawlDb update: 404 purging: false
CrawlDb update: Merging segment data into db.
CrawlDb update: finished at 2013-12-08 21:37:58, elapsed: 00:00:13
Generator: starting at 2013-12-08 21:37:58
Generator: Selecting best-scoring urls due for fetch.
Generator: filtering: true
Generator: normalizing: true
Generator: jobtracker is 'local', generating exactly one partition.
Generator: Partitioning selected urls for politeness.
Generator: segment: data/segments/20131208213806
Generator: finished at 2013-12-08 21:38:13, elapsed: 00:00:15
Fetcher: Your 'http.agent.name' value should be listed first in 'http.robots.agents' property.
Fetcher: starting at 2013-12-08 21:38:13
Fetcher: segment: data/segments/20131208213806
Using queue mode : byHost

從上面日誌可以看到,抓取過程先從Injector(注入初始Url,即將文字檔案中的url 存入到crawldb中)開始

抓取過程為:
Injector->
                  Generator->Fetcher->ParseSegment->CrawlDb update  depth=1
                  Generator->Fetcher->ParseSegment->CrawlDb update  depth=2
                  Generator->Fetcher->ParseSegment->CrawlDb update->LinkDb  depth=3
即迴圈Generator->Fetcher->ParseSegment->CrawlDb update 這個過程;
第一次注入url初值,Generator urls,Fetcher網頁,ParseSegment解析資料,update CrawlDb 。之後每次更新crawldb,即url庫。

下圖提供網上找來的相關流程圖片,以便於理解:

總結如下:
1) 建立初始 URL 集
2) 將 URL 集註入 crawldb 資料庫---inject
3) 根據 crawldb 資料庫建立抓取列表---generate
4) 執行抓取,獲取網頁資訊---fetch

5) 解析抓取的內容---parse segment 
6) 更新資料庫,把獲取到的頁面資訊存入資料庫中---updatedb
7) 重複進行 3~5 的步驟,直到預先設定的抓取深度。---這個迴圈過程被稱為“產生/抓取/更新”迴圈
8) 根據 sengments 的內容更新 linkdb 資料庫---invertlinks
9) 建立索引---index

抓取完成之後生成3個目錄(crawldb linkdb segments):

[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/
crawldb  linkdb  segments
[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/crawldb/
current  old
[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/crawldb/current/
part-00000
[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/crawldb/current/part-00000/
data  index

[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/crawldb/current/part-00000/data
./data/crawldb/current/part-00000/data
[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/crawldb/current/part-00000/index
./data/crawldb/current/part-00000/index

Nutch的資料檔案:
crawldb: 爬行資料庫,用來儲存所要爬行的網址。
linkdb: 連結資料庫,用來儲存每個網址的連結地址,包括源地址和連結地址。
segments: 抓取的網址被作為一個單元,而一個segment就是一個單元。

crawldb

crawldb中存放的是url地址,第一次根據所給url  :http://blog.tianya.cn進行注入,然後update crawldb 儲存第一次抓取的url地址,下一次即depth=2的時候就會從crawldb中獲取新的url地址集,進行新一輪的抓取。

crawldb中有兩個資料夾:current 和old.  current就是當前url地址集,old是上一次的一個備份。每一次生成新的,都會把原來的改為old。
current和old結構相同 裡面都有part-00000這樣的一個資料夾(local方式下只有1個) 在part-00000裡面分別有data和index兩個檔案。一個存放資料,一個存放索引。

另外Nutch也提供了對crawldb資料夾狀態檢視命令(readdb):

[email protected]:~/data/nutch/release-1.6/runtime/local$ ./bin/nutch readdb
Usage: CrawlDbReader <crawldb> (-stats | -dump <out_dir> | -topN <nnnn> <out_dir> [<min>] | -url <url>)
    <crawldb>    directory name where crawldb is located
    -stats [-sort]     print overall statistics to System.out
        [-sort]    list status sorted by host
    -dump <out_dir> [-format normal|csv|crawldb]    dump the whole db to a text file in <out_dir>
        [-format csv]    dump in Csv format
        [-format normal]    dump in standard format (default option)
        [-format crawldb]    dump as CrawlDB
        [-regex <expr>]    filter records with expression
        [-status <status>]    filter records by CrawlDatum status
    -url <url>    print information on <url> to System.out
    -topN <nnnn> <out_dir> [<min>]    dump top <nnnn> urls sorted by score to <out_dir>
        [<min>]    skip records with scores below this value.
            This can significantly improve performance.
[email protected]:~/data/nutch/release-1.6/runtime/local$ ./bin/nutch readdb ./data/crawldb -stats
CrawlDb statistics start: ./data/crawldb
Statistics for CrawlDb: ./data/crawldb
TOTAL urls:    2520
retry 0:    2520
min score:    0.0
avg score:    8.8253967E-4
max score:    1.014
status 1 (db_unfetched):    2346
status 2 (db_fetched):    102
status 3 (db_gone):    1
status 4 (db_redir_temp):    67
status 5 (db_redir_perm):    4
CrawlDb statistics: done

說明:
-stats命令是一個快速檢視爬取資訊的很有用的命令:

TOTAL urls:表示當前在crawldb中的url數量。
db_unfetched:連結到已爬取頁面但還沒有被爬取的頁面數(原因是它們沒有通過url過濾器的過濾,或者包括在了TopN之外被Nutch丟棄)
db_gone:表示發生了404錯誤或者其他一些臆測的錯誤,這種狀態阻止了對其以後的爬取工作。
db_fetched:表示已爬取和索引的頁面,如果其值為0,那肯定出錯了。
db_redir_temp和db_redir_perm分別表示臨時重定向和永久重定向的頁面。

min score、avg score、max score是分值演算法的統計值,是網頁重要性的依據,這裡暫且不談。

此外,還可以通過readdb的dump命令將crawldb中內容輸出到檔案中進行檢視:

[email protected]:~/data/nutch/release-1.6/runtime/local$ ./bin/nutch readdb ./data/crawldb -dump crawl_tianya_out
CrawlDb dump: starting
CrawlDb db: ./data/crawldb
CrawlDb dump: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./crawl_tianya_out/
part-00000
[email protected]:~/data/nutch/release-1.6/runtime/local$ less ./crawl_tianya_out/part-00000

http://100w.tianya.cn/  Version: 7
Status: 1 (db_unfetched)
Fetch time: Sun Dec 08 21:42:34 CST 2013
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 1.3559322E-5
Signature: null
Metadata:

http://aimin_001.blog.tianya.cn/        Version: 7
Status: 4 (db_redir_temp)
Fetch time: Tue Jan 07 21:38:13 CST 2014
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 0.016949153
Signature: null
Metadata: Content-Type: text/html_pst_: temp_moved(13), lastModified=0: http://blog.tianya.cn/blogger/blog_main.asp?BlogID=134876

http://alice.tianya.cn/ Version: 7
Status: 1 (db_unfetched)
Fetch time: Sun Dec 08 21:42:34 CST 2013
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 3.3898305E-6
Signature: null
Metadata:

http://anger.blog.tianya.cn/    Version: 7
Status: 4 (db_redir_temp)
Fetch time: Tue Jan 07 21:38:13 CST 2014
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 0.016949153
Signature: null
Metadata: Content-Type: text/html_pst_: temp_moved(13), lastModified=0: http://blog.tianya.cn/blogger/blog_main.asp?BlogID=219280


………………

從上面內容可以看到,裡面儲存了狀態,抓取的時間,修改時間,有效期,分值,指紋,頭資料等詳細關於抓取的內容。

也可以使用url命令檢視某個具體url的資訊:

[email protected]:~/data/nutch/release-1.6/runtime/local$ ./bin/nutch readdb ./data/crawldb -url http://zzbj.tianya.cn/
URL: http://zzbj.tianya.cn/
Version: 7
Status: 1 (db_unfetched)
Fetch time: Sun Dec 08 21:42:34 CST 2013
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 7.6175966E-6
Signature: null
Metadata:

segments

每一個segments都是一組被作為一個單元來獲取的URL。segments是它本身這個目錄以及它下面的子目錄:

  • 一個crawl_generate確定了將要被獲取的一組URL;
  • 一個crawl_fetch包含了獲取的每個URL的狀態;
  • 一個content包含了從每個URL獲取回來的原始的內容;
  • 一個parse_text包含了每個URL解析以後的文字;
  • 一個parse_data包含來自每個URL被解析後內容中的外鏈和元資料;
  • 一個crawl_parse包含了外鏈的URL,用來更新crawldb。

這裡要穿插一下,通過檢視nohup.out最後內容時,發現出現異常問題:


[email protected]:~/data/nutch/release-1.6/runtime/local$ tail -n 50 nohup.out
Parsed (1ms):http://www.tianya.cn/52491364
Parsed (0ms):http://www.tianya.cn/55086751
Parsed (0ms):http://www.tianya.cn/73398397
Parsed (0ms):http://www.tianya.cn/73792451
Parsed (0ms):http://www.tianya.cn/74299859
Parsed (0ms):http://www.tianya.cn/76154565
Parsed (0ms):http://www.tianya.cn/81507846
Parsed (0ms):http://www.tianya.cn/9887577
Parsed (0ms):http://www.tianya.cn/mobile/
Parsed (1ms):http://xinzhi.tianya.cn/
Parsed (0ms):http://yuqing.tianya.cn/
ParseSegment: finished at 2013-12-08 21:42:24, elapsed: 00:00:07
CrawlDb update: starting at 2013-12-08 21:42:24
CrawlDb update: db: data/crawldb
CrawlDb update: segments: [data/segments/20131208213957]
CrawlDb update: additions allowed: true
CrawlDb update: URL normalizing: true
CrawlDb update: URL filtering: true
CrawlDb update: 404 purging: false
CrawlDb update: Merging segment data into db.
CrawlDb update: finished at 2013-12-08 21:42:37, elapsed: 00:00:13
LinkDb: starting at 2013-12-08 21:42:37
LinkDb: linkdb: data/linkdb
LinkDb: URL normalize: true
LinkDb: URL filter: true
LinkDb: internal links will be ignored.
LinkDb: adding segment: file:/home/hu/data/nutch/release-1.6/runtime/local/data/segments/20131208213957
LinkDb: adding segment: file:/home/hu/data/nutch/release-1.6/runtime/local/data/segments/20131208211101
LinkDb: adding segment: file:/home/hu/data/nutch/release-1.6/runtime/local/data/segments/20131208213723
LinkDb: adding segment: file:/home/hu/data/nutch/release-1.6/runtime/local/data/segments/20131208213806
Exception in thread "main" org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/home/hu/data/nutch/release-1.6/runtime/local/data/segments/20131208211101/parse_data
    at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:197)
    at org.apache.hadoop.mapred.SequenceFileInputFormat.listStatus(SequenceFileInputFormat.java:40)
    at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:208)
    at org.apache.hadoop.mapred.JobClient.writeOldSplits(JobClient.java:989)
    at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:981)
    at org.apache.hadoop.mapred.JobClient.access$600(JobClient.java:174)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:897)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:850)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:850)
    at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:824)
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1261)
    at org.apache.nutch.crawl.LinkDb.invert(LinkDb.java:180)
    at org.apache.nutch.crawl.LinkDb.invert(LinkDb.java:151)
    at org.apache.nutch.crawl.Crawl.run(Crawl.java:143)
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
    at org.apache.nutch.crawl.Crawl.main(Crawl.java:55)
[email protected]:~/data/nutch/release-1.6/runtime/local$

如上日誌資訊,出現此問題的原因和上一篇筆記中出現的http.agent.name問題有關,因http.agent.name問題出現異常,但仍然生成了相應的空檔案目錄。 解決方式也很簡單,刪除報錯的資料夾即可。

[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/segments/
20131208211101  20131208213723  20131208213806  20131208213957
[email protected]:~/data/nutch/release-1.6/runtime/local$ rm -rf data/segments/20131208211101
[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/segments/
20131208213723  20131208213806  20131208213957
[email protected]:~/data/nutch/release-1.6/runtime/local$

因為我們執行時的depth是3,一次爬行中每次迴圈都會產生一個segment,所以當前看到的是三個檔案目錄,Segment是有時限的,當這些網頁被Crawler重新抓取後,先前抓取產生的segment就作廢了。在儲存中,Segment資料夾是以產生時間命名的,方便我們刪除作廢的segments以節省儲存空間。我們可以看下每個檔案目錄下有哪些內容:

[email protected]:~/data/nutch/release-1.6/runtime/local$ ls data/segments/20131208213723/
content  crawl_fetch  crawl_generate  crawl_parse  parse_data  parse_text

可以看到,一個segment包括以下子目錄(多是二進位制格式):

content:包含每個抓取頁面的內容

crawl_fetch:包含每個抓取頁面的狀態
crawl_generate:包含所抓取的網址列表
crawl_parse:包含網址的外部連結地址,用於更新crawldb資料庫
parse_data:包含每個頁面的外部連結和元資料
parse_text:包含每個抓取頁面的解析文字

每個檔案的生成時間

1.crawl_generate在Generator的時候生成;
2.content,crawl_fetch在Fetcher的時候生成;
3.crawl_parse,parse_data,parse_text在Parse segment的時候生成。

如何檢視每個檔案的內容呢,如想檢視content中抓取的網頁原始碼內容,這個在本文後面會有介紹。

linkdb

linkdb: 連結資料庫,用來儲存每個網址的連結地址,包括源地址和連結地址。

由於http.agent.name原因,linkdb中內容插入失敗,我重新執行了下爬蟲命令,下面是執行完成後nohup.out中末尾日誌資訊:

。。。。。。

ParseSegment: finished at 2014-01-11 16:30:22, elapsed: 00:00:07
CrawlDb update: starting at 2014-01-11 16:30:22
CrawlDb update: db: data/crawldb
CrawlDb update: segments: [data/segments/20140111162513]
CrawlDb update: additions allowed: true
CrawlDb update: URL normalizing: true
CrawlDb update: URL filtering: true
CrawlDb update: 404 purging: false
CrawlDb update: Merging segment data into db.
CrawlDb update: finished at 2014-01-11 16:30:35, elapsed: 00:00:13
LinkDb: starting at 2014-01-11 16:30:35
LinkDb: linkdb: data/linkdb
LinkDb: URL normalize: true
LinkDb: URL filter: true
LinkDb: internal links will be ignored.
LinkDb: adding segment: file:/home/hu/data/nutch/release-1.6/runtime/local/data/segments/20140111162237
LinkDb: adding segment: file:/home/hu/data/nutch/release-1.6/runtime/local/data/segments/20140111162320
LinkDb: adding segment: file:/home/hu/data/nutch/release-1.6/runtime/local/data/segments/20140111162513
LinkDb: finished at 2014-01-11 16:30:48, elapsed: 00:00:13
crawl finished: data

現在可以檢視linkdb中內容資訊了

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readlinkdb ./data/linkdb -dump crawl_tianya_out_linkdb
LinkDb dump: starting at 2014-01-11 16:39:42
LinkDb dump: db: ./data/linkdb
LinkDb dump: finished at 2014-01-11 16:39:49, elapsed: 00:00:07
[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./crawl_tianya_out_linkdb/
part-00000
[email protected]:~/data/nutch/release-1.6/runtime/local$ head -n 10 ./crawl_tianya_out_linkdb/part-00000
http://100w.tianya.cn/    Inlinks:
fromUrl: http://star.tianya.cn/ anchor: [2012第一美差]
fromUrl: http://star.tianya.cn/ anchor: 2013第一美差

可以看到有的網頁有多個Inlinks,這說明網頁的重要性越大。和分值的確定有直接關係。比如一個網站的首頁就會有很多的Inlinks。

其他資訊檢視:

1.根據需要可以通過命令檢視抓取執行的相關訊息

[email protected]:~/data/nutch/release-1.6/runtime/local$ cat nohup.out | grep elapsed
Injector: finished at 2013-12-08 21:10:53, elapsed: 00:00:14
Generator: finished at 2013-12-08 21:11:08, elapsed: 00:00:15
Injector: finished at 2013-12-08 21:37:15, elapsed: 00:00:17
Generator: finished at 2013-12-08 21:37:30, elapsed: 00:00:15
Fetcher: finished at 2013-12-08 21:37:37, elapsed: 00:00:07
ParseSegment: finished at 2013-12-08 21:37:45, elapsed: 00:00:07
CrawlDb update: finished at 2013-12-08 21:37:58, elapsed: 00:00:13
Generator: finished at 2013-12-08 21:38:13, elapsed: 00:00:15
Fetcher: finished at 2013-12-08 21:39:29, elapsed: 00:01:16
ParseSegment: finished at 2013-12-08 21:39:36, elapsed: 00:00:07
CrawlDb update: finished at 2013-12-08 21:39:49, elapsed: 00:00:13
Generator: finished at 2013-12-08 21:40:04, elapsed: 00:00:15
Fetcher: finished at 2013-12-08 21:42:17, elapsed: 00:02:13
ParseSegment: finished at 2013-12-08 21:42:24, elapsed: 00:00:07
CrawlDb update: finished at 2013-12-08 21:42:37, elapsed: 00:00:13
Injector: finished at 2014-01-11 16:22:29, elapsed: 00:00:14
Generator: finished at 2014-01-11 16:22:45, elapsed: 00:00:15
Fetcher: finished at 2014-01-11 16:22:52, elapsed: 00:00:07
ParseSegment: finished at 2014-01-11 16:22:59, elapsed: 00:00:07
CrawlDb update: finished at 2014-01-11 16:23:12, elapsed: 00:00:13
Generator: finished at 2014-01-11 16:23:27, elapsed: 00:00:15
Fetcher: finished at 2014-01-11 16:24:48, elapsed: 00:01:21
ParseSegment: finished at 2014-01-11 16:24:55, elapsed: 00:00:07
CrawlDb update: finished at 2014-01-11 16:25:05, elapsed: 00:00:10
Generator: finished at 2014-01-11 16:25:20, elapsed: 00:00:15
Fetcher: finished at 2014-01-11 16:30:15, elapsed: 00:04:54
ParseSegment: finished at 2014-01-11 16:30:22, elapsed: 00:00:07
CrawlDb update: finished at 2014-01-11 16:30:35, elapsed: 00:00:13
LinkDb: finished at 2014-01-11 16:30:48, elapsed: 00:00:13

2.檢視segments目錄下content內容,上面我們提到content內容是抓取時網頁的原始碼內容,但因為是二進位制的無法直接檢視,不過nutch提供了相應的檢視方式:

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg
Usage: SegmentReader (-dump ... | -list ... | -get ...) [general options]

* General options:
    -nocontent    ignore content directory
    -nofetch    ignore crawl_fetch directory
    -nogenerate    ignore crawl_generate directory
    -noparse    ignore crawl_parse directory
    -noparsedata    ignore parse_data directory
    -noparsetext    ignore parse_text directory

* SegmentReader -dump <segment_dir> <output> [general options]
  Dumps content of a <segment_dir> as a text file to <output>.

    <segment_dir>    name of the segment directory.
    <output>    name of the (non-existent) output directory.

* SegmentReader -list (<segment_dir1> ... | -dir <segments>) [general options]
  List a synopsis of segments in specified directories, or all segments in
  a directory <segments>, and print it on System.out

    <segment_dir1> ...    list of segment directories to process
    -dir <segments>        directory that contains multiple segments

* SegmentReader -get <segment_dir> <keyValue> [general options]
  Get a specified record from a segment, and print it on System.out.

    <segment_dir>    name of the segment directory.
    <keyValue>    value of the key (url).
        Note: put double-quotes around strings with spaces.

檢視 content:

content包含了從每個URL獲取回來的原始的內容。
[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -dump ./data/segments/20140111162237  ./data/crawl_tianya_seg_content -nofetch -nogenerate -noparse -noparsedata -noparsetext
SegmentReader: dump segment: data/segments/20140111162237
SegmentReader: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ ls ./data/crawl_tianya_seg_content/
dump       .dump.crc 
[email protected]:~/data/nutch/release-1.6/runtime/local$ head -n 50 ./data/crawl_tianya_seg_content/dump

Content::
Version: -1
url: http://blog.tianya.cn/
base: http://blog.tianya.cn/
contentType: text/html
metadata: Date=Sat, 11 Jan 2014 08:22:46 GMT Vary=Accept-Encoding Expires=Thu, 01 Nov 2012 10:00:00 GMT Content-Encoding=gzip nutch.crawl.score=1.0 _fst_=33 nutch.segment.name=20140111162237 Content-Type=text/html; charset=UTF-8 Connection=close Server=nginx Cache-Control=no-cache Pragma=no-cache
Content:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>天涯部落格_有見識的人都在此</title>
<meta name="keywords" content="天涯,部落格,天涯部落格,天涯社群,天涯論壇,意見領袖" />
<meta name="description" content="天涯部落格是天涯社群開辦的獨立部落格平臺,這裡可以表達網民立場,聚集意見領袖,眾多草根精英以他們的觀點影響社會的程序。天涯部落格,有見識的人都在此!" />

<link href="http://static.tianyaui.com/global/ty/TY.css" rel="stylesheet" type="text/css" />
<link href="http://static.tianyaui.com/global/blog/web/static/css/blog_56de4ad.css" rel="stylesheet" type="text/css" />
<link rel="shortcut icon" href="http://static.tianyaui.com/favicon.ico" type="image/vnd.microsoft.icon" />
<script type="text/javascript" charset="utf-8" src="http://static.tianyaui.com/global/ty/TY.js"></script>
<!--[if lt IE 7]>
  <script src="http://static.tianyaui.com/global/ty/util/image/DD_belatedPNG_0.0.8a.js?v=2013101509" type="text/javascript"></script>
<![endif]-->
</head>
<body>
<div id="huebox" >
   
<script type="text/javascript" charset="utf-8">TY.loader("TY.ui.nav",function(){TY.ui.nav.init ({app_str:'blog',topNavWidth: 1000,showBottomNav:false});});</script>

<div id="blogdoc" class="blogdoc blogindex">
    <div id="hd"></div>
    <div id="bd" class="layout-lmr clearfix">
        <div id="left">
           
           
<div class="sub-nav left-mod">
    <ul class="text-list-2">
        <li class="curr"><a class="ico-1" href="http://blog.tianya.cn/">部落格首頁</a></li>
        <li class=""><a href="/blog/society">社會民生</a></li>
        <li class=""><a href="/blog/international">國際觀察</a></li>
        <li class=""><a href="/blog/ent">娛樂</a></li>
        <li class=""><a href="/blog/sports">體育</a></li>
        <li class=""><a href="/blog/culture">文化</a></li>
        <li class=""><a href="/blog/history">歷史</a></li>
        <li class=""><a href="/blog/life">生活</a></li>
        <li class=""><a href="/blog/emotion">情感</a></li>
[email protected]:~/data/nutch/release-1.6/runtime/local$

我們也可以採取同樣的方式檢視其他檔案內容,如crawl_fetch,parse_data等。

檢視crawl_fetch:

crawl_fetch包含了獲取的每個URL的狀態。

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -dump ./data/segments/20140111162237  ./data/crawl_tianya_seg_fetch -nocontent -nogenerate -noparse -noparsedata -noparsetext
SegmentReader: dump segment: data/segments/20140111162237
SegmentReader: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ head -n 50 ./data/crawl_tianya_seg_fetch/dump

CrawlDatum::
Version: 7
Status: 33 (fetch_success)
Fetch time: Sat Jan 11 16:22:46 CST 2014
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 1.0
Signature: null
Metadata: _ngt_: 1389428549880Content-Type: text/html_pst_: success(1), lastModified=0

檢視crawl_generate:

crawl_generate確定了將要被獲取的一組URL。

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -dump ./data/segments/20140111162237  ./data/crawl_tianya_seg_generate -nocontent -nofetch -noparse -noparsedata -noparsetext
SegmentReader: dump segment: data/segments/20140111162237
SegmentReader: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ head -n 50 ./data/crawl_tianya_seg_generate/dump

CrawlDatum::
Version: 7
Status: 1 (db_unfetched)
Fetch time: Sat Jan 11 16:22:15 CST 2014
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 1.0
Signature: null
Metadata: _ngt_: 1389428549880

檢視crawl_parse:

crawl_parse包含了外鏈的URL,用來更新crawldb。

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -dump ./data/segments/20140111162237  ./data/crawl_tianya_seg_parse -nofetch -nogenerate -nocontent –noparsedata –noparsetext
SegmentReader: dump segment: data/segments/20140111162237
SegmentReader: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ head -n 50 ./data/crawl_tianya_seg_parse/dump

CrawlDatum::
Version: 7
Status: 67 (linked)
Fetch time: Sat Jan 11 16:22:55 CST 2014
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 0.016949153
Signature: null
Metadata:

CrawlDatum::
Version: 7
Status: 67 (linked)
Fetch time: Sat Jan 11 16:22:55 CST 2014
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 0.016949153
Signature: null
Metadata:

。。。。

檢視parse_data:

parse_data包含來自每個URL被解析後內容中的外鏈和元資料。

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg –dump ./data/segments/20140111162237  ./data/crawl_tianya_seg_data -nofetch -nogenerate -nocontent -noparse –noparsetext
SegmentReader: dump segment: data/segments/20140111162237
SegmentReader: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ head -n 50 ./data/crawl_tianya_seg_data/dump

。。。。

檢視parse_text:

parse_text包含了每個URL解析以後的文字。

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -dump ./data/segments/20140111162237  ./data/crawl_tianya_seg_text -nofetch -nogenerate -nocontent -noparse -noparsedata
SegmentReader: dump segment: data/segments/20140111162237
SegmentReader: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ head -n 50 ./data/crawl_tianya_seg_text/dump

ParseText::
天涯部落格_有見識的人都在此 部落格首頁 社會民生 國際觀察 娛樂 體育 文化 歷史 生活 情感 財經 股市 美食 旅遊 最新博文 天涯名博 部落格達人 部落格總排行 01 等待溫暖的小狐狸 44887595 02 潘文偉 34654676 03 travelisliving 30676532 04 股市掘金 28472831 05 crystalkitty 26283927 06 yuwenyufen 24880887 07 水莫然 24681174 08 李澤輝 22691445 09 鍾巍巍 19226129 10 別境 17752691 11 微笑的說我很幸 15912882 12 尤宇 15530802 13 sundaes 14961321 14 鄭渝川 14219498 15 黑花黃 13174656 博文排行 01 任志強戳穿“央視十宗罪”都 02 野雲先生:錢眼裡的文化(5 03 是美女博士徵男友還是媒體博 04 黃牛永遠走在時代的最前沿 05 “與女優度春宵”怎成員工年 06 如何看待對張藝謀罰款748萬 07 女保姆酒後色誘我上床被妻撞 08 年過不惑的男人為何對婚姻也 09 明代變態官員囚多名尼姑做性 10 女人不肯承認的20個祕密 社會排行 國際排行 01 風青楊:章子怡“七億陪睡案 02 潘金雲和她的腦癱孩子們。 03 人民大學前校長紀寶成腐敗之 04 小學語文課本配圖錯誤不是小 05 閒聊“北京地鐵要漲價” 06 “高壓”整治火患之後,還該 07 警惕父母誤導孩子的十種不良 08 一代名伶紅線女為什麼如此紅 09 黎明:應明令禁止官員技偵發 10 官二代富二代的好運氣不能獨 01 【環球熱點】如此奢華—看了 02 阿基諾的民,阿基諾的心,阿 03 “中國向菲律賓捐款10萬美元 04 美國法律界:對青少年犯罪的 05 一語中的:諾貝爾獎得主銳評 06 300萬元保證金騙到武漢公司1 07 亂而取之的智慧 08 中國連宣洩憤怒都有人“代表 09 世界啊,請醒醒吧,都被美元 10 反腐利器呼之欲出,貪腐官員 娛樂排行 體育排行 01 2013網路票選新宅男女神榜單 02 從《千金歸來》看中國電視劇 03 汪峰自稱是好爸爸時大家都笑 04 黃聖依稱楊子是靠山打了誰的 05 汪峰連鎖型劣跡被爆遭六六嘲 06 舒淇深V禮服到肚臍令人窒息 07 張柏芝交老外新歡照曝光(圖 08 吳奇隆公開戀情眾網友送祝福 09 獨家:趙本山愛女妞妞練功美 10 “幫汪峰上頭條”背後的注意 01 道歉信和危機公關 02 【環球熱點】鳥人(視訊) 03 曼聯宣佈維迪奇已出院 04 哈登,別讓假摔毀了形象。。。。。。

也可以統一放到一個檔案中去檢視:

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -dump ./data/segments/20140111162237  ./data/segments/20140111162237_dump
SegmentReader: dump segment: data/segments/20140111162237
SegmentReader: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ less ./data/segments/20140111162237_dump/dump

3.通過list,get列出segments一些統計資訊

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -list -dir data/segments
NAME GENERATED FETCHER START FETCHER END FETCHED PARSED
20140111162237 1 2014-01-11T16:22:46 2014-01-11T16:22:46 1 1
20140111162320 57 2014-01-11T16:23:27 2014-01-11T16:24:43 58 19
20140111162513 135 2014-01-11T16:25:21 2014-01-11T16:30:09 140 102

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -list  data/segments/20140111162320/
NAME        GENERATED    FETCHER START        FETCHER END        FETCHED    PARSED
20140111162320    57        2014-01-11T16:23:27    2014-01-11T16:24:43    58    19

[email protected]:~/data/nutch/release-1.6/runtime/local$ bin/nutch readseg -get  data/segments/20140111162513 http://100w.tianya.cn/
SegmentReader: get 'http://100w.tianya.cn/'
Crawl Parse::
Version: 7
Status: 67 (linked)
Fetch time: Sat Jan 11 16:30:18 CST 2014
Modified time: Thu Jan 01 08:00:00 CST 1970
Retries since fetch: 0
Retry interval: 2592000 seconds (30 days)
Score: 1.8224896E-6
Signature: null
Metadata:

4.通過readdb及topN引數命令檢視按分值排序的url

(1).這裡我設定的條件為:前10條,分值大於1

[email protected]:~/data/nutch/release-1.6/runtime/local$ ./bin/nutch readdb ./data/crawldb -topN 10 ./data/crawldb_topN 1
CrawlDb topN: starting (topN=10, min=1.0)
CrawlDb db: ./data/crawldb
CrawlDb topN: collecting topN scores.
CrawlDb topN: done
[email protected]:~/data/nutch/release-1.6/runtime/local$ cat ./data/crawldb_topN/part-00000
1.0140933    http://blog.tianya.cn/
[email protected]:~/data/nutch/release-1.6/runtime/local$

(2).不設分值條件,查詢前10條

---------------------------

nutch抓取過程簡析今天就記錄到這。

相關推薦

Nutch學習筆記--過程

筆記中 通過配置抓取地址http://blog.tianya.cn  並執行抓取命令 nohup ./bin/nutch crawl urls -dir data -threads 100 -depth 3 & 進行了抓取。本次筆記主要對抓取的過程進行說明。

JqueryUI學習筆記-自動完成autocomplete

find 不知道 quest term prevent 修改 combobox itl new <html><head><meta charset="UTF-8"><title>Insert title here</ti

Pyhon網路爬蟲學習筆記本地網頁(一)

如何用Python爬取本地網頁   一、寫出一個簡單的靜態網頁,下面是我隨便寫的一個 網頁原始碼如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT

量化交易學習交易資料自動

     題記:一直對量化交易比較感興趣,想先自學一下,將來如果有機會,能到機構實戰就更棒了。去年用matlab做過一個股票下一交易日價格區間的預測演算法,至少在股災前那段時間準確率還行(別笑,預測區間當然不是在正負10%之間),不過受限於自己的本職工作強度太大(苦逼的

[Nutch]Nutch過程中生成的目錄內容分析

在上一篇博文中有和大家介紹了nutch爬蟲抓取資料的整個過程,爬蟲一般會抓取到很多的內容,那麼這些內容都存放到什麼地方了呢?其實nutch在抓取的過程中會產生很多的目錄,會把抓到的內容分別儲存到不同的目錄之中。那麼,這些目錄的結構的什麼樣的?每個目錄裡面又

【Hibernate學習】 —— 策略(註解方式)

屬性的方法 ould per hql 項目 操作記錄 新建 應用程序 span 當應用程序須要在關聯關系間進行導航的時候。hibernate怎樣獲取關聯對象的策略。 抓取策略的方式: FetchType.LAZY:懶載入。載入一個實體時。定

swift學習筆記(五)構造過程

不能 學習筆記 結構體 rri -a 依據 類的屬性 去掉 trac 構造過程是為了使用某個類、結構體或枚舉類型的實例而進行的準備過程。在構造過程中,對每一個屬性進行了初始值預設和其它必要的準備和初始化工作。 與OC相比,swift的構造函數。不須要返回值。同一時候,在

)Akka學習筆記

http lin post tar class cto iat data- 消息 Akka學習筆記系列文章:  《Akka學習筆記:ACTORS介紹》  《Akka學習筆記:Actor消息傳遞(1)》  《Akka學習筆記:Actor消息傳遞(2)》    《Akka學習筆

】Nodejs學習筆記(一)--- 簡介及安裝Node.js開發環境

ack 目錄 javascrip 難度 時間 網站開發 clas jetbrains 常用 目錄 學習資料 簡介 安裝Node.js npm簡介 開發工具 Sublime Node.js開發環境配置 擴展:安裝多版本管理器 學習資料   1.深入淺出Node.j

將js進行到底node學習筆記2

客戶端 系統 用戶 是個 down 語言 計算 rmi 地址 node重要API之FS——CLI編程初體驗 所謂的“fs”就是file system! 當下幾乎任何一門編程語言都會提供對文件系統讀寫的API,比如c語言的open()函數。 而文件系統讀寫API最廣泛的用處就

將js進行到底node學習筆記5

引用 form all com 錯誤頁面 cnblogs 框架 isp 註意 HTTP開發之Connect工具集——中間件 繼學習node.js的TCP API和HTTP API之後,node.js web開發進入了正軌,但這就好像Java的servlet一樣,我們不可能使

】Python3學習筆記(urllib模塊的使用)

nal 方法 utf 網址 pin des IE tps erer 原文地址:https://www.cnblogs.com/Lands-ljk/p/5447127.html 1.基本方法 urllib.request.urlopen(url, data=None, [ti

】MongoDB學習筆記(查詢)

順序 god ... ive HR 操作 方式 mar obj 原文地址 MongoDB學習筆記(查詢) 基本查詢: 構造查詢數據。 > db.test.findOne() { "_id" : ObjectId("4fd58ecbb9ac507e96276f1a")

】Verilog學習筆記簡單功能實現(八)...............異步FIFO

另一個 gif 多個 可靠 基本原理 drs bar next 不同 基本原理: 1.讀寫指針的工作原理   寫指針:總是指向下一個將要被寫入的單元,復位時,指向第1個單元(編號為0)。   讀指針:總是指向當前要被讀出的數據,復位時,指向第1個單元(編號為0)

Scratchcoding4fun學習筆記1

所有 style 基礎上 基礎 通過 共享 作業 下載 歡迎來到 大家好,歡迎來到xxx的Scratch初級入門課程系列 首先感謝來自臺灣的coding4fun提供開源和共享的課程教案,我們在這基礎上開始我們的版本。 課程簡介 課程文檔下載 第一課 課程說明 開始之前,

MySql 在cmd下的學習筆記 —— 有關儲存過程的操作(procedure)

image eat spa proc idt span case 流程 循環 我們把若幹條sql封裝取來,起個名字------把此過程存儲在數據庫中叫存儲過程 調用procedure 儲存過程是可以變成的,意味著可以使用變量,表達式,控制結構 來完成復雜的功能 聲明

CG-光柵圖形學直線掃描換算法-學習筆記

圖形 點畫 整數 mar bresenham bsp pla 位移 ali 一、直線掃描轉換算法——DDA畫線算法 備註:DDA(Digital Differential Analyzer) ---> 數值微分法 1. 引進圖形學中的一個很重要的思想——增量思想 2.

Git入門學習筆記

1.安裝完成後需要設定一下 git config –global user.name “Your Name” git config –global user.email “[email protected]” 2. 初始化版本庫 git init 加到暫存區與

分散式版本控制系統Git學習筆記

文章目錄 概述 Git是什麼 Git的安裝 建立版本庫 編寫檔案上傳 使用GitHub 概述 身為DBA的我前夕確實對於程式碼比較陌生啊,Git也是很少聽過。

轉載InstallShield學習筆記元件配置

InstallShield學習筆記二:元件配置 這裡主要講的記錄的是配置檔案的細節。 1.Features配置 在 Installshield 中,可以在 Features 新增需要安裝元件大類,這裡需要注意的是: 在InstallSrcipt MSI ,預設DefaultFeatu