之前发过一篇文章:利用String类制作简单的网络爬虫

http://blog.csdn.net/gfd54gd5f46/article/details/54729874

  • 这是是基于String类里的substring()方法对字符串进行截取,从而得到想要的内容。

  • 这种方法如果只是截取简单数据的话,还是可以实现的。

  • 但是如果我要获取指定的数据(这个数据可能成千上万条),这时后用String类里面的方法就会很麻烦,而且要编写的代码会变的非常多。


现在我们要引用一个网页解析的工具类来帮助我们更方便的解析网页。

下载 HtmlParser类

官方地址:http://htmlparser.sourceforge.net/

在线API文档:http://htmlparser.sourceforge.net/javadoc/index.html

下载地址:https://sourceforge.net/projects/htmlparser/files/


进去htmlparser下载1.6的版本


下载完成之后解压缩出来


导入jar包

右键单击项目


创建一个Folder ,名字为 lib

将 htmlparser.jar 拷贝进去


右键项目->Properties->java Build Path


添加一个jar包


最后OK就可以了

在代码上创建一个 Parser 对象试试看看行不行

这样就把引用了网上下载的jar包,现在就可以对网页进行解析了。


解析网页

这里随便找个 电影网站 来进行测试

http://www.dytt8.net

获取单个视频的下载链接

  • 进去 日韩电影 这里


然后随便打开一个 电影 标题,我这里就选择第一个

  • 打开之后发现这个页面是介绍 电影的
/20170129/53099.html


F12进去调试模式

  • 分析下载地址


发现整个页面就只有一个ftp的标识

ftp://ygdy8:ygdy8@y219.dydytt.net:9239/[阳光电影www.ygdy8.com].蜡笔小新:梦境世界大突击.BD.720p.日国粤三语中字.mkv


发现了规律之后,那我们是不是只提取含有ftp开头的字符串就可以了呢?

  • 代码实现
    /***获取电影的下载地址*/public static void  test1() {try {Parser parser = new Parser("http://www.dytt8.net/html/gndy/dyzz/20170208/53190.html");//提取所有匹配的节点保存到节点列表//LinkStringFilter("ftp")  节点字符串过滤器,过滤所有包涵 "ftp" 的字符串  NodeList nodeList = parser.extractAllNodesThatMatch(new LinkStringFilter("ftp"));//遍历节点列表for (int i = 0; i < nodeList.size(); i++) {//将节点列表的第一个元素保存到标签里LinkTag tag = (LinkTag) nodeList.elementAt(i);//打印标签System.out.println(tag.getLink());}   } catch (ParserException e1) {e1.printStackTrace();}}

运行之后确实是获取到下载地址


2、获取单个列表里面所有的电影介绍页地址

我们知道每个电影的介绍页面都是不同的网页

比如刚刚的页面,它的后缀是:/html/gndy/dyzz/20170129/53099.html分析一下页面源码:http://www.dytt8.net/html/gndy/dyzz/index.html发现这个列表是在table里面的


每行都有一个电影的各种信息


那我们能不能获取一下每个页面的介绍地址呢?

“/html/gndy/dyzz/20170129/53099.html”首先还是一样,分析一下规律查找内容时发现在当前table下每个a标签都有一个class属性是“ulink”

发现了规律之后我们就用代码实现一下吧

  • 代码实现
/*** http://www.ygdy8.net/html/gndy/dyzz/index.html* 从网页里获取25个电影的介绍地址*/public static void test2() {try {Parser parser = new
Parser("http://www.ygdy8.net/html/gndy/dyzz/index.html");
//过滤所有class属性是"ulink"的标签NodeList nodeList = parser.extractAllNodesThatMatch(new
HasAttributeFilter("class","ulink"));System.out.println("找到:" + nodeList.size() + "条数据。");for (int i = 0; i < nodeList.size(); i++) {//拿到节点的链接标签LinkTag tag = (LinkTag) nodeList.elementAt(i);System.out.println(tag.getLink());}} catch (ParserException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}

这样就拿到个每个介绍页面的链接


3、 获取所有的列表页面

刚刚第2步的时候已经拿到单个列表页面的所有介绍页面,那我们也可以获取所有的列表页面

同样,分析一下网页源码,找一下规律


查找option标签可以发现 有161条数据


再过滤一下里option包涵有value属性的总共有159个,因为前两个不是列表标签,所以找到的总共有157个


知道了规律之后,我们就可以获取了

  • 代码实现
    /*** http://www.ygdy8.net/html/gndy/dyzz/index.html* 从网页获取157个电影分页的地址*/public static void test3() {try {Parser parser = new Parser("http://www.ygdy8.net/html/gndy/dyzz/index.html");//获取所有包涵value属性的option标签NodeList nodeList = parser.extractAllNodesThatMatch(new TagNameFilter("option")).extractAllNodesThatMatch(new HasAttributeFilter("value"));//System.out.println("找到:" + nodeList.size() + "条数据。");for (int i = 0; i < nodeList.size(); i++) {//拿到第i个元素OptionTag tag = (OptionTag) nodeList.elementAt(i);//如果获取带有value属性的标签,并且标签里面包涵有list内容if (tag.getAttribute("value").contains("list")) {System.out.println(tag.getAttribute("value"));}}} catch (ParserException e1) {e1.printStackTrace();}

这样就成功拿到了所有的列表

实战

现在我要把这三个方法整合起来:

  • 1、 获取到所有列表

  • 2、 遍历每个列表的介绍页面

  • 3、 通过介绍页面获取下载地址

完整源码

package com.lingdu.htmlparser;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;public class HtmlParserDemo {/*** 保存电影下载地址* @param i 第i条数据* @param content 内容* @param pathName 保存路径*/public static void saveMovieDownloadAddress(int i, String content, String pathName) {if (!pathName.equals("")) {File fileName = new File(pathName);try {PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName,true),"UTF-8")));pw.println(i + " : "  + content);pw.flush();pw.close();System.out.println("保存------>" + content + "    成功!");} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}/*** 3、通过介绍地址获取电影的下载地址*/public static List<String> getDownloadUrl(String movieUrl) {List<String> list = new ArrayList<String>();try {Parser parser = new Parser("http://www.ygdy8.net" + movieUrl);//提取所有匹配的节点保存到节点列表//LinkStringFilter("ftp")  节点字符串过滤器,过滤所有包涵 "ftp" 的字符串  NodeList nodeList = parser.extractAllNodesThatMatch(new LinkStringFilter("ftp"));//遍历节点列表for (int i = 0; i < nodeList.size(); i++) {//将节点列表的第一个元素保存到标签里LinkTag tag = (LinkTag) nodeList.elementAt(i);//打印标签//System.out.println(tag.getLink());list.add(tag.getLink());}   } catch (ParserException e1) {e1.printStackTrace();}return list;}/*** 2、从网页里获取所有电影的介绍地址*/public static List<String> getAllMoviePageFromOneList(String oneListUrl) {//保存所有电影的介绍地址List<String> list = new ArrayList<String>();try {Parser parser = new Parser("http://www.ygdy8.net/html/gndy/dyzz/" + oneListUrl);NodeList nodeList = parser.extractAllNodesThatMatch(new HasAttributeFilter("class","ulink"));System.out.println("找到:" + nodeList.size() + "条数据。");for (int i = 0; i < nodeList.size(); i++) {//拿到节点的链接标签LinkTag tag = (LinkTag) nodeList.elementAt(i);//System.out.println(tag.getLink());list.add(tag.getLink());}} catch (ParserException e1) {e1.printStackTrace();}return list;}/*** 1、从网页获取电影的分页的地址*/public static List<String> getAllListFromUrl(String url) {//创建一个list集合用来存放所有的列表页面List<String> list = new ArrayList<String>();try {Parser parser = new Parser(url);//获取所有包涵value属性的option标签NodeList nodeList = parser.extractAllNodesThatMatch(new TagNameFilter("option")).extractAllNodesThatMatch(new HasAttributeFilter("value"));//System.out.println("找到:" + nodeList.size() + "条数据。");for (int i = 0; i < nodeList.size(); i++) {//拿到第i个元素OptionTag tag = (OptionTag) nodeList.elementAt(i);//如果获取带有value属性的标签,并且标签里面包涵有list内容if (tag.getAttribute("value").contains("list")) {//System.out.println(tag.getAttribute("value"));list.add(tag.getAttribute("value"));}}} catch (ParserException e1) {e1.printStackTrace();}//list_23_1.htmlreturn list;}/*** 整合逻辑* 将所有的方法集合运行*/public static void logicIntegration() {//保存所有的分页列表的页面List<String> allList = getAllListFromUrl("http://www.ygdy8.net/html/gndy/dyzz/index.html");//保存所有电影页面地址List<String> allMoviePageUrl = new ArrayList<String>();//保存所有电影的下载地址List<String> allDownloadUrl = new ArrayList<String>();//统计次数int i = 0;for (String str1 : allList) {System.out.println("\n页面:-------------------->" + str1 + "--------------------");allMoviePageUrl = getAllMoviePageFromOneList(str1);for (String str2 : allMoviePageUrl) {allDownloadUrl = getDownloadUrl(str2);for (String str3 : allDownloadUrl) {i += 1;//Movie DownLoad Address.txt是文件名,可以自己定义saveMovieDownloadAddress(i,str3,"Movie DownLoad Address.txt");//System.out.println(str3);}}}}public static void main(String[] args) {logicIntegration();}
}

全部保存完毕!

使用HttpParser类解析网页相关推荐

  1. Android 使用Jsoup解析网页批量获取图片

    Android 网络图片查看器HappyLook开发 一.前言 二.框架介绍 1.Jsoup简介 2.EventBus简介 3.RecyclerView及Glide 三.具体实现 1.需求确认 2.引 ...

  2. Python爬虫之解析网页

    常用的类库为lxml, BeautifulSoup, re(正则) 以获取豆瓣电影正在热映的电影名为例,url='https://movie.douban.com/cinema/nowplaying/ ...

  3. jsoup html转义处理,jsoup解析网页出现转义符问题

    https://www.oschina.net/question/996055_136438 *************************************** 我要解析这个网页  htt ...

  4. 拱拱Lite开发(3):三翼页及湘大文库下载实现(解析网页获取信息及模拟登陆)

    因为没有三翼新闻及湘大文库的API,简单的方法行不通就只能绕远啦,我们这次来解析网页,嗯,是个体力活其实.因为网页HTML也是有一定格式的,所以只要网页结构不进行大的改动,我们就可以一直这样解析网页获 ...

  5. 使用Beautiful Soup库解析网页

    使用Beautiful Soup库解析网页 Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够实现惯用的文档导航,查找,修改文档的方式等功能.Beautif ...

  6. asp自动解析网页中的图片地址,并将其保存到本地服务器

    程序实现功能:自动将远程页面的文件中的图片下载到本地. 程序代码 <% '将本文保存为 save2local.asp '测试:save2local.asp?url=http://ent.sina ...

  7. python爬虫自学网站_Python爬虫3步曲:5分钟学习用Python解析网页

    使用正则表达式解析网页是Python的一个擅长的领域.如果还想更加深入地学习正则表达式,或者在平时经常用到正则表达式,可以进入Regular Expression 101网站学习,网站地址为 http ...

  8. 网页爬虫 python-Python爬虫解析网页的4种方式

    文章目录 爬虫的价值 正则表达式 requests-html BeautifulSoup lxml的XPath 爬虫的价值 常见的数据获取方式就三种:自有数据.购买数据.爬取数据.用Python写爬虫 ...

  9. python爬虫基础教程115_Python解析网页源代码中的115网盘链接实例

    本文实例讲述了python解析网页源代码中的115网盘链接的方法.分享给大家供大家参考.具体方法分析如下: 其中的1.txt,是网页http://bbs.pediy.com/showthread.ph ...

最新文章

  1. 使用OpenCV进行SVM分类demo
  2. 比较全面的L1和L2正则化的解释
  3. wpf slider 控件模板
  4. 【Android FFMPEG 开发】C++ 回调 Java 方法 模板 ( JavaVM *vm | JNIEnv *env | jobject instance | 引用类型 | 模板代码示例 )
  5. 驳!?使用游戏引擎是作弊行为的5个依据
  6. 语音识别(1)---语音识别(ASR)评估指标-WER(字错误率)和SER(句错误率)
  7. 【推荐实践】强化学习在美团“猜你喜欢”的实践
  8. 《Java程序员,上班那点事儿》征文活动获奖名单
  9. 【空号检测】批量手机号码空号检测查询软件,号码如何去除查询空号
  10. 自架魔兽服务器物品代码,魔兽世界物品代码与GM指令大全(全部整理自网上).doc...
  11. Tensorflow2.0---SSD网络原理及代码解析(一)
  12. 图像处理—灰度图像转为伪彩色图像
  13. 学习笔记 Tianmao 篇 SliderLayout 的使用
  14. 申报须知,2022年滁州市各区县高新技术企业奖励政策变化,明光市
  15. error: src refspec master does not match any. 错误的解决办法
  16. 动态规划:最长子序列
  17. NodeMCU(ESP8266)使用HTTP Get和Post
  18. linux下挂载新的磁盘
  19. matlab中xpcapi库的调用,关于MATLAB中xpc实时控制平台搭建的心得
  20. 使用Unity来实现全民K歌唱歌,耳返效果和混响功能

热门文章

  1. 中国二次锂离子电池电解液市场需求现状与销售策略分析报告2022-2028年
  2. linux下载百度命令行,Linux 命令行使用百度网盘上传下载文件
  3. c语言for循环开机动画,android8.1开机动画启动分析
  4. 初识MIMO(四):MIMO的接收端检测技术及其仿真
  5. 如何批量替换文件名称中的指定字符?
  6. 对象存储OSS之ossbrowser的使用
  7. K8S Yaml 详细说明及简单样例
  8. 11年北漂老码农转行!黯然离场...
  9. git 更换仓库地址
  10. xUitls3框架的入门级使用及部分解析