【爬虫】通用抽取网页URL
- package model;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.InputStreamReader;
- import java.util.HashSet;
- import java.util.Set;
- import org.apache.log4j.Logger;
- import org.htmlparser.Node;
- import org.htmlparser.NodeFilter;
- import org.htmlparser.Parser;
- import org.htmlparser.filters.NodeClassFilter;
- import org.htmlparser.filters.OrFilter;
- import org.htmlparser.tags.LinkTag;
- import org.htmlparser.util.NodeList;
- import org.htmlparser.util.ParserException;
- /**
*author:zeze
**/- public class HtmlParserTool {
- private static Logger logger = Logger.getLogger(HtmlParserTool.class);
- public Set<String> extracLinksByBody(String body,String url,LinkFilter filter,String enCode) {
- String host = getHost(url);
- Set<String> links = new HashSet<String>();
- try {
- //Parser parser = new Parser(url);
- Parser parser = null;
- try {
- //parser = Parser.createParser(body, enCode);
- parser = new Parser();
- parser.setInputHTML(body);
- parser.setEncoding(enCode);
- } catch (NullPointerException e) {
- parser=null;
- logger.error(e);
- }
- //parser.setEncoding("utf-8");
- // 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接
- NodeFilter frameFilter = new NodeFilter() {
- public boolean accept(Node node) {
- if (node.getText().startsWith("frame src=")) {
- return true;
- } else {
- return false;
- }
- }
- };
- // OrFilter 来设置过滤 <a> 标签,和 <frame> 标签
- OrFilter linkFilter = new OrFilter(new NodeClassFilter(
- LinkTag.class), frameFilter);
- // 得到所有经过过滤的标签
- NodeList list = parser.extractAllNodesThatMatch(linkFilter);
- for (int i = 0; i < list.size(); i++) {
- Node tag = list.elementAt(i);
- if (tag instanceof LinkTag)// <a> 标签
- {
- LinkTag link = (LinkTag) tag;
- String linkUrl = link.getLink();// url
- //String title = link.getStringText();
- String title = link.getLinkText();
- title = title.trim();
- if(!linkUrl.startsWith("http://") && !linkUrl.startsWith("https://") ) {
- if(linkUrl.startsWith("/")){
- linkUrl = host+linkUrl;
- }else {
- linkUrl = host+ "/" + linkUrl;
- }
- }
- if(filter.accept(linkUrl))
- links.add(linkUrl);
- } else// <frame> 标签
- {
- // 提取 frame 里 src 属性的链接如 <frame src="test.html"/>
- String frame = tag.getText();
- int start = frame.indexOf("src=");
- frame = frame.substring(start);
- int end = frame.indexOf(" ");
- if (end == -1)
- end = frame.indexOf(">");
- String frameUrl = frame.substring(5, end - 1);
- if(filter.accept(frameUrl))
- links.add(frameUrl);
- }
- }
- parser=null;
- } catch (ParserException e) {
- //e.printStackTrace();
- logger.error(e);
- }
- return links;
- }
- private String getHost(String url) {
- int flag = -1;
- if(url.startsWith("http://")) {
- url = url.replace("http://", "");
- flag = 0;
- }
- if(url.startsWith("https://")) {
- url = url.replace("https://", "");
- flag = 1;
- }
- String host = "";
- int index = url.indexOf("/");
- if(index==-1) {
- host = url;
- } else {
- host = url.substring(0,index);
- }
- String addString = flag==1?"https://":"http://";
- host = addString + host;
- return host;
- }
- public static String readTxtFile(String filePath,String enCode){
- String body="";
- try {
- String encoding=enCode;
- File file=new File(filePath);
- if(file.isFile() && file.exists()){ //判断文件是否存在
- InputStreamReader read = new InputStreamReader(
- new FileInputStream(file),encoding);//考虑到编码格式
- BufferedReader bufferedReader = new BufferedReader(read);
- String lineTxt = null;
- while((lineTxt = bufferedReader.readLine()) != null){
- //System.out.println(lineTxt);
- body+=lineTxt;
- }
- read.close();
- }else{
- System.out.println("找不到指定的文件");
- }
- } catch (Exception e) {
- System.out.println("读取文件内容出错");
- e.printStackTrace();
- }
- return body;
- }
- public static void main(String[] args) {
- // TODO 自动生成的方法存根
- String startUrl = "http://weibo.cn";
- String body ="";
- HtmlParserTool htmlparser = new HtmlParserTool();
- body=readTxtFile("6.html","ISO8859-1");
- System.out.println(body);
- /*String LongtextUrl="";
- System.out.println("var url = \"http://weibo.com");
- int indexOfLongtextUrlStringStart=body.indexOf("var url = \"http://weibo.com");
- int indexOfLongtextUrlStringEnd=-1;
- if( indexOfLongtextUrlStringStart>=0)
- {
- indexOfLongtextUrlStringEnd=body.indexOf("\";",indexOfLongtextUrlStringStart);
- if(indexOfLongtextUrlStringEnd>=0)
- {
- LongtextUrl=body.substring(indexOfLongtextUrlStringStart, indexOfLongtextUrlStringEnd);
- }
- }
- System.out.println(LongtextUrl);
- LongtextUrl=LongtextUrl.replaceAll("var url = \"", "");
- System.out.println(LongtextUrl);*/
- /*Set<String> links = htmlparser.extracLinksByBody(body,startUrl,new LinkFilter()
- {
- //提取以 http://www.twt.edu.cn 开头的链接
- public boolean accept(String url) {
- //if(url.startsWith("http://www.sina.com.cn/"))
- return true;
- //else
- //return false;
- }
- },"utf-8");
- for(String link : links)
- System.out.println(link);*/
- }
- }
【爬虫】通用抽取网页URL的更多相关文章
- PHP实现简单爬虫-抓取网页url
<?php /** * 爬虫程序 -- 原型 * * 从给定的url获取html内容 * * @param string $url * @return string */ function _g ...
- 新闻网页通用抽取器GNEv0.04版更新,支持提取正文图片与源代码
GeneralNewsExtractor以下简称GNE是一个新闻网页通用抽取器,能够在不指定任何抽取规则的情况下,把新闻网站的正文提取出来. 我们来看一下它的基本使用方法. 安装 GNE 使用 pip ...
- (java)Jsoup爬虫学习--获取网页所有的图片,链接和其他信息,并检查url和文本信息
Jsoup爬虫学习--获取网页所有的图片,链接和其他信息,并检查url和文本信息 此例将页面图片和url全部输出,重点不太明确,可根据自己的需要输出和截取: import org.jsoup.Jsou ...
- 爬虫_网页url设计
为什么需要网页URL设计? 每个url不同的结构代表着不同的网页模块和信息的展现形式,为了方便维护与管理 网页url怎么设计? 分层: 主域名,子域名 一般形式为: 主域名: www.job.com ...
- Python3简单爬虫抓取网页图片
现在网上有很多python2写的爬虫抓取网页图片的实例,但不适用新手(新手都使用python3环境,不兼容python2), 所以我用Python3的语法写了一个简单抓取网页图片的实例,希望能够帮助到 ...
- python抽取指定url页面的title方法
python抽取指定url页面的title方法 今天简单使用了一下python的re模块和lxml模块,分别利用的它们提供的正则表达式和xpath来解析页面源码从中提取所需的title,xpath在完 ...
- JavaScript如何获取网页url中的参数
我们可以自定义一个公共函数来实现网页url中的参数获取,返回的是一个数组 GetUrlRequest: function () { var url = decodeURI(location.searc ...
- 获取网页URL地址及参数等的两种方法(js和C#)
转:获取网页URL地址及参数等的两种方法(js和C#) 一 js 先看一个示例 用javascript获取url网址信息 <script type="text/javascript&q ...
- 可操纵网页URL地址的js插件-url.js
url.js是一款能够很有用方便的操纵网页URL地址的js插件.通过url.js你能够设置和获取当前URL的參数,也能够对当前URL的參数进行更新.删除操作.还能够将当前URL的參数显示为json字符 ...
随机推荐
- 关于Ubantu下使用cshell的问题解决
在一个新创建的目录下使用cshell,直接在/etc/passwd 下对应的用户后 bash改为csh; 之后运行发现报错,后来查找发现/bin下没有csh执行脚本,之后安装csh;; 参考了http ...
- TCP三次握手连接
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...
- 【ASP.NET】@Model类型的使用详解
有时需要在ASP.NET MVC4的视图的@model中使用多个类型的实例,.NET Framework 4.0版本引入的System.Tuple类可以轻松满足这个需求. 假设Person和Produ ...
- 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)
黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...
- Android视频播放和横竖屏切换
最近做了一个项目,里面用到了视频播放这一块,当时想考虑Vitamio,demo也做了出来,但是后来发现它是商业收费的,并且收费相当可观,所以只能放弃了.然后找到了ijkPlayer,功能也很强大,最终 ...
- Groovy 学习手册(5)
8. 函数式编程 函数式编程(FP)是一种编程风格,侧重于函数和最小化状态的变化(使用不可变的数据结构).它更接近于用数学来表达解决方案,而不是循序渐进的操作. 在函数式编程里,其功能应该是" ...
- IAR for stm8 memory窗口的功能
进入debug模式后点击菜单view-Memory 可以在线查看,RAM,FLASH,OPTION等
- MPU6050陀螺仪和加速度计的校准
加速度计和陀螺仪的校准: 在传感器静止不动水平放置时,测出陀螺仪和加速度计各轴的偏移值,保存.以后每次上电调用dmp_set_xx_bias()就行了. u8 run_self_test(void) ...
- 温故而知新 Vue 原来也有this.$forceUpdate();
由于一些嵌套特别深的数据,导致数据更新了.UI没有更新(连深度监听都没有监听到),我捉摸着有没有和react一样的立即更新UI的API呢 this.forceUpdate()呢?结果还真有: this ...
- 从ext4将mysql数据目录移动至lustre出现(InnoDB: Unable to lock ./ibdata1, error: 38.)
因为数据目录过大,因此我把目录从本地移到了共享存储中.在修改了/etc/my.cnf和/etc/init.d/mysqld之后发现数据库可以运行,但启动速度很慢 原因是原文件系统是ext4,而目标文件 ...