使用wget工具抓取网页和图片 成功尝试
2016-01-28 16:28
561 查看
使用wget工具抓取网页和图片
发表于1年前(2014-12-17 11:29) 阅读(2471) | 评论(14) 85人收藏此文章, 我要收藏赞7
wget 网页抓取 图片抓取
目录[-]
奇怪的需求
wget概述
wget尝试
wget正解
奇怪的需求
公司需要将服务器的网页缓存到路由器,用户在访问该网页时就直接取路由器上的缓存即可。虽然我不知道这个需求有什么意义,但还是尽力去实现吧。wget概述
wget是unix和类unix下的一个网页抓取工具,待我熟悉它后,发现它的功能远不止这些。但是这篇博文只说怎么抓取一个指定URL以及它下面的相关内容(包括html,js,css,图片)并将内容里的绝对路径换成相对路径。网上搜到一堆有关wget的文章,关于它怎么抓取网页和相关的图片资源,反正我是没有找到一篇实用的,都以失败告终。这是wget -h > ./help_wget.txt 后的文件内容
?
wget尝试
根据wget的帮助文档,我尝试了下面这条命令?
-r 递归下载所有内容
-np 只下载给定URL下的内容,不下载它的上级内容
-p 下载有关页面需要用到的所有资源,包括图片和css样式
-k 将绝对路径转换为相对路径(这个很重要,为了在用户打开网页的时候,加载的相关资源都在本地寻找)
-nH 禁止wget以接收的URL为名称创建文件夹(如果没有这个,这条命令会将下载的内容存在./download/www.baidu.com/下)
-P 下载到哪个路径,这里是当前文件夹下的download文件夹下,没有的话,wget会帮你自动创建
这些选项都符合目前的这个需求,单结果很意外,并不是我们想象的那么简单,wget并没有给我们想要的东西
你如果执行了这条命令,会发现在当前的download文件夹中只是下载了一个index.html和一个robots.txt,而index.html文件所需要的图片也并没有被下载
<img>标签中的路径也没有被替换成相对路径,可能只是去掉了"http:"这个字符串而已。
至于为什么会这样,请继续往下看。
wget正解
因为上面的命令行不通,所以,脑洞全开。来吧,让我们写一个shell脚本,名称为wget_cc内容如下?
这里多加了几个参数,解释一下:
-e 用法是‘-e command’
用来执行额外的.wgetrc命令。就像vim的配置存在.vimrc文件中一样,wget也用.wgetrc文件来存放它的配置。也就是说在wget执行之前,会先执行.wgetrc文件中的配置命令。一个典型的.wgetrc文件可以参考:
http://www.gnu.org/software/wget/manual/html_node/Sample-Wgetrc.html
http://www.gnu.org/software/wget/manual/html_node/Wgetrc-Commands.html
用户可以在不改写.wgetrc文件的情况下,用-e选项指定额外的配置命令。如果想要制定多个配置命令,-e command1 -e command2 ... -e commandN即可。这些制定的配置命令,会在.wgetrc中所有命令之后执行,因此会覆盖.wgetrc中相同的配置项。
这里robots=off是因为wget默认会根据网站的robots.txt进行操作,如果robots.txt里是User-agent: * Disallow: /的话,wget是做不了镜像或者下载目录的。
这就是前面为什么下载不了图片和其他资源的原因所在了,因为你要爬的HOST禁止蜘蛛去爬它,而wget使用 -e robots=off 这个选项可以通过这个命令绕过这个限制。
-x 创建镜像网站对应的目录结构
-q 静默下载,即不显示下载信息,你如果想知道wget当前在下载什么资源的话,可以去掉这个选项
-m 它会打开镜像相关的选项,比如无限深度的子目录递归下载。
-t times 某个资源下载失败后的重试下载次数
-w seconds 资源请求下载之间的等待时间(减轻服务器的压力)
剩下有不懂的你就去挖文档吧。
写好后保存退出,执行:
?
下面就让脚本执行起来吧!
?
OK,然后再查看<img>标签中的src属性,
src="img/bd_logo1.png"
果然换成了相对路径啊,大功告成,觉得对您有帮助的请点个赞吧!
相关文章推荐
- 【Mapreduce】排序与降序
- MySQL函数
- java运算符
- 四轴项目总结之三--pid
- 第16回 哼,我四岁就看动画!
- 自定义Cell,使其左滑显示删除和分享
- iOS开发笔记--iOS应用架构谈 view层的组织和调用方案
- C++程序Windows移植Linux注意事项
- Oracle更新date型字段基本语句
- 关于使用POWERDESIGNER16从DB2数据库逆向PDM
- Java 获取http请求头内容
- 新手学习数据库(一)用Powerdesigner设计数据库
- 使用Fiddler——模拟Http请求及对android应用抓包
- C++ 类与对象
- NoClassDefFoundError when Espresso Tests are run
- Java设计模式(六)----适配器模式
- android 友盟社会化分享
- JAAS 概念
- PHP正则表达式提取超链接及其标题
- C++ 类 访问限制