千家信息网

Java语言怎么实现爬虫

发表于:2024-11-29 作者:千家信息网编辑
千家信息网最后更新 2024年11月29日,这篇文章给大家分享的是有关Java语言怎么实现爬虫的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为什么我们要爬取数据在大数据时代,我们要获取更多数据,就要进行数据的挖掘、分
千家信息网最后更新 2024年11月29日Java语言怎么实现爬虫

这篇文章给大家分享的是有关Java语言怎么实现爬虫的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

为什么我们要爬取数据

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

分析豆瓣电影网站

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

https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

在Chrome浏览器的network中会得到如下的数据

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

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

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

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

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

在看下请求头信息

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

https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0

创建Maven项目开始爬取

我们创建一个maven工程,如下图所示

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

          org.json      json      20160810              com.alibaba      fastjson      1.2.47              mysql      mysql-connector-java      5.1.47              org.mybatis      mybatis      3.5.1              junit      junit      4.12      

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

首先我们在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 setId(String id) {        this.id = id;    }    public String getDirectors() {        return directors;    }    public void setDirectors(String directors) {        this.directors = directors;    }    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public String getCover() {        return cover;    }    public void setCover(String cover) {        this.cover = cover;    }    public String getRate() {        return rate;    }    public void setRate(String rate) {        this.rate = rate;    }    public String getCasts() {        return casts;    }    public void setCasts(String casts) {        this.casts = casts;    }}

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

创建mapper接口

public interface MovieMapper {    void insert(Movie movie);        List findAll();}

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

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/huadiusername=rootpassword=root

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

                                                                                                                                                

创建mapper.xml映射文件

                                                                    INSERT INTO movie(id,title,cover,rate,casts,directors)        VALUES        (#{id},#{title},#{cover},#{rate},#{casts},#{directors})        

由于这里没有用任何的第三方爬虫框架,用的是原生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.setRequestProperty("accept", "*/*");            connection.setRequestProperty("connection", "Keep-Alive");            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            // 建立实际的连接            connection.connect();            //请求成功            if (connection.getResponseCode() == 200) {                InputStream is = connection.getInputStream();                ByteArrayOutputStream 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.close();                is.close();                //转换成json数据处理                // getHttpJson函数的后面的参数1,表示返回的是json数据,2表示http接口的数据在一个()中的数据                JSONObject jsonArray = getJsonString(jsonString, comefrom);                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);        }else if(comefrom==2){            int indexStart = 0;            //字符处理            for(int i=0;i

爬取豆瓣电影的启动类

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();        }        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//注册mybatis 工厂        SqlSession sqlSession = sqlSessionFactory.openSession();//得到连接对象        MovieMapper movieMapper = sqlSession.getMapper(MovieMapper.class);//从mybatis中得到dao对象        int start;//每页多少条        int total = 0;//记录数        int end = 9979;//总共9979条数据        for (start  = 0; start <= end; start += 20)  {            try {                String address = "https://Movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=" + start;                JSONObject dayLine = new GetJson().getHttpJson(address, 1);                    System.out.println("start:" + start);                    JSONArray json = dayLine.getJSONArray("data");                    List list = JSON.parseArray(json.toString(), Movie.class);                    if (start <= end){                        System.out.println("已经爬取到底了");                        sqlSession.close();                    }                    for (Movie movie : list) {                        movieMapper.insert(movie);                        sqlSession.commit();                    }                    total += list.size();                    System.out.println("正在爬取中---共抓取:" + total + "条数据");            } catch (Exception e) {                e.printStackTrace();            }        }    }}

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

感谢各位的阅读!关于"Java语言怎么实现爬虫"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0