网络爬虫学习笔记(二)

一个简单网络爬虫的实现

——抓取网易新闻

这次来指定一个信息量稍大一点的抓取目标——网易新闻(国内新闻) http://news.163.com/domestic/

这次要达到的目标:

1. 提取有用文本信息

2. 将新闻中所包含的图片信息保存在本地

3. 构建新的HTML文件,其中只包含有新闻主体内容与对应的图片信息

首先当然是通过Jsoup与给定的种子URL建立连接,获得网易新闻(国内新闻)首页的Document,并且在其中筛选出链接,这在上一篇已经提过;然而,我们发现这里得到的许多URL并不是我们想要的新闻内容,而是一些广告的链接,处理办法很简单,我们在这里所要做的仅仅是一个简单的字符串匹配问题,只保留下我们需要的那部分链接即可。

得到了需要的链接之后,依旧是按照之前的方法去访问那个URL,获取它所对应页面的Document,接下来就是在这个页面中来提取出有用的信息(新闻文本内容)了:

这是得到的新闻页面的HTML:

我们通过对新闻页面的HTML分析得知,所有的新闻文本内容都是在id为"endText"这个层中,对应的我们的代码该如何来进行筛选呢?

  1. Element endText = doc.getElementById("endText");

这样便得到了id为"endText"的一个Element节点,这个节点中也存在一些方法可以供我们来提取相应的信息,例如:

  1. String Text = endText.text();  //获取endText中的文本内容
  2. String HTML = endText.html();  //获取endText对应的HTML内容

这样一来就达成了第一个目标,提取出了有效地文字信息。

当我们将获取到页面的HTML文件保存在本地,通过浏览器打开时发现可以查看图片啊、视频等信息,可是当断开网络后就发现这些信息无法查看了,那是因为在网页的HTML中对于图片的那个标签中写有一个URL,这个URL对应的就是这个图片的地址,每当我们打开网页时,就会从对应的这个URL中加载图片展现在页面上,当没有了网络连接他无法从对应的URL中加载图片自然就没有办法显示了,现在我们要做的就是讲这个URL对应的图片保存在本地。

试想,同样是URL,我们是否可以通过抓取网页那样的方法去对待图片呢? 不妨试试看

很显然,是不可以的,从报错情况中可以看到是因为类型不对的缘故,也就是图片信息不能通过这样的方法来获取,那该怎么办呢?

以下是百度百科中对URL的定义

即,每一个互联网上的资源都对应有一个URL,也就是只要有这个URL就可以访问到对应的信息,Java中有一个URL类,它提供了许多对URL的处理方法,我注意到这样一个方法:

这个方法返回了一个从对应URL读入的字节流数据,也就是说图片信息可以通过这种方法以字节流的形式返回回来,我们只需要在本地对该字节流进行保存即可,还想着Java的i/o包中提供的很麻烦的方法么? 别忘了我们的FileUtils

FileUtils中还有这样一个方法:

  1. URL jpg = new URL(jpgUrl);
  2. InputStream is = jpg.openStream();
  3. FileUtils.copyInputStreamToFile(is, new File("JPG", "test.jpg"));

首先根据jpgUrl实例化了一个URL的对象jpg,然后调用其中的openStream()方法读取到jpgUrl对应的图片信息的字节流数据,最后通过FileUtils.copyInputStreamToFile()方法将is中保存的字节流数据保存在本地的JPG目下的"test.jpg"文件中。

OK,第二个目标达成,图片信息已经可以保存在本地了,那么第三步,重新整理得到信息,构建一个新的HTML。

这一步其实并不复杂,只要将得到的信息插入到他们应该存在的位置即可,例如:

  1. Document DocNew = Jsoup.parse("<html><head><title>"+title+"</title></head><body>"+HTML+"</body></html>");
  2. Elements imgs = DocNew.select("img[src]");
  3. for ( Element img:imgs ) {
  4. img.attr("src", ImgPath);
  5. }

第一步是将一个全新的HTML字符串实例化出一个Document对象,其中的title是页面的标头,HTML是上面获得的新闻正文内容对应的HTML,这其中便包含着图片的标签,通过下面的循环,将所有的<img
src=" ">中src的路径指定为ImgPath(图片本地路径)即可,将这样的HTML保存到本地后,再次以浏览器方式打开,就可以看到只有文字信息与图片信息这些有用的内容了,并且在没有网络的情况下依旧可以访问哦~

好了,这次的目标达成,继续加油!

时间: 2024-08-04 00:21:16

网络爬虫学习笔记(二)的相关文章

python网络爬虫学习笔记

python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章目录 1. 介绍: 2. 从简单语句中开始: 3. 传送数据给服务器 4. HTTP头-描述数据的数据 5. 异常 5.0.1. URLError 5.0.2. HTTPError 5.0.3. 处理异常 5.0.4. info和geturl 6. Opener和Handler 7. Basic Authentication 8. 代理 9. Timeout 设置 10. Cookie 11. Deb

python 网络爬虫学习笔记(一)

为了方便,在Windows下我用了PyCharm,个人感觉这是一款优秀的python学习软件.爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来. 学习python爬虫前,先学习下其他的一些知识: (一)url URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,

linux网络编程学习笔记之二 -----错误异常处理和各种碎碎(更新中)

errno 在unix系统中对大部分系统调用非正常返回时,通常返回值为-1,并设置全局变量errno(errno.h),如socket(), bind(), accept(), listen().erron存放一个正整数来保存上次出错的错误值. 对线程而言,每个线程都有专用的errno变量,不必考虑同步问题. strerror converts to English (Note: use strerror_r for thread safety) perror is simplified str

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

APUE 学习笔记(二) 文件I/O

1. 文件I/O 对于内核而言,所有打开的文件都通过文件描述符引用,内核不区分文本文件和二进制文件 open函数:O_RDONLY  O_WRONLY  O_RDWR create函数: close函数:关闭一个文件时还会释放该进程加在该文件上的所有记录锁 lseek函数:显式地为一个打开的文件设置其偏移量 每个打开的文件都有一个与其相关联的 "当前文件偏移量",用以度量从文件开始处计算的字节数,通常,读.写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数 文件偏移量可以大于

马哥学习笔记二十一——LVS DR模型

kernel parameter: arp_ignore: 定义接收到ARP请求时的响应级别: 0:只要本地配置的有相应地址,就给予响应: 1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应: arp_announce:定义将自己地址向外通告时的通告级别: 0:将本地任何接口上的任何地址向外通告: 1:试图仅向目标网络通告与其网络匹配的地址: 2:仅向与本地接口上地址匹配的网络进行通告: curl命令选项: --cacert <file> CA证书 (SSL) --capath &l

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.