注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

长风明志的博客

不要也不能做下一个谁,应该且可以做第一个自己

 
 
 

日志

 
 

Nutch介绍与Linux下nutch1.1的安装详解  

2012-04-13 19:43:21|  分类: 搜索引擎 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Nutch主要分为两个部分:爬虫crawler和查询searcherCrawler主要用于从网络上抓取网页并为这些网页建立索引。Searcher主要利用这些索引检索用户的查找关键词来产生查找结果。两者之间的接口是索引,所以除去索引部分,两者之间的耦合度很低。

CrawlerSearcher两部分尽量分开的目的主要是为了使两部分可以分布式配置在硬件平台上,例如将CrawlerSearcher分别放在两个主机上,这样可以提升性能。

 

爬虫,Crawler

Crawler的重点在两个方面,Crawler的工作流程和涉及的数据文件的格式和含义。数据文件主要包括三类,分别是web database,一系列的segment加上index,三者的物理文件分别存储在爬行结果目录下的db目录下webdb(新版本的nutch,如我用的nutch1.1已经将它分为了crawldb、linkdb)子文件夹内,segments文件夹和index文件夹。那么三者分别存储的信息是什么呢?

 

Web database,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,它只在爬虫Crawler工作中使用而和Searcher的工作没有任何关系。WebDB内存储了两种实体的信息:pagelinkPage实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网页的URL网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之间的链接关系。WebDB构成了一个所抓取网页的链接结构图,这个图中Page实体是图的结点,而Link实体则代表图的边 

一次爬行会产生很多个segment,每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索引Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist,然后Fetcher通过fetchlist中的URLs抓取这些网页并索引,然后将其存入segmentSegment是有时限的,当这些网页被Crawler重新抓取后,先前抓取产生的segment就作废了。在存储中。Segment文件夹是以产生时间命名的,方便我们删除作废的segments以节省存储空间。

IndexCrawler抓取的所有网页的索引,它是通过对所有单个segment中的索引进行合并处理所得的。Nutch利用Lucene技术进行索引,所以Lucene中对索引进行操作的接口对Nutch中的index同样有效。但是需要注意的是,Lucene中的segmentNutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。

Crawler工作流程:

在分析了Crawler工作中设计的文件之后,接下来我们研究一下Crawler的抓取流程以及这些文件在抓取中扮演的角色。Crawler的工作原理主要是:首先Crawler根据WebDB生成一个待抓取网页的URL集合叫做Fetchlist,接着下载线程Fetcher开始根据Fetchlist将网页抓取回来,如果下载线程有很多个,那么就生成很多个Fetchlist,也就是一个Fetcher对应一个Fetchlist。然后Crawler根据抓取回来的网页WebDB进行更新,根据更新后的WebDB生成新的Fetchlist,里面是未抓取的或者新发现的URLs,然后下一轮抓取循环重新开始。这个循环过程可以叫做“产生/抓取/更新”循环。

指向同一个主机上Web资源的URLs通常被分配到同一个Fetchlist中,这样的话防止过多的Fetchers对一个主机同时进行抓取造成主机负担过重。另外Nutch遵守Robots Exclusion Protocol,网站可以通过自定义Robots.txt控制Crawler的抓取。

Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的。这些子操作Nutch都提供了子命令行可以单独进行调用。下面就是这些子操作的功能描述以及命令行,命令行在括号中。

1.       创建一个新的WebDb (admin db -create).

2.       将抓取起始URLs写入WebDB (inject).

3.       根据WebDB生成fetchlist并写入相应的segment(generate).

4.       根据fetchlist中的URL抓取网页 (fetch).

5.       根据抓取网页更新WebDb (updatedb).

6.       循环进行35步直至预先设定的抓取深度。

7.       根据WebDB得到的网页评分和links更新segments (updatesegs).

8.       对所抓取的网页进行索引(index).

9.       在索引中丢弃有重复内容的网页和重复的URLs (dedup).

10.   segments中的索引进行合并生成用于检索的最终index(merge).

 

Crawler详细工作流程是:在创建一个WebDB之后(步骤1), “产生/抓取/更新”循环(步骤36)根据一些种子URLs开始启动。当这个循环彻底结束,Crawler根据抓取中生成的segments创建索引(步骤710)。在进行重复URLs清除(步骤9)之前,每个segment的索引都是独立的(步骤8)。最终,各个独立的segment索引被合并为一个最终的索引index(步骤10)。

 

其中有一个细节问题,Dedup操作主要用于清除segment索引中的重复URLs,但是我们知道,在WebDB中是不允许重复的URL存在的,那么为什么这里还要进行清除呢?原因在于抓取的更新。比方说一个月之前你抓取过这些网页,一个月后为了更新进行了重新抓取,那么旧的segment在没有删除之前仍然起作用,这个时候就需要在新旧segment之间进行除重。

另外这些子操作在第一次进行Crawler运行时可能并不用到,它们主要用于接下来的索引更新,增量搜索等操作的实现。这些在以后的文章中我再详细讲。

个性化设置:

Nutch中的所有配置文件都放置在总目录下的conf子文件夹中,最基本的配置文件是conf/nutch-default.xml。这个文件中定义了Nutch的所有必要设置以及一些默认值,它是不可以被修改的。如果你想进行个性化设置,你需要在conf/nutch-site.xml进行设置,它会对默认设置进行屏蔽。

Nutch考虑了其可扩展性,你可以自定义插件plugins来定制自己的服务,一些plugins存放于plugins子文件夹。Nutch的网页解析与索引功能是通过插件形式进行实现的,例如,对HTML文件的解析与索引是通过HTML document parsing plugin, parse-html实现的。所以你完全可以自定义各种解析插件然后对配置文件进行修改,然后你就可以抓取并索引各种类型的文件了。

Nutch通过运行网络爬虫工具进行网络内容的抓取,它提供了爬行企业内部网与爬行整个互联网这两种方式。

● 爬行企业内部网

爬行企业内部网(Intranet Crawling)这种方式适合于针对一小撮Web服务器,并且网页数在百万以内的情况。它使用crawl命令进行网络爬行抓取。在进行爬行前,需要对Nutch进行一系列的配置,过程如下:

首先,需要创建一个目录,并且在此目录中创建包含起始根URLs的文件。我们以爬行搜狐网站(http://www.sohu.com)为例进行讲述。

#cd /usr/local/nutch

#mkdir urls

#touch urls/sohu

因此文件urls/sohu的内容为:http://www.sohu.com/。依据爬行网站的实际情况,可继续在此文件末尾添加其他URL或者在URL目录里添加其他包含URL的文件。需要注意的是,在Nutch0.7的版中不需要创建目录,直接创建包含起始根URL的文件即可。

接下来,要编辑conf/crawl-urlfilter.txt文件,将文中MY.DOMAIN.NAME部分替换为准备爬行的域名,并去掉前面的注释。因此在本文中进行域名替换后的形式为:

+^http://([a-z0-9]*\.)*sohu.com/

文件conf/crawl-urlfilter.txt主要用于限定爬行的URL形式,其中URL的形式使用正则表达式进行描述。

然后,编辑文件conf/nutch-site.xml,并且必须包含以下内容:

< ?xml version="1.0"?>

< ?xml-stylesheet type="text/xsl" href="configuration.xsl"?>


< configuration>

< property>

< name>http.agent.name< /name>

< value>sohu.com< /value>

< description>sohu.com< /description>

< /property>

< /configuration>

除http.agent.name外,在< configuration> < /configuration>间一般还包括http.agent.description、http.agent.url、http.agent.email这三个选项。

最后,开始爬行抓取。完成对Nutch的配置后,运行crawal命令进行爬行。在本文中爬行脚本为:

#bin/nutch crawl urls -dir sohu -depth 5 -topN 1000

其中命令行中各参数项含义分别为:dir指定爬行结果的存放目录,此处dir为sohu;depth指定从根URL起将要爬行的深度,此例depth设定为5;N设定每一层爬行靠前的N个URL,此例N值设定为1000。另外,crawl还有一个参数项:threads,它设定并行爬行的进程数。在爬行过程中,可通过Nutch日志文件查看爬行的进展状态,爬行完成后结果存放在sohu目录里。

● 爬行整个互联网

爬行整个互联网(Whole-web crawling)是一种大规模网络爬行,与第一种爬行方式相对,具有更强的控制性,使用inject、generate、fetch、updatedb等比较低层次的命令,爬行量大,可能需要数台机器数周才能完成。

首先,需要下载一个包含海量URL的文件。下载完成后,将其拷贝到Nutch主目录,并且解压缩文件。

wget http://rdf.dmoz.org/rdf/content.rdf.u8.gz

#cd /usr/local/nutch

#cp /home/zyhua/content.rdf.u8.gz .

#gunzip content.rdf.u8.gz

content.rdf.u8包含了约三百万个URL,在此仅随机抽取五万分之一的URL进行爬行。同第一种方法一样,首先需要建立包含起始根URL的文件及其父目录。

#mkdir urls

#bin/nutch org.apache.nutch.tools.DmozParser content.rdf.u8 -subset 50000 > urls/urllist

采用Nutch的inject命令将这些URL添加crawldb中。这里,目录crawl是爬行数据存储的根目录。

#bin/nutch inject crawl/crawldb urls

然后,编辑文件conf/nutch-site.xml,内容及方法与“爬行企业内部网”类似,此处略过。接着,开始爬行抓取。可以将整个爬行抓取的命令写成一个shell脚本,每次抓取只需执行此脚本即可,即生成→抓取→更新的过程。根据需要可反复运行此脚本进行爬行抓取。脚本范例及相应的说明如下:

#!/bin/sh

bin/nutch generate crawl/crawldb crawl/segments

lastseg=`ls -d crawl/segments/2* | tail -1`

echo $lastseg

bin/nutch fetch $lastseg

bin/nutch updatedb crawl/crawldb $lastseg

#chmod u+x crawl //使其可执行。

#./crawl //运行脚本开始爬行抓取。

最后,进行索引。爬行抓取完后,需要对抓取回来的内容进行索引,以供搜索查询。过程如下:

#bin/nutch invertlinks crawl/linkdb crawl/segments/* //倒置所有链接

#bin/nutch index crawl/indexes crawl/crawldb crawl/linkdb crawl/segments/*

使用Nutch进行数据搜索

Nutch为用户提供了友好的搜索界面,它需要一个servlet容器来提供服务,本文选用了开源的Tomcat容器。首先,将Nutch的war文件部署到Tomcat容器里。

#rm -rf $CATALINA_HOME/webapps/ROOT*

#cp /usr/local/nutch/nutch*.war $CATALINA_HOME/webapps/ROOT.war

启动Tomcat,它会自动解开war文件。

#$CATALINA_HOME/bin/catalina.sh start

修改文件nutch-site.xml,指定Nutch的数据存放目录。增加以下内容到文件nutch-site.xml中。

< configuration>


< name>searcher.dir< /name>

< value>/usr/local/nutch/sohu< /value>

< /property>

< /configuration>

//在第二种爬行方法中的值为/usr/local/nutch/crawl。

修改server.xml,使输入中文进行搜索时不出现乱码现象。将以下内容添加到server.xml文件适当的地方。

URIEncoding=”UTF-8” useBodyEncodingForURI=”true”

配置更改完成后,重启Tomcat服务器。

#$CATALINA_HOME/bin/catalina.sh stop

#$CATALINA_HOME/bin/catalina.sh start

Nutch的运行维护

随着Internet上网页的不断更新,企业网站数量的不断增加,需要定期进行爬行抓取,保证搜索结果的准备性与时效性。因此Nutch的运行与维护主要集中在对已有数据的增添与更新上,具体包括了爬行、索引及数据的合并等操作。主要有以下两种典型情况。

● 重爬行抓取

重爬行抓取的作用主要表现在两个方面,一方面是对已有内容进行更新,另一方面是发现新的内容。Nutch的Wiki网站提供的重爬行的完整脚本,其链接为:

http://wiki.apache.org/nutch/IntranetRecrawl

该链接提供了Nutch.0.7及Nutch0.8两种版本的重爬行脚本。将脚本内容保存为文件/usr/local/nutch/bin/recrawl,便可执行,运行脚本进行重爬行。

#chmod u+x bin/recrawl

#/usr/local/nutch/bin/recrawl servlet_path crawl_dir depth adddays [topN]

//请务必使用recrawl的绝对路径运行此脚本。

recrawl的工作过程包括以下四步:基于“生成→抓取→更新→循环”的数据爬行抓取;segments的合并及无用内容的剔除;重索引及重复内容的剔除;在Tomcat容器中重载应用程序配置。

使用Cron定期进行重爬行抓取,将如下内容添加到文件/etc/crontab末尾重启Cron即可。

00 01 * * 6 root /usr/local/nutch/bin/recrawl

#每周六凌晨01:00进行重爬行抓取。仅供参考。

● 新增URL后的爬行抓取

主要针对第一种爬行方式,用于解决新增URL时的爬行问题。主要包括以下几步:对新增URL的爬行抓取;新数据与已有数据的合并;重载应用程序配置。对新增URL的爬行方式与旧URLs的爬行方式相同。Nutch的Wiki网站同样提供了进行数据合并的脚本代码,链接为:

http://wiki.apache.org/nutch/MergeCrawl

将其保存为文件/usr/local/nutch/bin/mergecrawl,使可执行,进行数据合并。

#chmod u+x bin/mergecrawl

#bin/mergecrawl merge_dir dir1 dir2 ...

修改$CATALINA_HOME/webapps/ROOT/WEB-INF/classes/nutch-site.xml文件中searcher.dir属性的值为新目录名。在Tomcat服务器中重载应用程序配置。

#touch $CATALINA_HOME/webapps/ROOT/WEB-INF/web.xml

 

 

nutch 配置

 

     一、在ubuntu10.04 下,安装JDK 1.7.0

 

   (1)复制 jdk-7-llinux-i586.tar.gz 文件到 /jdk 下,

  

   cd /jdk 目录下,使用解压命令tar -zxvf jdk-7-llinux-i586.tar.gz 进行解压。 若是bin文件则执行命令./jdk-6u13-linux-i586.bin ,解压会看到/jdk下面有一个文件:jdk1.6.0_13

   (2)配置环境变量:

      root身份 vi /etc/environment

在文件environment中加入内容:   

export JAVA_HOME=/jdk/jdk1.7.0
export CLASSPATH=..:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:$JAVA_HOME/bin"
LANGUAGE="zh_CN:zh:en_US:en"
LANG="zh_CN.UTF-8"

保存并关闭

       二、安装Tomcat 

    (1).我用的是apache-tomcat-7.0.4.tar.gz,复制apache-tomcat-7.0.4.tar.gz /tomcat

     解压tar zxvf apache-tomcat-7.0.4.tar.gz

 

      cd  /tomcat/apache-tomcat-7.0.4.tar.gz/conf

 

    (2) 命令vi tomcat-users.xml 

       去掉前面的<!--     ....................- - >

      变为:

<tomcat-users>
<!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary.
-->
<!--
  NOTE:  The sample user and role entries below are wrapped in a comment
  and thus are ignored when reading this file. Do not forget to remove
  <!.. ..> that surrounds them.
-->

  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>

</tomcat-users>

 

     (3) 测试 : http://localhost:8080 

     三、安装Nutch

    (1)

        我用的是apache-nutch-1.1-bin.tar.gz

         解压apache-nutch-1.1-bin.tar.gz到文件夹 /nutch

       cd /nutch

       tar -zxvf  apache-nutch-1.1-bin.tar.gz

/////////////////////////////////以下没试//////////////////

     进入到nutch安装目录apache-nutch-1.1-bin中,

    输入:

  bin/nutch crawl ,出现错误:

    java home is not set

 

   修改: vi /etc/environment

 

 JAVA_HOME="/jdk的安装目录"

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/jdk/jdk1.6.0_13/bin"

LANGUAGE="zh_CN:zh:en_US:en"

LANG="zh_CN.UTF-8"

CLASSPATH=/jdk 的安装目录/lib:/jdk的安装目录/jre/lib

  重启计算机

 /////////////////////////////////以上没试//////////////////

  蜘蛛发挥作用,还需要配置一下。

      首先在Nutch的解压根目录下新建一个文本文件,命名为“weburls.txt”,输入:

http://www.hzau.edu.cn/

http://www.nhqn.com

 

。然后打开conf/crawl-urlfilter.txt”,删除原有内容然后改为:

# skip URLs with slash-delimited segment that repeats 3+ times, to break loops
-.*(/[^/]+)/[^/]+\1/[^/]+\1/

# accept hosts in MY.DOMAIN.NAME
+^http://([a-z0-9]*\.)*hzau.edu.cn/
+^http://([a-z0-9]*\.)*nhqn.com/
# skip everything else
-.

再打开 nutch-site.xml文件,删除原有内容,输入一下内容:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

 

<!-- Put site-specific property overrides in this file. -->

 

<configuration>

<property>

    <name>http.agent.name</name>

    <value>HD nutch agent</value>

</property>

<property>

    <name>http.agent.version</name>

    <value>1.0</value>

</property>

</configuration>

       如果不修改这个文件以添加http.agent.name这个属性,蜘蛛运行时会出现以下的错误:

Fetcher: No agents listed in 'http.agent.name' property.

Exception in thread "main" java.lang.IllegalArgumentException: Fetcher: No agents listed in 'http.agent.name' property.

    at org.apache.nutch.fetcher.Fetcher.checkConfiguration(Fetcher.java:1019)

    at org.apache.nutch.fetcher.Fetcher.fetch(Fetcher.java:942)

    at org.apache.nutch.crawl.Crawl.main(Crawl.java:122)

    3、运行网络蜘蛛抓紧网页。进入目录apache-nutch-1.1-bin中,然后输入以下命令:

         bin/nutch crawl weburls.txt -dir localweb -depth 2 -topN 100 -threads 2

   -dir = localweb  指明下载数据存放路径,该目录不存在时,会被自动创建

   -deptch = 2       下载深度为2

   -topN = 100      下载符合条件的前100个链接url

   -threads = 2       启动的线程数目

     蜘蛛运行时会输出大量数据,抓取结束之后,可以发现localweb目录被生成,里面有几个目录。

   注意:  若是初始抓取的url(即weburls.txt中的url只有一个),此时若抓取后生产localweb目录又重新对这个url抓取,会出现错误

  Generator: 0 records selected for fetching, exiting ...
  Stopping at depth=0 - no more URLs to fetch.
  No URLs to fetch - check your seed list and URL filters.
   crawl finished: data

  这是nutch的一个bug.

    四、Tomcat中部署Nutch项目。

     Nutch根目录apache-nutch-1.1-bin下的nutch-1.1.war文件拷贝到tomcat的目录“/tomcat/apache-tomcat-7.0.4/webapps”,运行后Tomcat便会自动将其解压。此时此目录下会生成文件夹nutch-1.1,

进入目录nutch-1.1/WEB-INF/classes/nutch-site.xml”,加入以下内容:

<configuration>
<property>
    <name>searcher.dir</name>
    <value>/nutch/apache-nutch-1.1-bin/localweb</value>
    <description></description>
</property>
</configuration>

      上面的value要改成第三步蜘蛛的下载目录。

       5、使用Nutch搜索。

      在浏览器中输入“http://localhost:8080/nutch-1.1”,  显示搜索界面:

Nutch介绍与安装详解 - changfengmingzhi - 长风明志的博客

//////////////////////以下内容没有尝试///////////////

结果发现异常了,看不到Nutch的主页面。打开“logs /localhost.xxxx.log”发现服务器提示如下错误:

2009-11-1 12:41:53 org.apache.catalina.core.StandardContext listenerStart

严重: Exception sending context initialized event to listener instance of class org.apache.nutch.searcher.NutchBean$NutchBeanConstructor

java.lang.RuntimeException: java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)

    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:81)

    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1366)

    可以看出这似乎是权限问题导致的,在网上查了查资料,发现一个人给出的解决办法很有效。打开“/etc/tomcat6/policy.d /04webapps.policy”文件,在“grant {...}”加入一句-“permission java.security.AllPermission;”,这样就可以正常显示Nutch的主页面了。

//////////////////////以上内容没有尝试///////////////

解决中文乱码问题:

  

在Nutch的搜索框中输入中文,点击“搜索”按钮之后,可以看到搜索框中的关键字是乱码,搜索结果为空,查看Tomcat下的log文件也会发现query是乱码。

      网上有很多文章都谈到了这个现象,这不是Nutch的问题,而是Tomcat没有对uri做编码造成的。解决的办法很简单:只需在Tomcat的安装目录下找到"conf/server.xml"文件,在"Connector port=”8080″一节添加 URIEncoding="UTF-8" useBodyEncodingForURI="true" 。该小节完整的配置如下:

<Connector port="8080"   maxHttpHeaderSize="8192"
        maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
        enableLookups="false" redirectPort="8443" acceptCount="100"
        connectionTimeout="20000" disableUploadTimeout="true" 
        URIEncoding="UTF-8" useBodyEncodingForURI="true" /> 

//////////////////////以下内容没有尝试///////////////

定时抓取网页地址 

   创建一个脚本:touch autonutch

   编辑这个脚本:vi autonutch

 /nutch/nutch-1.1/bin/nutch crawl /nutch/nutch-1.1/test -dir /nutch/nutch-1.1/test2 -depth 2 -threads 2 -topN 50 >&/nutch/nutch-1.1/logs/logs1.log

/tomcat/apache-tomcat-6.0.26/bin/shutdown.sh

/tomcat/apache-tomcat-6.0.26/bin/startup.sh

 使用cron服务定时抓取网页即可。 

  vi /etc/crontab

  00 02 * * * root /nutch/nutch-1.0/autonutch

注意:每次重新抓取都必须重新启动tomcat服务,所以在脚本中加入:

 /tomcat/apache-tomcat-6.0.26/bin/shutdown.sh

/tomcat/apache-tomcat-6.0.26/bin/startup.sh

//////////////////////以上内容没有尝试///////////////

修改nutch高亮显示颜色

1.修改tomcat6\webapps\nutch目录\zh\search.html
 
.highlight {
    font-weight: bold;
    }
 
中加上color: #FF0033;
2.
如果修改这个不行的话将tomcat6\webapps\nutch目录\include\style.html也加上

此后,高亮显示颜色即变为红色 

修改搜索结果摘要长度:

在tomcat下\tomcat\apache-tomcat-7.0.4\webapps\nutch-1.1\WEB-INF\classes   的 nutch-default.xml文件的

<name>searcher.summary.length</name>

<value>70</value> 

70就是摘要的长度

好吧,累了,先写到这里,以后有什么新内容,再更新~~

 

 

 

  评论这张
 
阅读(1588)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017