现状:在win下的xampp使用php curl搜集一个网站下365个子站的150万多个页面,一万条记录存到mysql大概要花1小时。整个流程下来大概也要7天。总感觉win下面apache+php+mysql等搜集网站,会使用太多资源,感觉速度也太慢,不知道在linux(debian/centos)下使用bash+curl+mysql会不会快一点?即使linux+python+curl+mysql也无所谓,只是想服务器自己搜集。不知道我的想法是否现实。
希望有做过这方面的高手指一下方向。
希望有做过这方面的高手指一下方向。
require 'net/http'
require 'socket'
Thread.abort_on_exception = true
threads = []
line = File.open("links.dat")
IO.foreach("links.dat") {|line|
if %r{http://([^/]+)/([^/]+/+.+)}i =~ line
domain,path = $1, $2
end
web = TCPSocket.new(domain,"http")
web.print "GET /"+path+" HTTP/1.0\n\n"
web.print "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.2) Gecko/20070220 Firefox/2.0.0.2"
answer = web.gets(nil)
web.close
# for mp3
arr = answer.scan(/http:\/\/www.+mp3/)
arr.each do |e|
threads << Thread.new(e){|mp3|
if %r{http://([^/]+)/([^/]+/+.+)/(.+mp3)}i =~ mp3
website,song,name = $1, $2, $3
end
a=Net::HTTP.new(website,80)
song_get = "/"+song+"/"+name
puts "Fetching #{website}#{song_get}"
resp, data = a.get(song_get,nil)
puts "Got #{website}#{song_get}: #{resp.message}"
open(name,'w'){|f| f.write(data)}
}
end
}
threads.each {|aThread| aThread.join}
另外你可以考虑硬件上的升级,比如固态硬盘什么的... 用几个服务器一起工作的事情 等等 ...
/usr/bin/php /var/www/crawl.php即可。
crawl.php也可以写sh调用,再写crontab定时搜集,crawl.php再加判断那些已经写过入的记录不收处理,这样有调度之后,就会自动搜集别人的网站。我想重点还是mysql写入的原因。
对方真够可以的,这么快就响应了。
应该他还不知道我在搜他。
我准备换一台烂电脑,512M内存的debian来搜他,mysql放在内网另一台电脑上。
mysql.ini的配置不能用默认的了,改用my-huge.ini的。
感觉最主要还是mysql写入的速度太慢了。