讨论:java搜索引擎之网络爬虫研究 思想

uastation 2010-12-20 12:38:52
加精
各位大哥,小弟在这求救了……

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

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

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

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

问题如下:

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

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

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

在网站的后台,如何停止正在爬行数据的线程?
下面是图片截图:
...全文
2939 108 打赏 收藏 转发到动态 举报
写回复
用AI写文章
108 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanxiewei 2011-06-09
  • 打赏
  • 举报
回复
这个好好学习
uastation 2011-03-07
  • 打赏
  • 举报
回复
今天对这贴子做一个总结:

大家的回答,都很有创意,也很实用;在这里,我谢谢大家了;

到目前为止,自己觉得自己写代码实现网络爬虫这个想法,是正确的,只是运行的时候在线程这一块会速度慢下来,所以,经过长时间的学习与实践,个人还是比较推荐使用用Nutch搜索引擎的网络爬虫,网页解析可使用htmlparser工具;如果有兴趣的兄弟,可以上网学习下,试试自己动手写搜索引擎是多么酷的一件事情;谢谢~
安卓机器人 2011-02-12
  • 打赏
  • 举报
回复
mark下,感觉有点看不懂额
涅槃 2011-01-18
  • 打赏
  • 举报
回复
靠,这个就是爬虫啊,抓取别的网站内容
wensefu 2011-01-10
  • 打赏
  • 举报
回复
一直想找时间做个这方面的东西出来,不过工作太忙,唉
0轰隆隆0 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 96 楼 hpjianhua 的回复:]

再向大家请教一个问题:

关闭正在爬行的线程如何做到呢?当有批量线程在运行的时候……
[/Quote]

对于这个问题,你需要掌握以下知识:

1,多线程的处理
2,线程间通讯的问题
3,线程的同步和异步处理
4,线程池的处理(可选)

掌握了以上几点知识点,你的这个问题就迎面而解了~

silence1214 2011-01-10
  • 打赏
  • 举报
回复
不要这么搞兄弟,你的思路不错,线程也可以这么用,但是用起来会有问题的,因为你多一个url就开一个线程最终机器会死掉的,你好好理下思路,就是个生产者和消费者问题,一个是发现url的生产者一个是读取url内容的消费者,具体怎么协助,自己看着办吧。我目前也在搞这些 呵呵,思路理清楚就好了,字符编码的实现有办法的。。都是小case
hushengwei1986 2010-12-29
  • 打赏
  • 举报
回复
对于你这样无限制的开线程,我不太赞同,你的cpu扛不住的,用一个监控线程去管理,控制开启线程的数量。
对于字符编码问题,你可以通过的到返回html,从头部拿到起字符编码,当然不是所有的都可以拿到。
想做爬虫,你可以看看httpclient,这个很好用的
leepeter2008 2010-12-29
  • 打赏
  • 举报
回复
太高深了,学习啦
uastation 2010-12-27
  • 打赏
  • 举报
回复
再向大家请教一个问题:

关闭正在爬行的线程如何做到呢?当有批量线程在运行的时候……
telnetor 2010-12-25
  • 打赏
  • 举报
回复

这个在网页中没有显式的给出编码信息时候可以试一试。

[Quote=引用 89 楼 telnetor 的回复:]

另外,检测编码可以用一个工具:icu4j。这里有使用方法:http://blog.csdn.net/telnetor/archive/2010/02/06/5555349.aspx
[/Quote]
telnetor 2010-12-25
  • 打赏
  • 举报
回复
另外,检测编码可以用一个工具:icu4j。这里有使用方法:http://blog.csdn.net/telnetor/archive/2010/02/06/5555349.aspx
buzhidaoyayaya 2010-12-25
  • 打赏
  • 举报
回复
nulixuexi
yodlove 2010-12-25
  • 打赏
  • 举报
回复
网页的深度需要考虑,而且爬过的链接需记录,要不会进入一个死循环,
编码问题可以分析<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
这个可以用htmlparser来解决
ishuca 2010-12-25
  • 打赏
  • 举报
回复
个人建议,楼主可以尝试尝试分布式。当然具体的任务分配机制是需要事先考虑好的。不然可能效率会更低。线程池也是不错的选择。如果觉得用系统的不好,你可以先了解java本身的线程机制,然后自己手工写一个效率更高的。
lq19880488 2010-12-24
  • 打赏
  • 举报
回复
我觉得楼主为每一个url都开一个线程有点浪费。你可以先开好60个线程作为slave,用于抓取网页,解析url,然后开设一个线程作为master,用于管理和分配url。这种模式也可以用于分布式的爬虫。
telnetor 2010-12-24
  • 打赏
  • 举报
回复
楼主,爬虫采集数据的时候应该分深度优先、广度优先。
还有对于一个站点,采集的深度也是一个值得考虑的因子。它关系到采集量。深度太大,数据量过多,对广度有影响(相同时间内覆盖的站点数)。深度太小,站点的数据可能采集不全。好像有研究说一半是5层还是7层。


有本入门书:《走进搜索引擎》可以看一下。
xuehan_1010 2010-12-24
  • 打赏
  • 举报
回复
将所有URL放在队列中?需要考虑内存够不够的问题。需要视情况进行内外存数据的互换。
编码问题可以用cpdetector。。(名字差不多吧)这个包,但用了它效率肯定不好。建议自己分析,没必要每个网页都分析正确无误,大部分正确就可以了。
用不用线程池无关紧要。开固定数目的线程死循环抓取,不比线程池效率差,还可以省掉管理线程池的开销。
注意线程间的数据同步。
设计一个URL过滤器,可以实现许多实用的功能。
BerkeyDB数据库不错.但如果你要抓取的URL在亿级以上的话,还是有效率问题。
html-parser这东东就不必用了。非要用的话,可以自己把里面的关键部分拿出来,自己写个处理类。
可以考虑异步IO的方式去获取数据,(JAVA-NIO),可能会有一点效率的提升,但需要你学会用。(新的HttpClient里面似乎有这功能)。

结束爬行?结束线程就可以了 。怎么结束线程就不是爬虫的问题,是java的问题了。
请注意使用volatile关键字。
平庸老鱼 2010-12-24
  • 打赏
  • 举报
回复
建议你看这本书,当年我就是看的这本书,网络机器人Java编程指南,虽然本身书写得不是太好,但刚好很符合这个题目。
wsyangdayong 2010-12-24
  • 打赏
  • 举报
回复
我也刚开始研究这东东,有一本书《自己动手写网络爬虫》还行,我还在看。
加载更多回复(47)

62,636

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧