精华内容
下载资源
问答
  • java+jsoup抓取网页数据

    2018-12-21 14:12:58
    使用java+jsoup进行网页数据的抓取,提取自己想要的数据
  • 利用httpClient+jsoup技术进行网页数据的获取,以网易贵金属为例~
  • Android App使用Jsoup抓取网页数据显示-附件资源
  • jsoup抓取网页+详细讲解 Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTML 中攫取你所需的信息和扩展 HTMLParser ...

    jsoup抓取网页+详细讲解


    Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTML 中攫取你所需的信息和 扩展 HTMLParser 对自定义标签的处理能力。但现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了 jsoup 。

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    jsoup 的主要功能如下:

    1. 从一个 URL,文件或字符串中解析 HTML;

    2. 使用 DOM 或 CSS 选择器来查找、取出数据;

    3. 可操作 HTML 元素、属性、文本;

    jsoup 是基于 MIT 协议发布的,可放心使用于商业项目。

    jsoup 的主要类层次结构如图 1 所示:


    图 1. jsoup 的类层次结构
    图 1. jsoup 的类层次结构 
     

    接下来我们专门针对几种常见的应用场景举例说明 jsoup 是如何优雅的进行 HTML 文档处理的。


    回页首

    文档输入

    jsoup 可以从包括字符串、URL 地址以及本地文件来加载 HTML 文档,并生成 Document 对象实例。

    下面是相关代码:


    清单 1

           // 直接从字符串中输入 HTML 文档  String html = "<html><head><title> 开源中国社区 </title></head>"   + "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>";   Document doc = Jsoup.parse(html);    // 从 URL 直接加载 HTML 文档  Document doc = Jsoup.connect("http://www.oschina.net/").get();   String title = doc.title();    Document doc = Jsoup.connect("http://www.oschina.net/")    .data("query", "Java")   // 请求参数   .userAgent("I ’ m jsoup") // 设置 User-Agent    .cookie("auth", "token") // 设置 cookie    .timeout(3000)           // 设置连接超时时间   .post();                 // 使用 POST 方法访问 URL    // 从文件中加载 HTML 文档  File input = new File("D:/test.html");   Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");  

     

    请大家注意最后一种 HTML 文档输入方式中的 parse 的第三个参数,为什么需要在这里指定一个网址呢(虽然可以不指定,如第一种方法)?因为 HTML 文档中会有很多例如链接、图片以及所引用的外部脚本、css 文件等,而第三个名为 baseURL 的参数的意思就是当 HTML 文档使用相对路径方式引用外部文件时,jsoup 会自动为这些 URL 加上一个前缀,也就是这个 baseURL。

    例如 <a href=/project> 开源软件 </a> 会被转换成 <a href=http://www.oschina.net/project> 开源软件 </a>。


    回页首

    解析并提取 HTML 元素

    这部分涉及一个 HTML 解析器最基本的功能,但 jsoup 使用一种有别于其他开源项目的方式——选择器,我们将在最后一部分详细介绍 jsoup 选择器,本节中你将看到 jsoup 是如何用最简单的代码实现。

    不过 jsoup 也提供了传统的 DOM 方式的元素解析,看看下面的代码:


    清单 2.

           File input = new File("D:/test.html");   Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/");    Element content = doc.getElementById("content");   Elements links = content.getElementsByTag("a");   for (Element link : links) {    String linkHref = link.attr("href");    String linkText = link.text();   }  

     

    你可能会觉得 jsoup 的方法似曾相识,没错,像 getElementById 和 getElementsByTag 方法跟 JavaScript 的方法名称是一样的,功能也完全一致。你可以根据节点名称或者是 HTML 元素的 id 来获取对应的元素或者元素列表。

    与 htmlparser 项目不同的是,jsoup 并没有为 HTML 元素定义一个对应的类,一般一个 HTML 元素的组成部分包括:节点名、属性和文本,jsoup 提供简单的方法供你自己检索这些数据,这也是 jsoup 保持瘦身的原因。

    而在元素检索方面,jsoup 的选择器简直无所不能,


    清单 3.

           File input = new File("D:\test.html");   Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");    Elements links = doc.select("a[href]"); // 具有 href 属性的链接  Elements pngs = doc.select("img[src$=.png]");// 所有引用 png 图片的元素    Element masthead = doc.select("div.masthead").first();   // 找出定义了 class=masthead 的元素   Elements resultLinks = doc.select("h3.r > a"); // direct a after h3  

     

    这是 jsoup 真正让我折服的地方,jsoup 使用跟 jQuery 一模一样的选择器对元素进行检索,以上的检索方法如果换成是其他的 HTML 解释器,至少都需要很多行代码,而 jsoup 只需要一行代码即可完成。

    jsoup 的选择器还支持表达式功能,我们将在最后一节介绍这个超强的选择器。


    回页首

    修改数据

    在解析文档的同时,我们可能会需要对文档中的某些元素进行修改,例如我们可以为文档中的所有图片增加可点击链接、修改链接地址或者是修改文本等。

    下面是一些简单的例子:


    清单 4.

           doc.select("div.comments a").attr("rel", "nofollow");   // 为所有链接增加 rel=nofollow 属性  doc.select("div.comments a").addClass("mylinkclass");   // 为所有链接增加 class=mylinkclass 属性  doc.select("img").removeAttr(" // 删除所有图片的 onclick 属性  doc.select("input[type=text]").val(""); // 清空所有文本输入框中的文本 

     

    道理很简单,你只需要利用 jsoup 的选择器找出元素,然后就可以通过以上的方法来进行修改,除了无法修改标签名外(可以删除后再插入新的元素),包括元素的属性和文本都可以修改。

    修改完直接调用 Element(s) 的 html() 方法就可以获取修改完的 HTML 文档。


    回页首

    HTML 文档清理

    jsoup 在提供强大的 API 同时,人性化方面也做得非常好。在做网站的时候,经常会提供用户评论的功能。有些用户比较淘气,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,例如 XSS 跨站点攻击之类的。

    jsoup 对这方面的支持非常强大,使用非常简单。看看下面这段代码:


    清单 5.

           String unsafe = "<p><a href='http://www.oschina.net/'    开源中国社区 </a></p>";   String safe = Jsoup.clean(unsafe, Whitelist.basic());   // 输出 :   // <p><a href="http://www.oschina.net/" rel="nofollow"> 开源中国社区 </a></p>  

     

    jsoup 使用一个 Whitelist 类用来对 HTML 文档进行过滤,该类提供几个常用方法:


    表 1. 常用方法:

    方法名简介
    none()只允许包含文本信息
    basic()允许的标签包括:a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, strike, strong, sub, sup, u, ul, 以及合适的属性
    simpleText()只允许 b, em, i, strong, u 这些标签
    basicWithImages()在 basic() 的基础上增加了图片
    relaxed()这个过滤器允许的标签最多,包括:a, b, blockquote, br, caption, cite, code, col, colgroup, dd, dl, dt, em, h1, h2, h3, h4, h5, h6, i, img, li, ol, p, pre, q, small, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, u, ul

     

    如果这五个过滤器都无法满足你的要求呢,例如你允许用户插入 flash 动画,没关系,Whitelist 提供扩展功能,例如 whitelist.addTags("embed","object","param","span","div"); 也可调用 addAttributes 为某些元素增加属性。


    回页首

    jsoup 的过人之处——选择器

    前面我们已经简单的介绍了 jsoup 是如何使用选择器来对元素进行检索的。本节我们把重点放在选择器本身强大的语法上。下表是 jsoup 选择器的所有语法详细列表。


    表 2. 基本用法:

    tagname使用标签名来定位,例如 a
    ns|tag使用命名空间的标签定位,例如 fb:name 来查找 <fb:name> 元素
    #id使用元素 id 定位,例如 #logo
    .class使用元素的 class 属性定位,例如 .head
    [attribute]使用元素的属性进行定位,例如 [href] 表示检索具有 href 属性的所有元素
    [^attr]使用元素的属性名前缀进行定位,例如 [^data-] 用来查找 HTML5 的 dataset 属性
    [attr=value]使用属性值进行定位,例如 [width=500] 定位所有 width 属性值为 500 的元素
    [attr^=value], [attr$=value], [attr*=value]这三个语法分别代表,属性以 value 开头、结尾以及包含
    [attr~=regex]使用正则表达式进行属性值的过滤,例如 img[src~=(?i)\.(png|jpe?g)]
    *定位所有元素

     

    以上是最基本的选择器语法,这些语法也可以组合起来使用,下面是 jsoup 支持的组合用法:


    表 3:组合用法:

    el#id定位 id 值某个元素,例如 a#logo -> <a id=logo href= … >
    el.class定位 class 为指定值的元素,例如 div.head -> <div class=head>xxxx</div>
    el[attr]定位所有定义了某属性的元素,例如 a[href]
    以上三个任意组合例如 a[href]#logo 、a[name].outerlink
    ancestor child这五种都是元素之间组合关系的选择器语法,其中包括父子关系、合并关系和层次关系。
    parent > child
    siblingA + siblingB
    siblingA ~ siblingX
    el, el, el

     

    除了一些基本的语法以及这些语法进行组合外,jsoup 还支持使用表达式进行元素过滤选择。下面是 jsoup 支持的所有表达式一览表:

    表 4. 表达式:

    :lt(n)例如 td:lt(3) 表示 小于三列
    :gt(n)div p:gt(2) 表示 div 中包含 2 个以上的 p
    :eq(n)form input:eq(1) 表示只包含一个 input 的表单
    :has(seletor)div:has(p) 表示包含了 p 元素的 div
    :not(selector)div:not(.logo) 表示不包含 class=logo 元素的所有 div 列表
    :contains(text)包含某文本的元素,不区分大小写,例如 p:contains(oschina)
    :containsOwn(text)文本信息完全等于指定条件的过滤
    :matches(regex)使用正则表达式进行文本过滤:div:matches((?i)login)
    :matchesOwn(regex)使用正则表达式找到自身的文本








          本文转自yjflinchong 51CTO博客,原文链接:http://blog.51cto.com/yjflinchong/1164949,如需转载请自行联系原作者






    展开全文
  • 现在做简单测试的话,没有数据来源,可以用网页抓包的方式去获取数据,这是个简单的测试

    jsoup在android上的应用有很多人也写了,我都是参考了网上的思想,同时呢,说一下我在路上遇到的坑。(本人第一次写博客,写得不好请见谅哈)

    jsoup这个java库用起来很方便,关于他的介绍我就不细说了,但我还是花了一天的时间解决了,在写完代码后,一直没有我想要的数据,数据一直都是null,所以这就很尴尬了。后来查了一下网上的一些资料发现,原来jsoup并不能用在主线程中,所以我就将他改在网络异步请求中去解决,最终解决了这个问题


    如下是我单独写得一个类:大家可以看到我抓取数据的网页地址是http://www.mzitu.com这是一个福利地址o ,如果想做个图库app的话是可以考虑去抓取这里面的数据,而不用自己去产生数据了,



    我抓取的是div class名为postlist的ul,并且id名为pins ,之后数据就回得到li数组,每个li里面都是有图片数据url地址的,我获取数据的代码都在ImageParser类里面,MeiziUrl是我写的一个实体类:很简单的就两个String类型变量,将获取到的data-original数据放入到实体类就可以了,应该很好理解的,

    如下是网络请求的封装函数:(也可以用Retrofit+Rxjava去封装)将数据放入到Recycler控件中,就可以去显示了(获取到的url地址用Glide去加载)




    这就出来了。很多细节的东西没有写出来,望见谅。

     

    展开全文
  • 使用jsoup抓取网页列表信息,并入库,使用了PreparedStatement防止sql注入小demo。
  • Jsoup 抓取网页内容demo

    2020-09-22 15:05:42
    1.代码 public Document getDocument (String url){ ... return Jsoup.connect(url).get(); } catch (IOException e) { e.printStackTrace(); } return null; } public static void main(String[] a

    1.代码

        public  Document getDocument (String url){
            try {
                return Jsoup.connect(url).get();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
    
       public static void main(String[] args) {
            JsoupTest t = new JsoupTest();
            Document doc = t.getDocument("https://www.gushiwen.cn/default_1.aspx");
            Elements elements = doc.select("[class=contson]");//getElementsByClass("dn");
            for (Element result : elements) {//多个class为contson的标签,进行遍历
                System.out.println(result.text());//输出标签中文本
            }
       }

     

    展开全文
  • 有时需要抓取网页的图片。 一般有几种方式: 1、python是最方便的,但是有学习成本。 2、图片批量下载软件,这个可用,但是不支持多页面,抓取规则也不太灵活。 3、java来抓取,讲真不是最高效的,但是职业就是java...


    有时需要抓取网页的图片。 一般有几种方式:

    1、python是最方便的,但是有学习成本。
    2、图片批量下载软件,这个可用,但是不支持多页面,抓取规则也不太灵活。
    3、java来抓取,讲真不是最高效的,但是职业就是java,不用学习成本。

    pom.xml中引入jsoup

    <dependency>
    	<groupId>org.jsoup</groupId>
    	<artifactId>jsoup</artifactId>
    	<version>1.9.1</version>
    </dependency>
    

    代码

    /**
     * 1、STORE_LOCATION 是图片存储路径,这个根据需要自定义
     * 2、抓取图片的需求不同,规则自定义下
     * 3、多网页抓取,用个for循环即可。
     */
    public class DownloadImageUtils {
        private static Logger logger = LoggerFactory.getLogger(DownloadImageUtils.class);
        public static String STORE_LOCATION="F:\\pic\\";
        public static List<Image> images =new ArrayList<Image>();
    
        public static void main(String[] args) {
           String netUrl = "http://www.baidu.com"; //要爬的网页
           new DownloadImageUtils().start(netUrl);
        }
    
        public void start(String pageUrl){
            List<Image> images = parsePage(pageUrl);
            downloadImage(images);
        }
    
        public List<Image> parsePage(String pageUrl){
            List<Image> images =new ArrayList<Image>();
            Connection connect = Jsoup.connect(pageUrl);
            Document document = null;
            try {
                document = connect.get();
                /* 自定义规则 */
                Elements elements = document.getElementsByTag("img"); // 找到所有img标签
                    for (Element element : elements) {
                        String alt = element.attr("alt");
                        String src = element.attr("src");
                        Image image =  new Image();
                        if(!StringUtils.isEmpty(alt) && src.contains("imgs") && !src.contains("imgs2")){
                            System.out.println(element.html());
                            System.out.println(element.attr("src"));
                            image.setAlt(alt.replace("-FHD",""));
                            image.setSrc(src);
                            images.add(image);
                        }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return images;
        }
    
    
        //下载该图片!
        public void downloadImage(List<Image> images){
            for (Image image:images) {
                InputStream in = null;
                BufferedOutputStream os = null;
                try {
                    URL url = new URL(image.getSrc());
                    File file = new File(STORE_LOCATION + image.getAlt() + ".jpg");
                    logger.info("filename:{}",file.getAbsoluteFile());
                    if(file.exists()){ //
                        return;
                    }
                    URLConnection conn = url.openConnection();
                    in = conn.getInputStream();
                    os = new BufferedOutputStream(new FileOutputStream(file.getAbsoluteFile()));
                    byte[] buff = new byte[1024];
                    int num = 0;
                    while((num = in.read(buff))!= -1)
                    {
                        os.write(buff, 0, num);
                        os.flush();
                    }
                } catch (MalformedURLException e) {
                    logger.error("获取图片url异常");
                    e.printStackTrace();
                } catch (IOException e) {
                    logger.error("下载图片url连接异常");
                    e.printStackTrace();
                }
                finally{
                    if( in != null){
                        try {
                            in.close();
                        } catch (IOException e) {
                            logger.error("读入流关闭异常");
                        }
                    }
                    if( os != null){
                        try {
                            os.close();
                        } catch (IOException e) {
                            logger.error("输出流关闭异常");
                        }
                    }
                }
            }
        }
    
        static class Image {
            private String alt;
            private String src;
            public String getAlt() {
                return alt;
            }
            public void setAlt(String alt) {
                this.alt = alt;
            }
            public String getSrc() {
                return src;
            }
            public void setSrc(String src) {
                this.src = src;
            }
        }
    }
    

    jsoup的一些方法

    jsoup 获取元素的方法不只一种,代码:

    // 根据标签获取元素
    document.getElementsByTag("img");
    // 根据css样式获取元素
    document.query(".red");
    

    URLConnection 和 jsoup

    使用URLConnection,来读取网页内容也是可以的。 但是解析的时候只能硬拼字符串了,还是比较头疼。 jsoup方便很多。

    URL myurl = new URL(netUrl);
    URLConnection myconn = myurl.openConnection();
    InputStream myin = myconn.getInputStream();
    mybr = new BufferedReader(new InputStreamReader(myin,"UTF-8"));
    String line;
    while((line = mybr.readLine())!= null)
    {
        getImageUrl(line,netUrl);//判断网页中的jpg图片
    }
    
    展开全文
  • 实现浏览新浪新闻jsoup抓取网页信息 listview列表 下拉刷新.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • jsoup抓取网页教程

    2014-12-14 16:17:09
    很实用的jsoup抓取网页教程,通过查看此文档,您可以解决你在抓取网页过程中出现的问题
  • 使用Jsoup抓取网页关键信息并入库 ip天气查询并发送邮件
  • jsoup抓取网页数据

    2015-08-04 12:14:17
    抓取网页上想要的内容~最后转化成json格式
  • httpClient+jsoup抓取网页数据实例和jar包
  • jsoup 抓取网页数据

    2017-12-17 01:07:09
    jsoup 抓取赶集网 页面所有会计 电话 jsoup的Element类 http://blog.csdn.net/u010142437/article/details/18802873 java代理实现爬取代理IP http://blog.csdn.net/sdfiiiiii/article/details/70432060 JAVA...
  • jsoup抓取网页内容

    2011-06-20 09:17:57
    这是一个使用jsoup抓取网页内容的例子,适合从事手机开发的初学者学习
  • jsoup抓取网页数据

    2017-10-13 17:54:00
    java项目有时候我们需要别人网页上的数据,怎么办?我们可以借助第三方架包jsou来实现,jsoup的中文文档,那怎么具体的实现呢?那就跟我一步一步来吧 最先肯定是要准备好这个第三方架包啦,下载地址,得到这个jar后...
  • Jsoup抓取(获取)网页内容(java)

    千次阅读 2019-02-28 21:23:39
    我是在一篇博客里一个一个地测试(HttpClient、Jsoup、HtmlUnit、Watij、Selenium、Webspec)各种问题找不到对应的jar包等 ,最终只有一个能用Jsoup(运气好找到了)。 原创文章,转载请注明出处:...
  • 地址:http://www.open-open.com/jsoup/selector-syntax.htm 标签学习:http://www.2cto.com/kf/201401/275824.html
  • 1、最近在项目中需要获取网页中的图片,研究了一下jsoup抓取,简单方便。 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的...
  • 今天写了一个通过jsoup抓取网页的内容的例子。jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 用...
  • jsoup分页爬取网页

    2017-12-26 22:16:27
    jsoup分页爬取网页jsoup分页爬取网页jsoup分页爬取网页内置jsoup所需要的jar包
  • 文章目录Jsoup - 使用Jsoup 抓取网页中全部的图片,CSS,Script,等资源1、包依赖2、构建工具类3、简单实例 Jsoup - 使用Jsoup 抓取网页中全部的图片,CSS,Script,等资源 1、包依赖 <dependency> <...
  • jsoup抓取网页获取网页源码的时候,得到的源码和在网站上面点击右键查看源码不相同,怎么解决 Document doc = Jsoup.parse(new URL(url), 5000);
  • Jsoup抓取网页内容超时问题的处理

    千次阅读 2018-01-26 10:56:23
    在利用Jsoup抓取网页的时候,遇到超时问题: java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(Unknown ...
  • Jsoup抓取整个网站

    2017-12-28 14:06:28
    使用jsoup抓取整个网站,保存在本地。包括网站的“css、js、图片、页面”,都会保存在本地。并且保存的路径痛网站上的路径。经过测试,一般的基础网站都可以抓取
  • 使用java jsoup抓取页面中的数据

    千次阅读 2018-02-02 15:44:26
    介绍 使用jsoup来进行解析。 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的...抓取页面中的答案。如图: demo展示 //方法入口 public static void main(Strin
  • 安卓开发初学者一枚,如图,想抓取“不用佩戴口罩”,“适宜运动”等文字前方的图标,用jsoup抓取网页图标元素并在安卓应用中显示,但图标不像网页图片有地址,请问这一类图标要如何抓取?用什么显示在安卓应用里? ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,769
精华内容 1,107
关键字:

jsoup抓取网页