好的,
我正在写无处不在的爬虫,遇到了一些问题~在Ruby成为一个不折不扣的傻瓜并不奇怪。
我使用Nokogiri获取页面的html-找到我感兴趣的所有链接,然后下载与这些链接相关的文件。到目前为止一切都很好。
然而,我似乎无法从单一的方法中获得所需的信息。
若我使用file = open(Src).read
,那个么file包含文件的内容——这对于保存到数据库和哈希来说非常好。但它并不能让我轻松访问(据我所知(文件名、大小、文件类型等属性。
为了获得这些信息,我正在使用机械化,如下所示:
agent = Mechanize.new
fop = agent.get(Src)
使用headagent.head方法,我可以获得内容类型、上次修改日期和内容长度。fop.filename
当然会给我文件名。现在使用agent.head(Src)["content-type"]
的方法是,我认为重新下载信息,所以对于内容类型、上次修改和内容长度调用,它是下载头3次。我想说的是完全浪费,因为文件已经包含了完整的文件,fop应该在不打电话给主管的情况下为我提供所有其他需要的信息。
那么有没有更好的方法(从拇指指甲下载器(
thumbs.each do |thumb|
imgSrc = thumb.css('.t_img').first['src']
file = open(imgSrc).read
agent = Mechanize.new
fop = agent.get(imgSrc)
p fop
puts "1 Driver : prowl.rb"
puts "1 Source : " + pageURL
puts "1 Title : " + thumb.css('.t_img').first['alt']
puts "1 File Source : " + imgSrc
puts "1 File Type : " + agent.head(imgSrc)["content-type"].to_s
puts "1 File Name : " + fop.filename
puts "1 Last Modified : " + agent.head(imgSrc)["last-modified"].to_s
puts "1 Image Size : " + agent.head(imgSrc)["content-length"].to_s
puts "1 MD5 : " + GetMD5(*[file.to_s])
puts "1 SHA256 : " + GetSha256(*[file.to_s])
end
所以问题是:
- 我如何优化我的爬网程序,以便以最少的请求数量获得我想要的所有信息?并且
agent = Mechanize.new
thumbs.each do |thumb|
imgUrl = thumb.css('.t_img').first['src']
imgTitle = thumb.css('.t_img').first['alt']
image = agent.get(imgSrc)
p image
puts "1 Driver : prowl.rb"
puts "1 Source : " + pageURL
puts "1 Title : " + imgTitle
puts "1 File Source : " + imgUrl
puts "1 File Type : " + image.header['content-type']
puts "1 File Name : " + image.filename
puts "1 Last Modified : " + image.header["last-modified"]
puts "1 Image Size : " + image.header["content-length"]
puts "1 MD5 : " + GetMD5(*[image.content.to_s])
puts "1 SHA256 : " + GetSha256(*[image.content.to_s])
end
就是这样。重用代理,没有必要每次都创建一个新的代理。
直接从机械化获取页面,无需打开和阅读,然后传递内容。您要查找的所有标题信息都在页面的header
属性中。