精华内容
下载资源
问答
  • java 爬虫

    2021-09-27 18:00:18
    //获取src的绝对路径 //好像有反爬虫机制 所以加了这个代码 // 参考 https://www.cnblogs.com/xijieblog/p/4540026.html URL url=new URL(src2); url = new URL(src2); HttpURLConnection ...

    根据吾爱破解的一个大佬写的之后改了一下,爬的我需要的素材。
    测试地址 https://www.loggly.com/docs-index/log-sources/
    里面大部分注释也是大佬写的,很简单,和js差不多感觉

     <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.13.1</version>
            </dependency>
    
    package com.plan.plan;
    
    import org.jsoup.Connection;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    import java.io.*;
    import java.net.HttpURLConnection;
    import java.net.URL;
    /**
     * ClassName: pc
     * Description:
     * date: 2021/9/27 18:04
     *
     * @author robotname a
     * @author dev whz
     * @since JDK 1.8
     */
    public class pc {
        public static void main(String[] args) throws IOException {
            long t1=System.currentTimeMillis();
            //访问目标网址
            Connection connection1=Jsoup.connect("https://www.loggly.com/docs-index/log-sources/");
            //连接成功后获取Document对象
            Document document1= connection1.get();
            Element elementDiv=document1.selectFirst("[class=log-sources]");
    
            Element elementDiv1=elementDiv.selectFirst("[class=container]");//搜索class=cl r   标签
            Element elementUL=elementDiv1.selectFirst("[class=row]");
            Element elementUL1=elementUL.selectFirst("[class=col-sm-8]");
    
            Elements elements=null;
            try {
                Thread.sleep(5000);
                 elements=elementUL1.getElementsByClass("log-sources__main");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Elements elementUL1mainlist=elements.select(".log-list");
            Elements elementLis=elementUL1mainlist.select(".log-list__item");//通过找到的ul 搜索ul里面的所有li标签
            for(Element elementLi:elementLis) {//遍历所有找到的li
                Element elementA=elementLi.selectFirst("a");//搜索li里的a标签
                String name=elementA.attr("href");
                Elements elements1log__front=elementA.getElementsByClass("log__front");
                Elements select = elements1log__front.select("img[src]");
                String src2=null;
    
                String divName= String.valueOf(System.currentTimeMillis());
    
                for(Element element:select){
                    String src=element.attr("abs:src");//获取src的绝对路径
                     src2=element.attr("src");//获取src的绝对路径
               //好像有反爬虫机制 所以加了这个代码
    //             参考          https://www.cnblogs.com/xijieblog/p/4540026.html
                    URL url=new URL(src2);
                    url = new URL(src2);
                    HttpURLConnection connection = (HttpURLConnection) url.
                            openConnection();
                    connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
    
                    InputStream is=url.openStream();
    
                    FileOutputStream fos=new FileOutputStream("D:\\date\\test"+"//"+divName+".png");
    
                    byte[] b=new byte[2048];
                    int count=is.read(b);
                    while(count!=-1) {
                        fos.write(b,0,count);
                        fos.flush();
                        count=is.read(b);
                    }
                    fos.close();
                    is.close();
                }
                }
    
            long t2=System.currentTimeMillis();
            double a=(t2-t1)/1000;
            System.out.println("下载完毕"+"用时:"+a+"s");
        }
    }
    
    展开全文
  • java 爬虫实战

    2021-12-09 17:07:33
    java爬虫详解 1、第一个爬虫实践 所需要的maven依赖 <!--自动进行访问浏览器--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</...

    java爬虫详解

    1、第一个爬虫实践

    所需要的maven依赖

      <!--自动进行访问浏览器-->      
    <dependency>
         <groupId>org.apache.httpcomponents</groupId>
         <artifactId>httpclient</artifactId>
         <version>4.5.2</version>
    </dependency>
    <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-log4j12</artifactId>
         <version>1.7.25</version>
    </dependency>
    
    
    

    相关的日志配置

    log4j.rootLogger=DEBUG,A1
    log4j.logger.cn.itcast = DEBUG
    
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH🇲🇲ss,SSS} [%t] [%c]-[%p] %m%n
    

    第一个Demo(Get无参请求)

    package com.li.test;
    
    
    import org.apache.http.HttpEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    
    public class Demo01 {
        public static void main(String[] args) throws IOException {
            // 1. 打开浏览器, 创建 HttpClient 对象,类似于直接打开浏览器
            CloseableHttpClient httpClient = HttpClients.createDefault();
    
            // 2. 输入网址, 发起get请求创建HttpGet对象
            HttpGet httpGet = new HttpGet("https://www.baidu.com/");
    
            // 3. 按回车, 发起请求, 返回响应,进行相关的页面访问
            CloseableHttpResponse response = httpClient.execute(httpGet);
    
            // 4. 解析响应, 获取数据
            // 判断状态码是否是 200
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity httpEntity = response.getEntity();
                String content = EntityUtils.toString(httpEntity, "utf-8");
                System.out.println(content);
            }
        }
    }
    
    

    在使用老人response以及HttpClients的时候记得进行关闭,顺序先开后关

    Get请求方式进行传参的请求

    package com.li.test;
    
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    import javax.ws.rs.core.UriBuilder;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
    //测试带参的get的请求
    public class DemoGetParam {
        public static void main(String[] args) throws URISyntaxException {
            //打开网页
            CloseableHttpClient aDefault = HttpClients.createDefault();
            //获取url
    //        通过URIBuilder进行创建url
            URIBuilder uriBuilder = new URIBuilder("https://www.zhipin.com/c100010000-p100101/");
    //        设置相关的参数
            URIBuilder uriBuilder1 = uriBuilder.setParameter("ka", "sel-city-100010000");
    //        获取url
            HttpGet httpGet=new HttpGet(uriBuilder1.build());
    //        点击回车进行访问
            try {
    //            获取相关的相应
                CloseableHttpResponse execute = aDefault.execute(httpGet);
                if (execute.getStatusLine().getStatusCode()==200){
                    String utf8 = EntityUtils.toString(execute.getEntity(), "utf8");
                    System.out.println(utf8.length());
                    System.out.println(utf8);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    Post请求进行网站的访问

    package com.li.test;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    import java.io.IOException;
    //post无参请求的业绩
    public class DemoPost {
        public static void main(String[] args) {
            CloseableHttpResponse execute=null;
            //打开浏览器
            CloseableHttpClient aDefault = HttpClients.createDefault();
            //获取url,将获取的方式改成Post
            HttpPost httppsot=new HttpPost("https://xiaoyuan.zhaopin.com");
            try {
                execute = aDefault.execute(httppsot);
                //点击回车进行登录
                if(execute.getStatusLine().getStatusCode() == 200){
                    String utf8 = EntityUtils.toString(execute.getEntity(), "utf8");
                    System.out.println(utf8.length());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    execute.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    aDefault.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    带参数的post的请求

    package com.li.test;
    
    import org.apache.http.NameValuePair;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import java.io.IOException;
    import java.util.ArrayList;
    
    public class DemoPostParam {
        public static void main(String[] args) throws IOException {
            //打开网页
            CloseableHttpClient aDefault = HttpClients.createDefault();
            //获取Url地址
            HttpPost httpPost=new HttpPost("http://yun.itheima.com/search");
            //声明一个list集合,封装post中的表单的数据
            ArrayList<NameValuePair> list=new ArrayList();
             list.add(new BasicNameValuePair("keys", "java"));
            //常见宇哥Entity对象,第一个参数是我们的list,第二个参数是设置的编码的格式
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(list, "utf8");
            //将数据传输到post请求之中
            httpPost.setEntity(formEntity);
            //点击回车进行访问相关的网路,缤纷回去返回值
            CloseableHttpResponse execute = aDefault.execute(httpPost);
            //解析相应
            if (execute.getStatusLine().getStatusCode()==200){
                String utf8 = EntityUtils.toString(execute.getEntity(), "utf8");
                System.out.println(utf8.length());
            }
        }
    }
    
    

    注:在进行post的传参的时候需要定义一个集合对数据进行相关的封装

    2、通过数据池进行管理网站的浏览访问

    package com.li.test;
    
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    
    public class DemoPool {
        public static void main(String[] args) {
            //设置访问的连接池
            PoolingHttpClientConnectionManager pm=new PoolingHttpClientConnectionManager();
            //设置连接池的最大的连接数
            pm.setMaxTotal(100);
            //设置每个主机的最大的连接数,保证在同时访问多个网站的时候使得分配平均
            pm.setDefaultMaxPerRoute(10);
    
            doGet(pm);
            doGet(pm);
        }
    
        private static void doGet(PoolingHttpClientConnectionManager pm) {
            CloseableHttpResponse execute=null;
            //通过数据池打开网页
            CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
            //进行get访问获取url
            HttpGet httpGet=new HttpGet("https://www.zhipin.com/");
    
            try {
                //点击回车进行网站的访问
                execute = aDefault.execute(httpGet);
                //对获取的相应进行相应解析
                String utf8 = EntityUtils.toString(execute.getEntity(), "utf8");
                System.out.println(utf8.length());
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if (execute!=null){
                    try {
                        execute.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                
            }
        }
    }
    
    
    

    在使用数据池控制访问网站的时候,执行完成之后只需将网站的回应进行关闭便可,不能关闭aDefault

    2.1、在进行爬虫数据读取的时候,所需要设置的参数

    时间参数的原因

    有些网站会因为一些外部的原因,但是访问的速度比较的慢,如果在规定的时间中我们没有爬取到自己想要的数据便会导致程序的报错,因此,需要设置一些实践来进行相关的设定。

    package com.li.test;
    
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.Configurable;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    
    public class DemoPool {
        public static void main(String[] args) {
            //设置访问的连接池
            PoolingHttpClientConnectionManager pm=new PoolingHttpClientConnectionManager();
            //设置连接池的最大的连接数
            pm.setMaxTotal(100);
            //设置每个主机的最大的连接数,保证在同时访问多个网站的时候使得分配平均
            pm.setDefaultMaxPerRoute(10);
            doGet(pm);
            doGet(pm);
        }
    
        private static void doGet(PoolingHttpClientConnectionManager pm) {
            CloseableHttpResponse execute=null;
            //打开网页
            CloseableHttpClient aDefault = HttpClients.createDefault();
            //进行get访问获取url
            HttpGet httpGet=new HttpGet("https://www.zhipin.com/");
            //配置请求信息
            RequestConfig config=RequestConfig.custom().setConnectTimeout(1000) //创建连接的最长的时间,单位是毫秒
            .setConnectionRequestTimeout(500) //设置获取连接的最长的时间,单位是毫秒
            .setSocketTimeout(5*1000)  //设置数据传输的最长的时间,单位是毫秒
                    .build();
            //对访问呢浏览器设置一定的访问时间
            httpGet.setConfig(config);
            try {
                //点击回车进行网站的访问
                execute = aDefault.execute(httpGet);
                //对获取的相应进行相应解析
                String utf8 = EntityUtils.toString(execute.getEntity(), "utf8");
                System.out.println(utf8.length());
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if (execute!=null){
                    try {
                        execute.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
            }
        }
    }
    
    

    3、 Jsoup

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

    jsoup的主要功能如下:

    1. 从一个URL,文件或字符串中解析HTML;
    2. 使用DOM或CSS选择器来查找、取出数据;
    3. 可操作HTML元素、属性、文本;( Jsoup一般用于解析爬到的数据并存储, 很少用到操作 )

    Jsoup所需要的maven依赖

     <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.8.3</version>
     </dependency>
    <!--        直接测试的依赖-->
     <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
     </dependency>
    <!--        对文件进行操作的依赖-->
     <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
     </dependency>
    <!--        对字符串的处理-->
     <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
     </dependency>
    

    3.1、jsoup解析URL

    package com.li.Jsoup;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    
    import java.io.IOException;
    import java.net.URL;
    
    public class JsoupTest {
        public static void main(String[] args) {
            //通过jsoup中的parse进行解析url,其第一个参数表示的是一个url,第二个参数表示的是是个连接的超时的时间,单位是毫秒
            try {
                //进行相关的解析获取一个DOM对象
                Document parse = Jsoup.parse(new URL("http://www.baidu.com"), 1000);
                //使用标签选择器获取其中的内容,表示获取第一个title中内容
                String title = parse.getElementsByTag("title").first().text();
                System.out.println(title);
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    

    3.2、Jsoup解析字符串

    package com.li.Jsoup;
    
    import org.apache.commons.io.FileUtils;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    
    import java.io.File;
    import java.io.IOException;
    
    
    //通过Jsoup进行字符串的解析
    public class JsoupString {
        public static void main(String[] args) throws IOException {
            //表示通过org.apache.commons.io.FileUtils;进行文件的读取
            String utf8 = FileUtils.readFileToString(new File("D:\\Web\\SdmuDemo\\Frist.html"), "utf8");
            //进行相关字符串的赌气
            Document parse = Jsoup.parse(utf8);
            //表示解析之后获取里面title中的内容
            String title = parse.getElementsByTag("title").first().text();
            System.out.println(title);
    
        }
    }
    
    

    3.3、Jsoup对文件进行解析

    package com.li.Jsoup;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    
    import java.io.File;
    import java.io.IOException;
    
    //通过Jsoup对文件进行相关的解析
    public class JsoupFile {
        public static void main(String[] args) throws IOException {
            //Jsoup对文件进行相应的解析的时候,第一个参数值得填写的是文件,第二个参数指的是文件的编码的格式
            Document utf8 = Jsoup.parse(new File("D:\\Web\\SdmuDemo\\Frist.html"), "utf8");
            //对文件的内容进行获取并解析
            String title = utf8.getElementsByTag("title").first().text();
            System.out.println(title);
        }
    }
    

    3.4、使用DOM的方式进行解析文档

     // 解析文件件, 获取Document对象
            Document doc = Jsoup.parse(new File("D:\\360MoveData\\Users\\Administrator\\Desktop\\test.html"), "utf8");
            // 1.根据id查询元素getElementById
            Element element = doc.getElementById("city_bj");
            // 2.根据标签获取元素getElementsByTag
            Elements spans = doc.getElementsByTag("span");
            // 3.根据class获取元素getElementsByClass
            Element a = doc.getElementsByClass("class_a class_b").first();
            // 4.根据属性获取元素getElementsByAttribute
            Element abc = doc.getElementsByAttribute("abc").first();
            // 5.根据属性与属性值筛选
            Element href = doc.getElementsByAttributeValue("href", "http://sh.itcast.cn").first();
    
            // 打印元素内容
            System.out.println("获取到的元素内容是: " + element.text());
            for (Element span : spans) {
                System.out.println(span.text());
            }
            System.out.println(a.text());
            System.out.println("abc.text() = " + abc.text());
            System.out.println("href.text() = " + href.text());
    

    3.5、在元素中获取属性的值

    package com.li.Jsoup;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Attributes;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.Set;
    
    //通过Jsoup获取其中的元素的数据
    public class JsoupDome {
        public static void main(String[] args) throws IOException {
            //读取文件获取document对象
            Document utf8 = Jsoup.parse(new File("C:\\Users\\dell\\Desktop\\新建文本文档.html"), "utf8");
            //根据id获取DOm
            Element test = utf8.getElementById("test");
            //获取你Dom对象的id
            String id = test.id();
            System.out.println("对象的id是=》"+id);
            //获取Dom的class中的内容
            String s = test.className();
            System.out.println("获取的class的内容是=》"+s);
            //当所获取的class标签值有多个的时候,可以通过classNames()方法进行获取并返回一个集合
            Set<String> strings = test.classNames();
            for (String string : strings) {
                System.out.println("获取的class的内容是=》"+string);
            }
            //获取所有属性的值
            Attributes attributes = test.attributes();
            System.out.println("相关元素中的所有的属性的值是=》"+attributes.toString());
            //获取指定属性的值
            String id1 = test.attr("id");
            System.out.println("获取指定的属性值的内容是=》"+id1);
    
        }
    }
    
    

    3.6、通过Selector选择器组合使用

    package com.li.Jsoup;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    import java.io.File;
    import java.io.IOException;
    
    //通过选择器进行相关内容的获取
    public class JsoupSeletor {
        public static void main(String[] args) throws IOException {
            Document utf8 = Jsoup.parse(new File("C:\\Users\\dell\\Desktop\\新建文本文档.html"), "utf8");
            //通过普通标签进行相关内容的获取
            Elements span = utf8.select("span");
            for (Element element : span) {
                System.out.println("通过span标签进行相关内容获取=》"+element.text());
            }
            //通过id进行相关内容获取,注:当通过id进行相关内容获取的时候,在进行选择的时候需要添加#
            Elements select = utf8.select("#test");
            System.out.println("通过id进行获取到的内容是=》"+select.text());
            //通过class进行相关内容的获取,注:在通过class进行相关内容获取的时候需要添加.
            Elements select1 = utf8.select(".class_a");
            System.out.println("通过class获取到的内容是=》"+select1.text());
            //通过自定义的属性进行相关数据的获取,注:在通过自定义的属性尽心相关内容获取的时候注意添加[]
            Elements select2 = utf8.select("[abc]");
            System.out.println("通过自定义的属性进行获取到的内容是=》"+select2.text());
            //通过指定属性与属性值进行相关内容的获取
            Elements select3 = utf8.select("[class=class_a class_b]");
            System.out.println("通过指定属性与属性值获取到的内容是=》"+select3.text());
    
    
        }
    }
    

    在进行指定属性与属性值进行相应数据获取的时候,要把属性的属性值写全,例如当有一个class标签有多个属性值的时候,要把所有的属性值都写上,不然无法进行相关的读取

    3.7、Selector选择器的组合使用

    image-20211203154809406

    4、webMagic介绍(一款爬虫的框架)

    设计的目标:尽量的模块化,体现爬虫的特点

    4.1、简介

    //通过自定义的属性进行相关数据的获取,注:在通过自定义的属性尽心相关内容获取的时候注意添加[]
    Elements select2 = utf8.select("[abc]");
    System.out.println(“通过自定义的属性进行获取到的内容是=》”+select2.text());
    //通过指定属性与属性值进行相关内容的获取
    Elements select3 = utf8.select("[class=class_a class_b]");
    System.out.println(“通过指定属性与属性值获取到的内容是=》”+select3.text());

    }
    

    }

    
    **在进行指定属性与属性值进行相应数据获取的时候,要把属性的属性值写全,例如当有一个class标签有多个属性值的时候,要把所有的属性值都写上,不然无法进行相关的读取**
    
    ### 3.7、Selector选择器的组合使用
    
    [外链图片转存中...(img-TVrHc5j8-1639040841111)]
    
    ## 4、webMagic介绍(一款爬虫的框架)
    
    设计的目标:尽量的模块化,体现爬虫的特点
    
    ### 4.1、简介
    
    
    展开全文
  • Java爬虫(二)Java爬虫框架

    千次阅读 2021-03-01 09:35:05
    关于本文:之前写了个Java爬虫(一),拖更了很久,今天终于想着补上Java爬虫二了,今天就粗略水一期,给大家介绍一个比较完善的Java爬虫——WebMagic,而且它的文档写的也很详细,上手非常容易。——野狗菌【希望你能...

    关于本文:

    之前写了个Java爬虫(一),拖更了很久,今天终于想着补上Java爬虫二了,今天就粗略水一期,给大家介绍一个比较完善的Java爬虫——WebMagic,而且它的文档写的也很详细,上手非常容易。

    ——野狗菌【希望你能喜欢】

    http://webmagic.io/

    http://webmagic.io/docs/zh/

    这个文档写的十分详细,简单易上手。

    在这个框架里,我比较喜欢的是:

    一、使用Selectable抽取元素

    Selectable相关的抽取元素链式API是WebMagic的一个核心功能。使用Selectable接口,你可以直接完成页面元素的链式抽取,也无需去关心抽取的细节。

    在刚才的例子中可以看到,page.getHtml()返回的是一个Html对象,它实现了Selectable接口。这个接口包含一些重要的方法,我将它分为两类:抽取部分和获取结果部分。

    ec5a6824e2b5cfc3b2bd643b1523e84a.png

    这样在我们想要抓取指定数据时,更加的方便快捷,而无需过多的关心细节问题;

    二、使用Pipeline保存结果

    好了,爬虫编写完成,现在我们可能还有一个问题:我如果想把抓取的结果保存下来,要怎么做呢?WebMagic用于保存结果的组件叫做Pipeline。例如我们通过“控制台输出结果”这件事也是通过一个内置的Pipeline完成的,它叫做ConsolePipeline。那么,我现在想要把结果用Json的格式保存下来,怎么做呢?我只需要将Pipeline的实现换成"JsonFilePipeline"就可以了。

    public static void main(String[] args){

    Spider.create(new GithubRepoPageProcessor())

    //从"https://github.com/code4craft"开始抓

    .addUrl("https://github.com/code4craft")

    .addPipeline(new JsonFilePipeline("D:\\webmagic\\"))

    //开启5个线程抓取

    .thread(5)

    //启动爬虫

    .run();

    }

    这样子下载下来的文件就会保存在D盘的webmagic目录中了;

    三、抓取前端渲染的页面

    爬虫抓取被渲染过的页面源码和我们在浏览器开发者模式里看的源码往往不一样,所以会导致我们抓不到想要的渲染后的页面。

    WebMagic提供两种办法:

    一、利用Selenium,我试过这个,当使用这个的时候,你的电脑会打开浏览器(看你下载的是哪一款驱动),然后执行相应操作(ps:Selenium大家也可以多研究研究,我感觉这个的用途也很广,模拟人的操作使用浏览器,可以用它做一些简单枯燥的重复动作,但是我感觉这个的执行效率比较低);

    二、手动构造URL,直接得到JSON数据(具体可以看WebMagic的文档)

    http://webmagic.io/docs/zh/posts/chx-cases/js-render-page.html

    写在后面:

    WebMagic还有很多功能,大家可以自行阅读它的文档,简单易上手。如果你会用这个框架了,你将是一个灵活的爬虫哈哈哈哈哈~~~~~

    这这里我就不写Demo放上来了,如果大家有不懂的,或者想和我交流学习的,可以私聊我,我会尽我所能的帮助大家,也会和大家交流学习的。

    展开全文
  • 入门之JAVA爬虫

    2021-02-26 15:42:38
    二:写java爬虫需要具备什么基础知识?jdbc:操作数据库。ehcache(redis):重复url判断。log4j:日志记录。httpclient:发送http请求。jsoup:解析返回的网页内容。三:举个例子博客园首页爬取 地址:博客园 - 代码...

    一:什么是爬虫?爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

    二:写java爬虫需要具备什么基础知识?jdbc:操作数据库。

    ehcache(redis):重复url判断。

    log4j:日志记录。

    httpclient:发送http请求。

    jsoup:解析返回的网页内容。

    三:举个例子博客园首页爬取 地址:博客园 - 代码改变世界。

    项目结构

    pom.xml:项目maven依赖

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    4.0.0

    com.inossem

    BlogSpider

    0.0.1-SNAPSHOT

    mysql

    mysql-connector-java

    5.1.37

    org.apache.httpcomponents

    httpclient

    4.5.2

    org.jsoup

    jsoup

    1.10.1

    log4j

    log4j

    1.2.16

    net.sf.ehcache

    ehcache

    2.10.3

    commons-io

    commons-io

    2.5

    log4j.rootLogger=INFO, stdout,D

    #Console

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    log4j.appender.stdout.Target = System.out

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

    #D

    log4j.appender.D = org.apache.log4j.RollingFileAppender

    log4j.appender.D.File = D://bloglogs/log.log

    log4j.appender.D.MaxFileSize=100KB

    log4j.appender.D.MaxBackupIndex=100

    log4j.appender.D.Append = true

    log4j.appender.D.layout = org.apache.log4j.PatternLayout

    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

    ehcache.xml:缓存相关

    maxElementsInMemory="1"

    eternal="true"

    overflowToDisk="true"/>

    name="cnblog"

    maxElementsInMemory="1"

    diskPersistent="true"

    eternal="true"

    overflowToDisk="true"/>

    dbUrl=jdbc:mysql://localhost:3306/db_blogs?autoReconnect=true

    dbUserName=root

    dbPassword=root

    jdbcName=com.mysql.jdbc.Driver

    cacheFilePath=D://ehcache//ehcache.xml

    imageFilePath=D://blogImages/

    imagePath=http://localhost:8080/BlogCms/static/blogmIages/

    DateUtil.java: 获取日期工具类

    package com.inossem.blog.util;

    import java.text.SimpleDateFormat;

    import java.util.Date;

    /**

    * 日期工具类

    * @author user

    *

    */

    public class DateUtil {

    /**

    * 获取当前年月日路径

    * @return

    * @throws Exception

    */

    public static String getCurrentDatePath()throws Exception{

    Date date=new Date();

    SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");

    return sdf.format(date);

    }

    public static void main(String[] args) {

    try {

    System.out.println(getCurrentDatePath());

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    DbUtil.java: 数据库操作工具类

    package com.inossem.blog.util;

    import java.sql.Connection;

    import java.sql.DriverManager;

    /**

    * 数据库工具类

    * @author user

    *

    */

    public class DbUtil {

    /**

    * 获取连接

    * @return

    * @throws Exception

    */

    public Connection getCon()throws Exception{

    Class.forName(PropertiesUtil.getValue("jdbcName"));

    Connection con=DriverManager.getConnection(PropertiesUtil.getValue("dbUrl"), PropertiesUtil.getValue("dbUserName"), PropertiesUtil.getValue("dbPassword"));

    return con;

    }

    /**

    * 关闭连接

    * @param con

    * @throws Exception

    */

    public void closeCon(Connection con)throws Exception{

    if(con!=null){

    con.close();

    }

    }

    public static void main(String[] args) {

    DbUtil dbUtil=new DbUtil();

    try {

    dbUtil.getCon();

    System.out.println("数据库连接成功");

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    System.out.println("数据库连接失败");

    }

    }

    }

    PropertiesUtil.java: 获取配置文件信息工具类

    package com.inossem.blog.util;

    import java.io.*;

    import java.util.Properties;

    /**

    * properties工具类

    * @author user

    *

    */

    public class PropertiesUtil {

    /**

    * 根据key获取value值

    * @param key

    * @return

    */

    public static String getValue(String key){

    Properties prop=new Properties();

    try {

    InputStream in = new FileInputStream("src/main/resources/spider.properties");

    prop.load(in);

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    return prop.getProperty(key);

    }

    public static void main(String[] args) {

    System.out.println(getValue("imageFilePath"));

    }

    }

    CnBlogSpider.java: 爬虫

    package com.inossem.blog.spider;

    import com.inossem.blog.util.DateUtil;

    import com.inossem.blog.util.DbUtil;

    import com.inossem.blog.util.PropertiesUtil;

    import net.sf.ehcache.Cache;

    import net.sf.ehcache.CacheManager;

    import net.sf.ehcache.Status;

    import org.apache.commons.io.FileUtils;

    import org.apache.http.HttpEntity;

    import org.apache.http.ParseException;

    import org.apache.http.client.ClientProtocolException;

    import org.apache.http.client.config.RequestConfig;

    import org.apache.http.client.methods.CloseableHttpResponse;

    import org.apache.http.client.methods.HttpGet;

    import org.apache.http.impl.client.CloseableHttpClient;

    import org.apache.http.impl.client.HttpClients;

    import org.apache.http.util.EntityUtils;

    import org.apache.log4j.Logger;

    import org.jsoup.Jsoup;

    import org.jsoup.nodes.Document;

    import org.jsoup.nodes.Element;

    import org.jsoup.select.Elements;

    import java.io.File;

    import java.io.IOException;

    import java.io.InputStream;

    import java.sql.Connection;

    import java.sql.PreparedStatement;

    import java.sql.SQLException;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import java.util.UUID;

    public class CnBlogSpider {

    private static Logger logger = Logger.getLogger(CnBlogSpider.class);

    private static final String URL = "http://www.cnblogs.com/";

    private static Connection con = null;

    private static CacheManager manager = null; // cache管理器

    private static Cache cache = null; // cache缓存对象

    /**

    * 解析主页

    */

    private static void parseHomePage() {

    logger.info("开始爬取" + URL + "网页");

    manager = CacheManager.create(PropertiesUtil.getValue("cacheFilePath"));

    cache = manager.getCache("cnblog");

    CloseableHttpClient httpClient = HttpClients.createDefault(); // 获取HttpClient实例

    HttpGet httpget = new HttpGet(URL); // 创建httpget实例

    RequestConfig config = RequestConfig.custom().setSocketTimeout(100000) // 设置读取超时时间

    .setConnectTimeout(5000) // 设置连接超时时间

    .build();

    httpget.setConfig(config);

    CloseableHttpResponse response = null;

    try {

    response = httpClient.execute(httpget);

    } catch (ClientProtocolException e) {

    logger.error(URL + "-ClientProtocolException", e);

    } catch (IOException e) {

    logger.error(URL + "-IOException", e);

    }

    if (response != null) {

    HttpEntity entity = response.getEntity(); // 获取返回实体

    // 判断返回状态是否为200

    if (response.getStatusLine().getStatusCode() == 200) {

    String webPageContent = null;

    try {

    webPageContent = EntityUtils.toString(entity, "utf-8");

    parseHomeWebPage(webPageContent);

    } catch (ParseException e) {

    logger.error(URL + "-ParseException", e);

    } catch (IOException e) {

    logger.error(URL + "-IOException", e);

    }

    } else {

    logger.error(URL + "-返回状态非200");

    }

    } else {

    logger.error(URL + "-连接超时");

    }

    try {

    if (response != null) {

    response.close();

    }

    if (httpClient != null) {

    httpClient.close();

    }

    } catch (Exception e) {

    logger.error(URL + "Exception", e);

    }

    if (cache.getStatus() == Status.STATUS_ALIVE) {

    cache.flush(); // 把缓存写入文件

    }

    manager.shutdown();

    logger.info("结束爬取" + URL + "网页");

    }

    /**

    * 解析首页内容 提取博客link

    *

    * @param webPageContent

    */

    private static void parseHomeWebPage(String webPageContent) {

    if ("".equals(webPageContent)) {

    return;

    }

    Document doc = Jsoup.parse(webPageContent);

    Elements links = doc.select("#post_list .post_item .post_item_body h3 a");

    for (int i = 0; i < links.size(); i++) {

    Element link = links.get(i);

    String url = link.attr("href");

    System.out.println(url);

    if (cache.get(url) != null) { // 如果缓存中存在就不插入

    logger.info(url + "-缓存中存在");

    continue;

    }

    parseBlogLink(url);

    }

    }

    /**

    * 解析博客链接地址 获取博客内容

    *

    * @param link

    */

    private static void parseBlogLink(String link) {

    logger.info("开始爬取" + link + "网页");

    CloseableHttpClient httpClient = HttpClients.createDefault(); // 获取HttpClient实例

    HttpGet httpget = new HttpGet(link); // 创建httpget实例

    RequestConfig config = RequestConfig.custom().setSocketTimeout(100000) // 设置读取超时时间

    .setConnectTimeout(5000) // 设置连接超时时间

    .build();

    httpget.setConfig(config);

    CloseableHttpResponse response = null;

    try {

    response = httpClient.execute(httpget);

    } catch (ClientProtocolException e) {

    logger.error(URL + "-ClientProtocolException", e);

    } catch (IOException e) {

    logger.error(URL + "-IOException", e);

    }

    if (response != null) {

    HttpEntity entity = response.getEntity(); // 获取返回实体

    // 判断返回状态是否为200

    if (response.getStatusLine().getStatusCode() == 200) {

    String blogContent = null;

    try {

    blogContent = EntityUtils.toString(entity, "utf-8");

    parseBlogPage(blogContent, link);

    } catch (ParseException e) {

    logger.error(URL + "-ParseException", e);

    } catch (IOException e) {

    logger.error(URL + "-IOException", e);

    }

    } else {

    logger.error(URL + "-返回状态非200");

    }

    } else {

    logger.error(URL + "-连接超时");

    }

    try {

    if (response != null) {

    response.close();

    }

    if (httpClient != null) {

    httpClient.close();

    }

    } catch (Exception e) {

    logger.error(URL + "Exception", e);

    }

    logger.info("结束爬取" + link + "网页");

    }

    /**

    * 解析博客内容,提取有效信息

    *

    * @param blogContent

    * @param link

    */

    private static void parseBlogPage(String blogContent, String link) {

    if ("".equals(blogContent)) {

    return;

    }

    Document doc = Jsoup.parse(blogContent);

    Elements titleElements = doc.select("#cb_post_title_url"); // 获取博客标题

    if (titleElements.size() == 0) {

    logger.error(link + "-未获取到博客标题");

    return;

    }

    String title = titleElements.get(0).text();

    System.out.println("博客标题:" + title);

    Elements contentElements = doc.select("#cnblogs_post_body"); // 获取博客内容

    if (contentElements.size() == 0) {

    logger.error(link + "-未获取到博客内容");

    return;

    }

    String content = contentElements.get(0).html();

    System.out.println("博客内容:" + content);

    /**

    * 处理图片内容

    */

    // Elements imgElements = contentElements.select("img"); // 获取所有图片元素

    // List imgUrlList = new LinkedList();

    // for (int i = 0; i < imgElements.size(); i++) {

    // Element imgEle = imgElements.get(i);

    // String url = imgEle.attr("src");

    // imgUrlList.add(url);

    // System.out.println(url);

    // }

    //

    // if (imgUrlList.size() > 0) {

    // Map replaceImgMap = downLoadImages(imgUrlList);

    // String newContent = replaceWebPageImages(content, replaceImgMap);

    // content = newContent;

    // }

    // 插入数据库

    String sql = "insert into t_article values(null,?,?,?,now())";

    try {

    PreparedStatement pstmt = con.prepareStatement(sql);

    pstmt.setString(1, title);

    pstmt.setString(2, content);

    pstmt.setString(3, link);

    if (pstmt.executeUpdate() == 1) {

    logger.info(link + "-成功插入数据库");

    cache.put(new net.sf.ehcache.Element(link, link));

    logger.info(link + "-已加入缓存");

    } else {

    logger.info(link + "-插入数据库失败");

    }

    } catch (SQLException e) {

    logger.error("SQLException", e);

    }

    }

    /**

    * 把原来的网页图片地址换成本地新的

    *

    * @param content

    * @param replaceImgMap

    * @return

    */

    private static String replaceWebPageImages(String content, Map replaceImgMap) {

    for (String url : replaceImgMap.keySet()) {

    String newPath = replaceImgMap.get(url);

    content = content.replace(url, newPath);

    }

    return content;

    }

    /**

    * 下载图片到本地

    *

    * @param imgUrlList

    * @return

    */

    private static Map downLoadImages(List imgUrlList) {

    Map replaceImgMap = new HashMap();

    RequestConfig config = RequestConfig.custom().setSocketTimeout(10000) // 设置读取超时时间

    .setConnectTimeout(5000) // 设置连接超时时间

    .build();

    CloseableHttpClient httpClient = HttpClients.createDefault(); // 获取HttpClient实例

    for (int i = 0; i < imgUrlList.size(); i++) {

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    String url = imgUrlList.get(i);

    logger.info("开始爬取" + url + "图片");

    CloseableHttpResponse response = null;

    try {

    HttpGet httpget = new HttpGet(url); // 创建httpget实例

    httpget.setConfig(config);

    response = httpClient.execute(httpget);

    } catch (ClientProtocolException e) {

    logger.error(url + "-ClientProtocolException");

    } catch (IOException e) {

    logger.error(url + "-IOException");

    }

    if (response != null) {

    HttpEntity entity = response.getEntity(); // 获取返回实体

    // 判断返回状态是否为200

    if (response.getStatusLine().getStatusCode() == 200) {

    try {

    InputStream inputStream = entity.getContent();

    String imageType = entity.getContentType().getValue();

    String urlB = imageType.split("/")[1];

    String uuid = UUID.randomUUID().toString();

    String currentDatePath = DateUtil.getCurrentDatePath();

    String newPath = PropertiesUtil.getValue("imagePath") + currentDatePath + "/" + uuid + "." + urlB;

    FileUtils.copyToFile(inputStream, new File(PropertiesUtil.getValue("imageFilePath") + currentDatePath + "/" + uuid + "." + urlB));

    replaceImgMap.put(url, newPath);

    } catch (UnsupportedOperationException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    } catch (Exception e) {

    e.printStackTrace();

    }

    } else {

    logger.error("返回状态非200");

    }

    } else {

    logger.error("连接超时");

    }

    try {

    if (response != null) {

    response.close();

    }

    } catch (Exception e) {

    logger.error("Exception", e);

    }

    logger.info("结束爬取" + url + "图片");

    }

    return replaceImgMap;

    }

    public static void start() {

    DbUtil dbUtil = new DbUtil();

    try {

    con = dbUtil.getCon();

    } catch (Exception e) {

    logger.error("创建数据库连接失败", e);

    }

    parseHomePage();

    }

    public static void main(String[] args) {

    start();

    }

    }

    DownLoadImageTest.java: 下载图片测试类

    package com.inossem.blog.spider;

    import java.io.File;

    import java.io.IOException;

    import java.io.InputStream;

    import java.util.UUID;

    import org.apache.commons.io.FileUtils;

    import org.apache.http.HttpEntity;

    import org.apache.http.client.ClientProtocolException;

    import org.apache.http.client.config.RequestConfig;

    import org.apache.http.client.methods.CloseableHttpResponse;

    import org.apache.http.client.methods.HttpGet;

    import org.apache.http.impl.client.CloseableHttpClient;

    import org.apache.http.impl.client.HttpClients;

    import org.apache.log4j.Logger;

    import com.inossem.blog.util.DateUtil;

    import com.inossem.blog.util.PropertiesUtil;

    public class DownLoadImageTest {

    private static Logger logger=Logger.getLogger(DownLoadImageTest.class);

    private static final String link="http://images2015.cnblogs.com/blog/952033/201705/952033-20170511210141910-342481715.png";

    public static void main(String[] args) {

    logger.info("开始爬取"+link+"图片");

    CloseableHttpClient httpClient=HttpClients.createDefault(); // 获取HttpClient实例

    HttpGet httpget=new HttpGet(link); // 创建httpget实例

    RequestConfig config=RequestConfig.custom().setSocketTimeout(10000) // 设置读取超时时间

    .setConnectTimeout(5000) // 设置连接超时时间

    .build();

    httpget.setConfig(config);

    CloseableHttpResponse response=null;

    try {

    response=httpClient.execute(httpget);

    } catch (ClientProtocolException e) {

    logger.error("ClientProtocolException",e);

    } catch (IOException e) {

    logger.error("IOException",e);

    }

    if(response!=null){

    HttpEntity entity=response.getEntity(); // 获取返回实体

    // 判断返回状态是否为200

    if(response.getStatusLine().getStatusCode()==200){

    try {

    InputStream inputStream=entity.getContent();

    String imageType=entity.getContentType().getValue();

    String urlB=imageType.split("/")[1];

    String uuid=UUID.randomUUID().toString();

    FileUtils.copyToFile(inputStream, new File(PropertiesUtil.getValue("imageFilePath")+DateUtil.getCurrentDatePath()+"/"+uuid+"."+urlB));

    } catch (UnsupportedOperationException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }else{

    logger.error("返回状态非200");

    }

    }else{

    logger.error("连接超时");

    }

    try{

    if(response!=null){

    response.close();

    }

    if(httpClient!=null){

    httpClient.close();

    }

    }catch(Exception e){

    logger.error("Exception", e);

    }

    logger.info("结束爬取"+link+"图片");

    }

    }

    创建数据库脚本:

    CREATE DATABASE db_blogs;

    SET FOREIGN_KEY_CHECKS=0;

    -- ----------------------------

    -- Table structure for t_article

    -- ----------------------------

    DROP TABLE IF EXISTS `t_article`;

    CREATE TABLE `t_article` (

    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键id',

    `title` varchar(200) DEFAULT NULL COMMENT '博客标题',

    `content` longtext COMMENT '博客正文内容',

    `orUrl` varchar(1000) DEFAULT NULL COMMENT '源博客地址',

    `crawlerDate` datetime DEFAULT NULL COMMENT '爬虫博客日期',

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;

    在D:\ehcache 下创建ehcache.xml

    运行CnBlogSpider.java

    打开数据库查看数据并选择一条数据

    我们选取 标题:【机器学习】算法原理详细推导与实现(一):线性回归的博客内容。

    创建txt文档:博客内容.txt

    复制内容到博客内容.txt中,并修改文件名称为博客内容.html

    打开html部分截图如下:

    这样就爬取成功了,大功告成!!!

    四:推荐

    今天跟大家分享的java爬虫是入门级别的,深入一些推荐大家一个网站:webmagic:WebMagic

    最后感谢大家参加本人的分享,日后会吸取大家共同交流的经验。希望大家共同努力,共同进步。

    展开全文
  • Java爬虫中怎么爬取需要登录的网站发布时间:2021-02-02 14:36:43来源:亿速云阅读:80作者:小新这篇文章主要介绍Java爬虫中怎么爬取需要登录的网站,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们...
  • Java爬虫 获取中国天气网7日天气预报前言工具准备爬取数据获取日期和星期获取天气描述获取温度范围获取风向及风力完整代码引用 前言 项目需要获取7日天气预报,免费好用的接口寻觅不到,搜索一番后发现用简单的爬虫...
  • Java爬虫爬取图片实战

    2021-02-12 11:51:01
    虽然Python是爬虫利器,但是用Java试着做一个爬虫也可以实战一下自己的很多知识,比如正则表达式,nio2的文件读写,接口解析等等。总之好处多多。总共分为四步:1. 解析接口2. 获取数据3. 数据清洗(就是获取自己想要...
  • java爬虫与python爬虫的对比:python做爬虫语法更简单,代码更简洁。java的语法比python严格,而且代码也更复杂示例如下:url请求:java版的代码如下:public String call (String url){String content = "";...
  • 手把手教你运用JAVA爬虫技术爬取小说欢迎来到JAVA爬虫教学前言一、JAVA爬虫是什么?二、安装Maven2.1 Maven的下载2.2 Maven的配置三、Maven项目的创建3.1Maven项目创建3.2Maven项目配置四、运用JAVA爬虫爬取网页小说...
  • java爬虫框架的使用

    2021-03-01 09:35:10
    原标题:java爬虫框架的使用 随着互联网的发展,编程程序语言也开始被越来越多的人所掌握,但是自始至终,java语言一直是被使用范围最广的编程语言。今天,武汉中软国际主要给大家讲解的是java语言中的爬虫java框架...
  • JAVA爬虫–编写第一个网络爬虫程序前言上一章节介绍了XPATH基础语法,本章节将手把手带大家编写第一个爬虫程序,同时也希望能通过这个爬虫程序,帮助大家熟悉上一章节学习的XPATH基础语法并运用到实战中来。...
  • Java爬虫总结

    2021-03-10 00:22:19
    网络爬虫总结爬虫准备JDK 1.7Eclipse(或STS)httpclient 4.3以上版本jsoup(html解析器)Chrome(带有开发者工具的浏览器)请求分析对爬虫网站进行请求分析。主要获取请求头、cookie和请求对应的URL。对于无法直接获取...
  • java爬虫

    2021-03-01 09:33:35
    答:JDK是java开发时所需环境,它包含了Java开发时需要用到的API,JRE是Java的运行时环境,JDK包含了JRE,他们是包含关系 Java有哪几种基本数据类型? 答:8种,分别是int、byte、sh ... » smart-rick 2021-02-14 ...
  • 使用jsoup工具可以解析某个URL地址、HTML文本内容,是java爬虫很好的优势,也是我们在网络爬虫不可缺少的工具。本文小编带领大家使用jsoup 实现java爬虫模拟登陆,通过省力的API,很好的实现java爬虫模拟登陆。一、...
  • JAVA爬虫

    2021-06-08 14:15:07
    使用JAVA下载一个网站上的200张图片 import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.FileOutputStream; import ...
  • java爬虫简单示例

    2021-02-12 12:19:10
    此文是为方便有一定基础的小白看的java爬虫流程,欢迎指正!一、流程图二、根据流程写程序(以抓取天津市卫生厅数据(通知、公告、新闻)为例)1.目录结构2.主函数截图13.如何定位到自己需要的信息附上jsoup中文文档...
  • java爬虫和python爬虫哪个好

    千次阅读 2021-03-01 09:34:25
    python优点:1.各种爬虫框架,方便高效的下载网页;2.多线程、进程模型成熟稳定,爬虫是一个典型的多任务处理场景,请求页面时会有较长的延迟,总体来说更多的是等待。多线程或进程会更优化程序...java 和 c++ :相...
  • java爬虫入门

    2021-02-26 14:08:13
    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。...
  • 目的:通过网络爬虫爬取中国最小粒度的区域维度信息,包括省(Province) 、市(City)、县(County)、镇(town)、村委会(village)主网站链接:主要jar包:之前一节我们说过java爬虫从网络上利用jsoup获取网页文本,也就是...
  • Java 爬虫

    2021-03-09 10:12:59
    Java 爬虫 一、Jsoup 1. 爬取本地HTML文件 用Jsoup读取本地HTML文件需要File类打开相应文件并用Jsoup.parse()方法进行文件与DOM对象的转换 File desktopDirFile =FileSystemView.getFileSystemView()....
  • 2021年Java爬虫技术教程(一小时实现)

    千次阅读 2021-03-14 21:06:37
    Java爬虫开发 前言 python优点: 1.各种爬虫框架,方便高效的下载网页; 2.多线程、进程模型成熟稳定,爬虫是一个典型的多任务处理场景,请求页面时会有较长的延迟,总体来说更多的是等待。多线程或进程会更优化程序...
  • Java爬虫开发案例

    2021-03-01 09:34:36
    某新闻网站爬虫开发实战1、需求说明1.1、基本情况说明1.2、需求分析1.3、功能分析1、 需求说明1.1、基本情况说明网站类型:新闻(自媒体)通过高质量的文章或者新闻获取更多的用户,从构建商业模式爬虫爬取的范围:...
  • java爬虫简单实例

    2021-02-27 14:52:37
    爬虫的实质就是打开网页源代码进行匹配查找,然后获取查找到的结果。/** 获取* 将正则规则进行对象的封装。* Pattern p = Pattern.compile("a*b");* //通过正则对象的matcher方法字符串相关联。获取要对字符串操作的...
  • java爬虫简单实现

    千次阅读 2021-03-05 22:45:56
    import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.nio.charset.Charset;im...
  • java爬虫与python爬虫谁更强?

    千次阅读 2021-02-04 11:17:45
    java爬虫与python爬虫的对比: python做爬虫语法更简单,代码更简洁。java的语法比python严格,而且代码也更复杂 示例如下: url请求: java版的代码如下: public String call (String url){ String ...
  • java爬虫需要的jar包

    2021-03-16 00:30:43
    【实例简介】java爬虫需要的jar包。httpclient,jsoup等等。直接导入项目使用java爬虫需要的jar包。httpclient,jsoup等等。直接导入项目使用java爬虫需要的jar包。httpclient,jsoup等等。直接导入项目使用java爬虫...
  • java爬虫 案例

    2021-03-03 23:32:23
    importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLConnection;importjava.util.ArrayList;import...
  • 介绍刚学到了一种超实用的java爬虫技术htmlunit,先记录一下。htmlunit其实就是一个没有界面的浏览器,操作很简单,就像自己在使用浏览器。本文介绍其简单的几个操作,仅初学了解htmlunit。第一是模拟登录网站,第二...
  • 资源介绍教程名称:Java爬虫博客采集系统视频教程xa0教程目录:【java爬虫博客采集系统】视频教程第00讲[20分钟] - 系统演示xa0【java爬虫博客采集系统】视频教程第01讲[08分钟] - 博客爬虫模块Axa0【java爬虫博客...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 87,683
精华内容 35,073
关键字:

java爬虫

java 订阅
爬虫 订阅
友情链接: deti.rar