日期:2014-05-20  浏览次数:20751 次

讨论:java搜索引擎之网络爬虫研究 思想
各位大哥,小弟在这求救了……

首先我说下我自己写的网络爬虫思想:

1.首先,得到一个URL,截取重要字段如:“http://www.163.com” 我截取:“163.com”部分。

2.其次,根据第1个步骤得到的URL,系统分配一个线程给它,然后根据URL去攫取有用的网址,进一步去爬取网络信息。

3.最后,根据攫取的信息,分析内容,截取重要内容保存数据库中。

问题如下:

请问上面的思想有什么问题没有呢?各位大哥,在第2步中,每一个URL都是分配一个线程,然后在一个线程下,又发现新的URL,继续用本线程去爬取,可有会问题?

当线程启动多了,发现如果只是启动一个线程会爬取很多的信息,如果是启动多个线程,发现爬取的信息就少了,请部这个是什么问题呢?

如何解决当前各大网站字符编码的问题?因为当前的各大网站启用的编码不标准,没有通用的,有的使用UTF-8,有的使用GBK2312,等等。如何解决爬行数据乱码问题?

在网站的后台,如何停止正在爬行数据的线程?
下面是图片截图:


------解决方案--------------------
请问上面的思想有什么问题没有呢?各位大哥,在第2步中,每一个URL都是分配一个线程,然后在一个线程下,又发现新的URL,继续用本线程去爬取,可有会问题?
你的cpu会爆掉,可以采用队列的方式处理,发现一个连接 把连接加入队列里面去...然后开固定数目的线程,去队列中取数据...
如何解决当前各大网站字符编码的问题?因为当前的各大网站启用的编码不标准,没有通用的,有的使用UTF-8,有的使用GBK2312,等等。如何解决爬行数据乱码问题?
有一个工具 可以 自动分析页面的编码,我忘记了,是根据页面流来处理的,还可以分析页面上是否有"gbk""utf-8""gb2312"等字样来确认


------解决方案--------------------
使用html-parser几乎最有效的,使用其中的工具类分析<meta>头部信息得到相关编码。然后分析<a>标签包含链接(可能有多个),随后进行递归就可以。具体html-parser使用方法还有有很多技巧:http://htmlparser.sourceforge.net
------解决方案--------------------
我告诉你我的方法,其实最简单的方法是不要采取一个URL一个线程,而是把所有解析出来的URL都放到一个队列里。而固定数量的工作线程就负责从这个队列里不停取URL并下载解析把新的URL再次放进去。


另外涉及到一个线程排重的问题,我用的B-树的数据结构,而berkely db嵌入式数据库也用的这个数据结构,所以我就直接用了他,性能跟自己写的纯粹为排重设计的红黑树或者B-树分毫不差。

当年我做了一个,还有架构图。

主要的关键点:URL队列,排重,线程池。


另外编码问题,我的方式是直接下载下来,如果HTTP头里有编码信息就直接用,如果没有,就先按照任意编码解码,也许里面中文会是乱码,但是<mata encode="gb2312"/>这一类的html里的编码信息是英文和数字,是不会乱码的,你用htmlparser一类的解析器把它解析出来,再重新解码一次就能得到正确的String了
------解决方案--------------------
探讨
各位大哥,小弟在这求救了……

首先我说下我自己写的网络爬虫思想:

1.首先,得到一个URL,截取重要字段如:“http://www.163.com” 我截取:“163.com”部分。

2.其次,根据第1个步骤得到的URL,系统分配一个线程给它,然后根据URL去攫取有用的网址,进一步去爬取网络信息。

3.最后,根据攫取的信息,分析内容,截取重要内容保存数据库中。

问题如……

------解决方案--------------------
请问上面的思想有什么问题没有呢?各位大哥,在第2步中,每一个URL都是分配一个线程,然后在一个线程下,又发现新的URL,继续用本线程去爬取,可有会问题?

[color=#008000]最好用队列或者堆栈来处理,如果见一个分一个线程的话CPU迟早要挂掉,建议用JAVA自带的线程池来处理

当线程启动多了,发现如果只是启动一个线程会爬取很多的信息,如果是启动多个线程,发现爬取的信息就少了,请部这个是什么问题呢?

可能和你写的代码有关系

如何解决当前各大网站字符编码的问题?因为当前的各大网站启用的编码不标准,没有通用的,有的使用UTF-8,有的使用GBK2312,等等。如何解决爬行数据乱码问题?

[color=#008000]与服务器第一次握手后,就可以获取到页面的一些信息就包含有页面的编码信息,

Java code

   HttpURLConnection http;
   ....略...
   http = (HttpURLConnection) url.openConnection();
   ....略...

   String charsets = "GBK";
        
   Map m = http.getHeaderFields();
   String contentType = m.get("Content-Type").toString().toLowerCase();
    if(contentType.indexOf("utf")>-1){
        charsets = "UTF-8";
    }

InputStream httpInputStream = http.getInputStream();
        BufferedReader httpBufferedReader = new BufferedReader(new InputStreamReader(httpInputStream,charsets));

....略...

------解决方案--------------------
........................................然后根据URL去攫取有用的网址,进一步去爬取网络信息。

3.最后,根据攫取的信息,分析内容,截取重要内容...........................................

如何"攫取",用的什么算法,锚文本是如何分析的,模式分类算法有没有?

另外网络拓扑的概念呢?什么样的URL重要,什么样的不重要,链进链出的URL怎么分类统计的.....

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

爬虫....
------解决方案--------------------
首先要理清思路,理清了也简单了。

要有一个任务表来辅助实现队列功能,她记录记下几点内容:

采集的网址(唯一,内容不能重复),状态位(1为已经采集内容,0为没有采集内容,默认为 0)

有了这个小表,以后就简单了,程序只来做两件事情。
第一件事情,就是从表中取一条状态位为 0 记录,然后下载内容到本地,然后把这条网址的状态位标志为1。(如果表为空,你就相当于{http://www.163.com,0})