`

利用hpricot抓取baidu的图片

阅读更多
最近忙里抽闲,研究了一下hpricot,感觉真是不错,我用它很轻松地实现了百度图片的批量下载。

如:在百度图片搜索中输入“泰晤士河”,想把查找到的所在大图片都拉到本地电脑上面,还要一个个去点小图片,进入大图显示页面,才能将图片保存起来,真是不方便。

现在我通过hpricot来搞定这个。
目标URL就是我百度图片搜索中输入“泰晤士河”产生的URL:
http://image.baidu.com/i?tn=baiduimage&ct=201326592&cl=2&lm=-1&pv=&word=%CC%A9%CE%EE%CA%BF%BA%D3&z=0
我现在通过hpricot找出查询结果中的所有显示大图的页面链接,然后再在大图中分析URL,找出大图img的src,进而利用open-uri进行文件读写,从而把图片拉下来。

现在在看一下代码吧,看,代码量这么少,Ruby就是方便和人性化。
require 'rubygems'  
require 'hpricot'
require 'open-uri'

#取得查询结果页面的所有指向大图页面的链接(目前取了第一页)
def get_link_list								
	target_url = "http://image.baidu.com/i?tn=baiduimage&word=%CC%A9%CE%EE%CA%BF%BA%D3&z=0&lm=-1&ct=201326592&cl=2"
	doc = open(target_url) { |f| Hpricot(f) }
	link_list = Array.new
	doc.search("div#imgid/dl/dd/div/a").each do |r|
		link_list << "http://image.baidu.com"+r.attributes["href"]
	end	
 	link_list
end

#将大图页面中的大图片下载到本地电脑
def down_load(url)
	doc = open(url) { |f| Hpricot(f) }
	#     /div/table/tbody/tr/td
	doc.search("a[@target='_top']/") do |r|
		file_url = r.attributes["src"]
		puts file_url + "\n"
		file_name = file_url[file_url.rindex("/")+1, file_url.size]
		open(file_url) do |data|
		new_image = File.new(file_name, "w")
		new_image.puts data.read
		new_image.close
		end
	end
end

#将所有的图片都下载到本地电脑中
def down_load_all_images
	get_link_list.each do |url|
		down_load(url)
	end
end

#执行方法
down_load_all_images


初次使用,感觉hpricot解析HTML真是方便,就是那么几下子就搞定了,并且感觉速度不错,以后如果要用到爬虫方面,用这个没错。

另外,感觉使用Ruby写代码,真是舒服啊。
分享到:
评论
12 楼 sevk 2009-07-13  
想不到还可以这样啊,一直不知道有 Hpricot 这东东, 哈哈,学习了。
11 楼 Hooopo 2009-07-01  
不是流氓 写道
http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&pv=&word=img&z=0&rn=21&pn=21&ln=2000

http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&pv=&word=img&z=0&rn=21&pn=42&ln=2000

http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&pv=&word=img&z=0&rn=21&pn=63&ln=2000

LZ可以看看这三个地址标红色的部分,分别对应着“百度图片”搜索结<script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/themes/advanced/langs/zh.js"></script><script type="text/javascript" src="http://www.iteye.com/javascripts/tinymce/plugins/javaeye/langs/zh.js"></script>果的1,2,3页,也就是说URL几乎一样的,差就只是差在pn的值上,而且值是等差数列,相差21!,绿色对应着搜索的关键字~
Google的图片搜索也有同样的方法,不知道怎么实现的,希望有懂的人上来解释一下

抓取已经过时,open api才是王道..
require'google-rest'
include GoogleRest
client = GoogleSearch.new
client.search(:q => "ruby", :hl =>'zh-cn', :type => 'images').each{|image_url| p image_url}


http://hooopo.iteye.com/blog/417328
10 楼 不是流氓 2009-07-01  
http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&pv=&word=img&z=0&rn=21&pn=21&ln=2000

http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&pv=&word=img&z=0&rn=21&pn=42&ln=2000

http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&tn=baiduimage&pv=&word=img&z=0&rn=21&pn=63&ln=2000

LZ可以看看这三个地址标红色的部分,分别对应着“百度图片”搜索结果的1,2,3页,也就是说URL几乎一样的,差就只是差在pn的值上,而且值是等差数列,相差21!,绿色对应着搜索的关键字~
Google的图片搜索也有同样的方法,不知道怎么实现的,希望有懂的人上来解释一下
9 楼 programming 2009-05-04  
下张图片那里要十行咯。10行之内就可以搞定
8 楼 Readonly 2008-10-01  
使用正则表达式的例子:

require 'open-uri'
target_url = "http://image.baidu.com/i?tn=baiduimage&word=%CC%A9%CE%EE%CA%BF%BA%D3&z=0&lm=-1&ct=201326592&cl=2"
open(target_url).read.scan(/<a name='pn\d+' href="(.*?)"/){|link| 
  img_url = open("http://image.baidu.com/#{link}").read[/_top"><img src="(.*?)"/, 1]
  open(img_url[/\/([^\/]*?)$/, 1], "wb").write(open(img_url).read)
}


如果配合Robbin说的wget,硬要在一行里面搞定也可以:
open(target_url).read.scan(/<a name='pn\d+' href="(.*?)"/){|link| `wget #{open("http://image.baidu.com/#{link}").read[/_top"><img src="(.*?)"/, 1]}`}
7 楼 hotman 2008-10-01  
robbin 写道
楼主,你的代码写得太难看了,按照你那个需要,不要10行代码就可以搞定了。你写的实在太不ruby style了,呵呵,还是不打击楼主了。


"10行代码就可以搞定了,结合命令行更少".能给出具体的方法吗?
6 楼 aztack 2008-09-30  
robbin 写道
花花公子 写道
robbin 写道
楼主,你的代码写得太难看了,按照你那个需要,不要10行代码就可以搞定了。你写的实在太不ruby style了,呵呵,还是不打击楼主了。


同意,ruby配合命令行才是王道。


的确,如果用unix shell配合wget这个命令工具,也就一行代码。


高手可否写出这一行代码~~
5 楼 robbin 2008-09-28  
花花公子 写道
robbin 写道
楼主,你的代码写得太难看了,按照你那个需要,不要10行代码就可以搞定了。你写的实在太不ruby style了,呵呵,还是不打击楼主了。


同意,ruby配合命令行才是王道。


的确,如果用unix shell配合wget这个命令工具,也就一行代码。
4 楼 花花公子 2008-09-28  
robbin 写道
楼主,你的代码写得太难看了,按照你那个需要,不要10行代码就可以搞定了。你写的实在太不ruby style了,呵呵,还是不打击楼主了。


同意,ruby配合命令行才是王道。
3 楼 robbin 2008-09-28  
楼主,你的代码写得太难看了,按照你那个需要,不要10行代码就可以搞定了。你写的实在太不ruby style了,呵呵,还是不打击楼主了。

2 楼 feeling3_4 2008-09-28  
也许你不需要用hpricot那么底层的东西,推荐http://mechanize.rubyforge.org/mechanize/,使用的也是hpricot
1 楼 jack_9008 2008-09-28  
听说ruby不错  简洁  想看下
正好这有个例子   看来 RUBY用途不少呢

相关推荐

    Java抓取百度图片

    在本文中,我们将深入探讨如何使用Java编程语言和Spring Boot框架来实现百度图片的抓取与下载功能。首先,我们需要了解几个关键的概念和技术。 **Java** 是一种广泛使用的面向对象的编程语言,它以其跨平台的特性而...

    Python项目案例开发从入门到实战源代码第6章 爬虫应用——抓取百度图片

    在本项目案例中,我们将深入探讨Python编程在爬虫应用中的实际操作,特别是如何利用Python来抓取并下载百度图片。这个案例旨在帮助初学者掌握网络爬虫的基本技术和流程,同时也为进阶开发者提供了一个实战练习的机会...

    从摄像头直接随机抓取图片

    在IT领域,尤其是在图像处理和计算机视觉应用中,从摄像头直接随机抓取图片是一项常见的任务。这个过程涉及到了几个关键的技术点,包括设备驱动、图像采集、随机数生成以及文件处理。下面将详细阐述这些知识点。 1....

    Python3爬虫抓取百度图片中的图片

    Python3爬虫抓取百度图片中的图片,可根据需求输入关键字、图片数量

    从百度图片筛选条件分析百度抓取收录图片哪些信息.docx

    在分析百度图片搜索的检索条件时,我们可以发现,百度提供了多种图片检索条件,这些条件包括图片格式、抓取时间、图片尺寸、颜色分布、动静格式、图片主要展示的内容等等。这些条件使得用户可以更加精准地搜索到所需...

    python 抓取百度云分享数据,百度云最新接口抓取分享链接

    在这个主题中,我们将探讨如何使用Python来抓取百度云分享的数据,特别是利用百度云最新的API接口。这通常涉及到请求、解析HTML或JSON响应、处理验证码以及可能的反爬策略。 首先,要抓取百度云分享的数据,我们...

    python爬虫 抓取百度图片

    python爬虫,抓取百度图片存储到本地文件夹中,可以修改关键字,所需图片的长宽

    抓取MM图片

    【标题】:“抓取MM图片”这一主题涉及的是网络图像数据的采集技术,特别是针对特定类型(例如“MM”,通常指的是美女图片)的图片进行抓取。这在互联网上广泛应用于个人兴趣、数据分析或者网站内容的自动更新。在这...

    抓取网页图片,css和js

    本话题主要关注如何抓取网页上的图片、CSS(层叠样式表)和JavaScript文件,以及处理CSS中内联的图片资源。下面将详细讨论这些知识点。 一、网页抓取基础 网页抓取通常通过网络爬虫实现,这是一种自动遍历互联网并...

    qt写的抓取网页图片并保存到本地

    在这个项目中,"qt写的抓取网页图片并保存到本地",开发者利用QT的网络编程和文件操作功能,实现了一个小型的爬虫程序。这个程序可以解析指定URL的网页内容,从中提取出所有的图片链接,并将这些图片下载保存到本地...

    网站图片抓取工具

    网站图片抓取工具是一种利用编程技术,特别是Python语言,实现从网页中自动提取并下载图片的软件工具。这种工具在数据分析、图像分析、网站备份、社交媒体监控等多种场景中都有广泛应用。接下来,我们将深入探讨该...

    php 抓取百度搜索结果脚本

    php 抓取百度搜索结果脚本,php命令行下运行

    抓取网页图片1.0

    然而,理解其背后的原理和技术,不仅可以帮助我们更好地利用这类工具,也为我们提供了进一步探索网页抓取和自动化数据获取的可能。在日常工作中,结合适当的编程技能和工具,我们可以实现更多定制化的图片抓取需求。

    网页图片抓取/批量保存

    网页图片抓取与批量保存是网络数据采集领域中常见的需求,尤其对于设计师、研究人员或内容创作者来说,高效地获取和管理网页上的图片资源至关重要。在这个过程中,我们可以利用各种工具和技术来实现这一目标,包括...

    一个可以批量抓取网页图片的工具

    本程序可以抓取指定IE窗口中已下载完毕的网页中的全部或部分图片(可根据图片文件后缀和图片所属站点的域名过滤,也可以对单个图片进行选取),对于选中的图片,可以: 1)抓取文件URL列表,可以转换为UBB代码或HTML...

    百度地图抓取软件

    同时,对于抓取的大量数据,应合理存储和利用,避免数据冗余和资源浪费。 总的来说,"百度地图抓取软件"VER4.0是一款面向地图数据获取和管理的工具,它可以帮助用户便捷地获取百度地图的信息,但使用时务必谨慎,...

    这段代码是一个Python爬虫程序,用于从百度图片搜索中抓取指定关键词的图片避开了反爬机制,超时或被屏蔽会自动重试

    这段代码是一个Python爬虫程序,用于从百度图片搜索中抓取指定关键词的图片。程序通过设置超时时间和请求头等参数,实现了对百度图片搜索结果的访问和解析。程序的主要功能包括: 1. 定义了一个名为`Crawler`的类...

    Python自动抓取美女图片

    自动抓取美女图片,python爬虫

    抓取网页图片工具V1.1

    【抓取网页图片工具V1.1】是一款实用的软件,专为用户设计,用于方便地从网页中批量下载并保存图片至个人计算机。这款工具简化了图片收集过程,尤其适用于那些需要大量素材的设计师、摄影师或者网络内容创作者。通过...

Global site tag (gtag.js) - Google Analytics