Java爬虫:大量抓取二手房信息并存入云端数据库过程详解(三)
這里詳細講一下將解析好的所有房源數據存入云端數據庫的表中:
1、首先是獲得數據庫連接,Java提供了數據庫鏈接的接口,但實現是由各個數據庫提供者自己實現的,這里需要mysql提供的第三方包:mysql-connector-java-8.0.13.jar
、、新建一個類用于封裝數據庫處理的方法:
如上面的代碼,創建對象時就創建連接:
connectionToDatabase()方法返回獲得的數據庫鏈接:
、、關于云端數據庫的地址和端口號這里就不貼出來了(云端和本地的數據庫鏈接其實方法一樣),值得注意的是,如果用的是數據庫連接池有必要設置一下鏈接超時,雖然我并沒有這樣做。。。
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語句能夠執行
然后是執行這寫語句的方法:
工具方法都準備好了,需要將其整合:
//傳入房屋數組,寫入云端數據庫,這里的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爬虫:大量抓取二手房信息并存入云端数据库过程详解(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ue4蓝图碰撞检测的类型_UE4碰撞规则
- 下一篇: java美元兑换,(Java实现) 美元