您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Java語(yǔ)言怎么實(shí)現(xiàn)爬蟲的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
在大數(shù)據(jù)時(shí)代,我們要獲取更多數(shù)據(jù),就要進(jìn)行數(shù)據(jù)的挖掘、分析、篩選,比如當(dāng)我們做一個(gè)項(xiàng)目的時(shí)候,需要大量真實(shí)的數(shù)據(jù)的時(shí)候,就需要去某些網(wǎng)站進(jìn)行爬取,有些網(wǎng)站的數(shù)據(jù)爬取后保存到數(shù)據(jù)庫(kù)還不能夠直接使用,需要進(jìn)行清洗、過濾后才能使用,我們知道有些數(shù)據(jù)是非常真貴的。
我們使用Chrome瀏覽器去訪問豆瓣的網(wǎng)站如
https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
在Chrome瀏覽器的network中會(huì)得到如下的數(shù)據(jù)
可以看到地址欄上的參數(shù)type=movie&tag=熱門&sort=recommend&page_limit=20&page_start=0
其中type是電影tag是標(biāo)簽,sort是按照熱門進(jìn)行排序的,page_limit是每頁(yè)20條數(shù)據(jù),page_start是從第幾頁(yè)開始查詢。
但是這不是我們想要的,我們需要去找豆瓣電影數(shù)據(jù)的總?cè)肟诘刂肥窍旅孢@個(gè)
https://movie.douban.com/tag/#/
我們?cè)俅蔚娜ピL問請(qǐng)求終于拿到了豆瓣的電影數(shù)據(jù)如下圖所示
在看下請(qǐng)求頭信息
最后我們確認(rèn)了爬取的入口為:
https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0
我們創(chuàng)建一個(gè)maven工程,如下圖所示
maven工程的依賴,這里只是爬取數(shù)據(jù),所以沒有必要使用Spring,這里使用的數(shù)據(jù)持久層框架是mybatis 數(shù)據(jù)庫(kù)用的是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>
創(chuàng)建好之后,結(jié)構(gòu)如下所示
首先我們?cè)趍odel包中建立實(shí)體對(duì)象,字段和豆瓣電影的字段一樣,就是請(qǐng)求豆瓣電影的json對(duì)象里面的字段
Movie實(shí)體類
public class Movie { private String id; //電影的id private String directors;//導(dǎo)演 private String title;//標(biāo)題 private String cover;//封面 private String rate;//評(píng)分 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; } }
這里注意的是導(dǎo)演和演員是多個(gè)人我沒有直接處理。這里應(yīng)該是一個(gè)數(shù)組對(duì)象。
創(chuàng)建mapper接口
public interface MovieMapper { void insert(Movie movie); List<Movie> findAll(); }
在resources下創(chuàng)建數(shù)據(jù)連接配置文件jdbc.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/huadi username=root password=root
創(chuàng)建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>
創(chuàng)建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協(xié)議進(jìn)行爬取的,所以我寫了一個(gè)工具類
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)"); // 建立實(shí)際的連接 connection.connect(); //請(qǐng)求成功 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(); //轉(zhuǎn)換成json數(shù)據(jù)處理 // getHttpJson函數(shù)的后面的參數(shù)1,表示返回的是json數(shù)據(jù),2表示http接口的數(shù)據(jù)在一個(gè)()中的數(shù)據(jù) 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; } }
爬取豆瓣電影的啟動(dòng)類
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);//注冊(cè)mybatis 工廠 SqlSession sqlSession = sqlSessionFactory.openSession();//得到連接對(duì)象 MovieMapper movieMapper = sqlSession.getMapper(MovieMapper.class);//從mybatis中得到dao對(duì)象 int start;//每頁(yè)多少條 int total = 0;//記錄數(shù) int end = 9979;//總共9979條數(shù)據(jù) 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("已經(jīng)爬取到底了"); sqlSession.close(); } for (Movie movie : list) { movieMapper.insert(movie); sqlSession.commit(); } total += list.size(); System.out.println("正在爬取中---共抓取:" + total + "條數(shù)據(jù)"); } catch (Exception e) { e.printStackTrace(); } } } }
最后我們運(yùn)行將所有的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中。
感謝各位的閱讀!關(guān)于“Java語(yǔ)言怎么實(shí)現(xiàn)爬蟲”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。