中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java語言怎么實現爬蟲

發布時間:2022-01-05 11:04:32 來源:億速云 閱讀:113 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關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中會得到如下的數據

Java語言怎么實現爬蟲

可以看到地址欄上的參數type=movie&tag=熱門&sort=recommend&page_limit=20&page_start=0

其中type是電影tag是標簽,sort是按照熱門進行排序的,page_limit是每頁20條數據,page_start是從第幾頁開始查詢。

但是這不是我們想要的,我們需要去找豆瓣電影數據的總入口地址是下面這個

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

我們再次的去訪問請求終于拿到了豆瓣的電影數據如下圖所示

Java語言怎么實現爬蟲

在看下請求頭信息

Java語言怎么實現爬蟲

Java語言怎么實現爬蟲

最后我們確認了爬取的入口為:

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

創建Maven項目開始爬取

我們創建一個maven工程,如下圖所示

Java語言怎么實現爬蟲

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</artifactId>
      <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>

創建好之后,結構如下所示

Java語言怎么實現爬蟲

首先我們在model包中建立實體對象,字段和豆瓣電影的字段一樣,就是請求豆瓣電影的json對象里面的字段

Java語言怎么實現爬蟲

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<Movie> findAll();
}

在resources下創建數據連接配置文件jdbc.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/huadi
username=root
password=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="username" value="${username}"/>
                <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 column="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>

    <insert id="insert" keyProperty="id" parameterType="com.cn.scitc.model.Movie">
        INSERT INTO movie(id,title,cover,rate,casts,directors)
        VALUES
        (#{id},#{title},#{cover},#{rate},#{casts},#{directors})
    </insert>
    <select id="findAll" resultMap="MovieMapperMap">
        SELECT * FROM movie
    </select>
</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.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<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();
        }

        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<Movie> 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語言怎么實現爬蟲

感謝各位的閱讀!關于“Java語言怎么實現爬蟲”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巫山县| 东丰县| 山东| 隆子县| 乌拉特后旗| 扎赉特旗| 曲阜市| 南昌市| 娱乐| 鹿邑县| 教育| 镇平县| 合水县| 蒙城县| 海丰县| 高雄县| 永吉县| 安福县| 江永县| 高尔夫| 无极县| 哈尔滨市| 彭泽县| 上饶市| 株洲县| 麻江县| 黔江区| 成武县| 宿迁市| 深州市| 桑日县| 根河市| 兴业县| 石家庄市| 临澧县| 车致| 通许县| 南川市| 麦盖提县| 白山市| 孝感市|