日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java爬虫:大量抓取二手房信息并存入云端数据库过程详解(三)

發布時間:2023/12/20 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java爬虫:大量抓取二手房信息并存入云端数据库过程详解(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里詳細講一下將解析好的所有房源數據存入云端數據庫的表中:
1、首先是獲得數據庫連接,Java提供了數據庫鏈接的接口,但實現是由各個數據庫提供者自己實現的,這里需要mysql提供的第三方包:mysql-connector-java-8.0.13.jar
、、新建一個類用于封裝數據庫處理的方法:

//封裝數據庫相關操作 public class OperationOfMySQL {//只創建一次鏈接Connection con;Statement state;public OperationOfMySQL() {super();this.con = connectionToDatabase();try {//state用于傳入sql語句對數據庫進行操作this.state = con.createStatement();} catch (Exception e) {System.out.println("鏈接失敗!");}}

如上面的代碼,創建對象時就創建連接:
connectionToDatabase()方法返回獲得的數據庫鏈接:

//返回數據庫鏈接的方法private static Connection connectionToDatabase() {Connection con = null;//創建驅動對象try {Driver driver = new Driver();String url = cloud;Properties info = new Properties();//準備數據庫鏈接信息info.put("user", "rds_repl");info.put("password", "123456");//獲取數據庫鏈接con = driver.connect(url, info);}catch (SQLException e) {System.out.println("鏈接數據庫失敗!");return null;}System.out.println(con+"\n鏈接創建成功!");return con;}//cloud是加載云端驅動的數據庫,格式為://String cloud = "jdbc:mysql://服務器地址:端口號/數據庫名?severTimzone=UTC";

、、關于云端數據庫的地址和端口號這里就不貼出來了(云端和本地的數據庫鏈接其實方法一樣),值得注意的是,如果用的是數據庫連接池有必要設置一下鏈接超時,雖然我并沒有這樣做。。。

PS:還有就是8.0版本加載驅動的類是 com.mysql.cj.jdbc.Driver;多了個“cj”,所以必須設置時區:severTimezone=UTC,5.0版本的不用,不然運行時會報錯。(在此只是提醒一下,具體原因就不細說了);

Java是通過state對象傳遞sql字符串給數據庫。由于數據庫事先存在,所以需要的是建一張表來存儲房屋信息,鍵表語句為:

//如果數據庫中不存在表house1就創建一張 static private String SQLCreateTaleStr = "CREATE TABLE IF NOT EXISTS house1" + "("+ "title varchar(255) ,"+ "area double ,"+ "price varchar(64) ,"+ "unit_price double ,"+ "direction varchar(64),"+ "decoration varchar(64),"+ "houseStyle varchar(64) ,"+ "floor varchar(64),"+ "buildTime int(11) ,"+ "community varchar(64),"+ "location varchar(64) ,"+ "gdpperperson double"+ ")ENGINE = InnoDB DEFAULT CHARSET = utf8;";

然后寫一個方法將房屋信息轉換成sql插入表的語句:

//用于生成插入語句的方法,傳入一個房子和表的名字public String insertStr(SecondHouse house) {String insert = "insert into house1"+ " values('" +house.getElemName()+ "','"+house.getArea()+ "','"+house.getPrice()+ "','"+house.getUnit_price()+ "','"+house.getDirection()+ "','"+house.getDecoration()+ "','"+house.getHouseStyle()+ "','"+house.getFloor()+ "','"+house.getBuildTime()+ "','"+house.getCommunity()+ "','"+house.getLocation()+ "','"+0+ "');";return insert ;}

PS;注意拼接字符串時的空格和標點,確保sql語句能夠執行
然后是執行這寫語句的方法:

//傳入鏈接,進行對數據庫的操作,傳入二手房,寫進數據庫public void operationOnDtabase(String insertStr) {try {//獲取執行sql語句動態創建表,即如果表不存在就創建一個state.execute(SQLCreateTaleStr);//執行插入語句state.executeUpdate(insertStr); // System.out.println(insertStr);}catch (SQLException e) {System.out.println("SQL語句執行失敗!");}System.out.println("執行語句成功!");}

工具方法都準備好了,需要將其整合:

//傳入房屋數組,寫入云端數據庫,這里的houses數組就是先前存儲所有房屋對象的vector集合轉換的public static void writeIntoDtabase(SecondHouse[] houses) {OperationOfMySQL op = new OperationOfMySQL();for (int i = 0; i < houses.length; i++) {try { // SecondHouse.printHouseInfo(houses[i]);op.operationOnDtabase(op.insertStr(houses[i]));} catch (Exception e) {continue;}}}

最后是main方法里面執行網頁解析,多線程調用和寫入數據庫的所有實現;

//---------------------------main方法代替執行--------------------------------------------------------------------public static void operateMain() {houseSet = new Vector<>();//多線程集合Vector<Thread> threads = new Vector<>();for (int i = 1; i <= 50; i++) {Thread1 td1 = new Thread1(i, houseSet);threads.add(td1);td1.start();}for (int j = 51; j <=100; j++) {Thread2 td2 = new Thread2(j,houseSet);threads.add(td2);td2.start();}//等待所有子線程結束join方法for (Thread thread : threads) {try {thread.join();} catch (InterruptedException e) {System.out.println("執行失敗!");}}//去除重復數據Vector<SecondHouse> houses = noneSameVector(houseSet);//寫入數據庫writeIntoDtabase(houses.toArray(new SecondHouse[houses.size()]));}

額,上面這個方法并不是main方法對吧,因為個爬蟲要到導成jar包在一個小服務器上定時運行,所以我在main方法里面調用了這個方法,然后main里面實現定時運行了,這里就不貼出來了。

哦,還有那個去除重復的方法我沒貼出來,實際上這個爬蟲我解析了多個網站,難免會有相同的房屋信息,所以在這里就除重了,當然,傳入sql語句在數據庫里面除重更好。

講一下寫這個爬蟲的收獲:
、、確實感受到了Java語言的魅力所在,雖然并沒有寫出具有這種魅力的代碼,Java無愧為第一語言(不要提PHP)。編程要有耐心,還要有持續學習和不斷嘗新的思想,開始寫這個爬蟲之前,對以上寫的這些代碼我一無所知,覺得都是些很高級的東西。然后,就結合學過的知識和網上了解到的處理方法來一步步實現,寫完發現,其實也就那樣,自己接觸的這些不過是皮毛而已(可能連毛都不算),還需要再接再厲。

PS:這個爬蟲有相當多的缺點和需要優化的地方,我沒有細查了,不過基本功能可以正常實現,嗯。

總結

以上是生活随笔為你收集整理的Java爬虫:大量抓取二手房信息并存入云端数据库过程详解(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。