首页 > 作文

Java实现爬虫

更新时间:2023-04-04 10:10:42 阅读: 评论:0

为什么我们要爬取数据

在大数据时代,我们要获取更多数据,就要进行数据的挖掘、分析、筛选,比如当我们做一个项目的时候,需要大量真实的数据的时候,就需要去某些网站进行爬取,有些网站的数据爬取后保存到数据库还不能够直接使用,需要进行清洗、过滤后才能使用,我们知道有些数据是非常真贵的。

分析豆瓣电影网站

我们使用chrome浏览器去访问豆瓣的网站如

/d/file/titlepic/explore style="text-align:center">

可以看到地址栏上的参数type=movie&tag=热门&sort=recommend&page_limit=20&page_start=0

其中type是电影tag是标签,sort是按照热门进行排序的,page_limit是每页20条数据,page_start是从第几页开始查询。

但是这不是我们想要的,我们需要去找豆瓣电影数据的总入口地址是下面这个

https://movie.douban.com/tag/#/

我们再次的去访问请求终于拿到了豆瓣的电影数据如下图所示

在看下请求头信息

最后我们确认了爬取的入口为:

/d/file/titlepic/new_arch_subjects style="text-align:center">

maven工程的依赖,这里只是爬取数据,所以没有必要使用spring,这里使用的数据持久层框架是mybatis 数据库用的是mysql,下面是maven的依赖

<dependencies>    <dependency>      <groupid>org.json</groupid>      <artifactid>json</artifactid>      <version>20160810</version>    </dependency>    <dependency>      <groupid>com.alibaba</groupid>      <artifactid>fastjson</artifactid>      <version>1.2.47</version>    </dependency>    <dependency>      <groupid>mysql</groupid>      <artifactid>mysql-connector-java</artifact热恋中的情话短句id>      <version>5.1.47</version>    </dependency>    <dependency>      <groupid>org.mybatis</groupid>      <artifactid>mybatis</artifactid>      <version>3.5.1</version>    </dependency>    <dependency>      <groupid>junit</groupid>      <artifactid>junit</artifactid>      <version>4.12</version>    </dependency>  </dependencies>

创建好之后,结构如下所示

首先我们在model包中建立实体对象,字段和豆瓣电影的字段一样,就是请求豆瓣电影的json对象里面的字段

movie实体类

public class movie {    private string id; //电影的id    private string  directors;//导演    private string title;//标题    private string cover;//封面    private string rate;//评分    private string casts;//演员    public string getid() {        return id;    }    public void tid(string id) {        this.id = id;    }    public string getdirectors() {        return directors;    }    public void tdirectors(string directors) {        this.directors = directors;    }    public string gettitle() {        return title;    }    public void ttitle(string title) {        this.title = title;    }    public string getcover() {        return cover;    }    public void tcover(string cover) {        this.cover = cover;    }    public string getrate() {        return rate;    }    public void trate(string rate) {        this.rate = rate;    }    public string getcasts() {        return casts;    }    public void tcasts(string casts) {        this.casts = casts;    }}

这里注意的是导演和演员是多个人我没有直接处理。这里应该是一个数组对象。

创建mapper接口

public interface moviemapper {    void inrt(movie movie);        list<movie> findall();}

在resources下创建数据连接配置文件jdbc.properties

driver=com.mysql.jdbc.driverurl=jdbc:mysql://localhost:3306/huadiurname=rootpassword=root

创建mybatis配置文件 mybatis-config.xml

<?xml version="1.0" encoding="utf-8" ?><!doctype configuration public "-//mybatis.org//dtd config 3.0//en"        "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <properties resource="jdbc.properties"></properties>    <environments default="development">        <environment id="development">            <transactionmanager type="jdbc"/>            <datasource type="pooled">                <property name="driver" value="${driver}"/>                <property name="url" value="${url}"/>                <property name="urname" value="${urname}"/>                <property name="password" value="${password}"/>            </datasource>        </environment>    </environments>    <mappers>        <mapper resource="moviemapper.xml"/>    </mappers></configuration>

创建mapper.xml映射文件

<!doctype mapper        public "-//mybatis.org//dtd mapper 3.0//en"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.cn.scitc.mapper.moviemapper">    <resultmap id="moviemappermap" type="com.cn.scitc.model.movie">        <id c男主角是明星的小说olumn="id" property="id" jdbctype="varchar"/>        <id column="title" property="title" jdbctype="varchar"/>        <id column="cover" property="cover" jdbctype="varchar"/>        <id column="rate" property="rate" jdbctype="varchar"/>        <id column="casts" property="casts" jdbctype="varchar"/>        <id column="directors" property="directors" jdbctype="varchar"/>    </resultmap>    <inrt id="inrt" keyproperty="id" parametertype="com.cn.scitc.model.movie">        inrt into movie(id,title,cover,rate,casts,directors)        values        (#{id},#{title},#{cover},#{rate},#{casts},#{directors})    </inrt>    <lect id="findall" resultmap="moviemappermap">        lect * from movie    </lect></mapper>

由于这里没有用任何的第三方爬虫框架,用的是原生java的http协议进行爬取的,所以我写了一个工具类

public class getjson {    public jsonobject gethttpjson(string url, int comefrom) throws exception {        try {            url realurl = new url(url);            httpurlconnection connection = (httpurlconnection) realurl.openconnection();            connection.trequestproperty("accept", "*/*");            connection.trequestproperty("connection", "keep-alive");            connection.trequestproperty("ur-agent", "mozilla/4.0 (compatible; msie 6.0; windows nt 5.1;sv1)");            // 建立实际的连接            connection.connect();            //请求成功            if (connection.getresponcode() == 200) {                inputstream is = connection.画王维古诗getinputstream();                bytearrayout搜职网putstream baos = new bytearrayoutputstream();                //10mb的缓存                byte[] buffer = new byte[10485760];                int len = 0;                while ((len = is.read(buffer)) != -1) {                    baos.write(buffer, 0, len);                }                string jsonstring = baos.tostring();                baos.clo();                is.clo();                //转换成json数据处理                // gethttpjson函数的后面的参数1,表示返回的是json数据,2表示http接口的数据在一个()中的数据                jsonobject jsonarray = getjsonstring(jsonstring, comefr什么是情商om);                return jsonarray;            }        } catch (malformedurlexception e) {            e.printstacktrace();        } catch (ioexception ex) {            ex.printstacktrace();        }        return null;    }    public jsonobject getjsonstring(string str, int comefrom) throws exception{        jsonobject jo = null;        if(comefrom==1){            return new jsonobject(str);        }el if(comefrom==2){            int indexstart = 0;            //字符处理            for(int i=0;i<str.length();i++){                if(str.charat(i)=='('){                    indexstart = i;                    break;                }            }            string strnew = "";            //分割字符串            for(int i=indexstart+1;i<str.length()-1;i++){                strnew += str.charat(i);            }            return new jsonobject(strnew);        }        return jo;    }}

爬取豆瓣电影的启动类

public class main {    public static  void  main(string [] args) {        string resource = "mybatis-config.xml"; 定义配置文件路径        inputstream inputstream = null;        try {            inputstream = resources.getresourceasstream(resource);//读取配置文件        } catch (ioexception e) {            e.printstacktrace();        }        sqlssionfactory sqlssionfactory = new sqlssionfactorybuilder().build(inputstream);//注册mybatis 工厂        sqlssion sqlssion = sqlssionfactory.openssion();//得到连接对象        moviemapper moviemapper = sqlssion.getmapper(moviemapper.class);//从mybatis中得到dao对象        int start;//每页多少条        int total = 0;//记录数        int end = 9979;//总共9979条数据        for (start  = 0; start <= end; start += 20)  {            try {                string address = "/d/file/titlepic/new_arch_subjects" + start;                jsonobject dayline = new getjson().gethttpjson(address, 1);                    system.out.println("start:" + start);                    jsonarray json = dayline.getjsonarray("data");                    list<movie> list = json.pararray(json.tostring(), movie.class);                    if (start <= end){                        system.out.println("已经爬取到底了");                        sqlssion.clo();                    }                    for (movie movie : list) {                        moviemapper.inrt(movie);                        sqlssion.commit();                    }                    total += list.size();                    system.out.println("正在爬取中---共抓取:" + total + "条数据");            } catch (exception e) {                e.printstacktrace();            }        }    }}

最后我们运行将所有的数据插入到数据库中。

项目地址

github

总结

爬取豆瓣网站非常的轻松,每页任何的难度,需要注意的是就是start是每页多少条我们发现规则当start=0的时候是20条数据是从0到19条,就这样每次加20条直到爬取完。

到此这篇关于java实现爬虫的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-04 10:10:33,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/bd5d5b966af6ea8704160459356a7abe.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Java实现爬虫.doc

本文 PDF 下载地址:Java实现爬虫.pdf

标签:数据   的是   豆瓣   每页
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图