1. 程式人生 > >用正則表示式從攜程頁面原始碼提取酒店資訊並插入mysql資料庫

用正則表示式從攜程頁面原始碼提取酒店資訊並插入mysql資料庫

file_regEx_mysql_io

desc: 從txt檔案中讀取字串,通過正則表示式提取關鍵字,並插入mysql資料庫的一個小demo.

前言

​ 因為最近公司需要用到攜程上面的一些酒店資料,由於沒有接觸過爬蟲,所以只能投機取巧去爬html原始檔的程式碼,然後在原始碼裡面提取酒店的資料。

​ 大概畫風如下:

​ 一開始想想既然都是div,那就可以直接通過javascript中的DOM操作,來直接獲取div元素中的屬性值,然後將屬性值傳遞輸出到body元素中,把屬性直接打在頁面上,然後通過excel批量插入,再直接轉移到navicat上插入資料庫即可。

Javascript方法

1. javascript的DOM操作

<script type="text/javascript">
window.onload = function(){ 
//function getHasTitles(parentNode) {
    var allNodes = document.getElementsByTagName('div');
    var length = allNodes.length;
    var i;
    var hasTitles = [];
    var node;
    // for (i = 0; i < length; i++) {
    //     node = allNodes[i];
    //     if (node.title) {
    //         //hasTitles.push(node);
    //         console.log(node.getAttribute('title'));
    //     }
    var str;
    var a='';
          for(var i=0; i<length ;i++){
              
              node = allNodes[i];
            //  if (node[data-value]) {
             //hasTitles.push(node);
              a = node.getAttribute('data-value');
              str += '<div>'+a+'</div>'; //拼接str
         // }
          
    }
    for(var i=0; i<length ;i++){
              
              node = allNodes[i];
            //  if (node[data-value]) {
             //hasTitles.push(node);
              a = node.getAttribute('data-brandtype');
              str += '<div>'+a+'</div>'; //拼接str
         // }
          
    }
    document.getElementById('container').innerHTML=str;
    //return hasTitles;
}
​
/*var hasTitles = getHasTitles(document);
for (var i = 0; i < hasTitles.length; i++) {
    console.log(hasTitles[i].getAttribute('id'));
}*/
//}
</script>

2. 在html檔案中獲取所需要的屬性

3. 然後將資料批量複製插入excel表格中

4. 最後直接將excel表格直接批量複製到navicat中實現批量插入處理

Java方法

​ 做人說到底還是向惰性屈服,現在又覺得好像上面需要用excel做中轉很麻煩,想想用一下正則表示式來逐行讀取文字,然後提取關鍵資訊插入mysql資料庫,一步到位,想想都有點小激動。

1. 讀取文字然後通過正則表示式過濾出關鍵資訊

public class cin_txt {  
    public static void main(String args[]) {  
        
        try { // 防止檔案建立或讀取失敗,用catch捕捉錯誤並列印,也可以throw  
  
            //讀入TXT檔案  
            String pathname = "beijing.txt"; // 絕對路徑或相對路徑都可以,這裡是絕對路徑,寫入檔案時演示相對路徑  
            File filename = new File(pathname); // 要讀取以上路徑的input.txt檔案  
            InputStreamReader reader = new InputStreamReader(  
                    new FileInputStream(filename)); // 建立一個輸入流物件reader  
            BufferedReader br = new BufferedReader(reader); // 建立一個物件,它把檔案內容轉成計算機能讀懂的語言  
            String line = "";  
            line = br.readLine();  
            while (line != null) {  
                line = br.readLine(); // 一次讀入一行資料  
                if(line != null) {
                //String regEx = "(?=[\\s\\S]*?)(\\[smiley=[0-9]+\\])(?=[\\s\\S]*?)";
                //String regEx ="data-value='([0-9]+)'([\\s\\S]*?)title='([\\u4e00-\\u9fa5_a-zA-Z0-9]+)'";
                String regEx ="data-value='([0-9]+)'([\\s\\S]*?)title='([\\S]+)'";  
                //String str = "adfasdf[smiley=4]kk [smiley=1]   mko[smiley=2],sdfaasdfa fd";
                //String str = "<div data-dopost='T' data-type='brand' data-value='1085' id='brand-1085' data-brandtype='0' title='Q加' class='optionList-item  '>Q加</div>";
                Pattern pat = Pattern.compile(regEx);
                Matcher mat = pat.matcher(line);
                while(mat.find()){
                    Dao.add(mat.group(1),mat.group(3));
                }
                }
            }  
            br.close();
            System.out.println("插入成功");
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

2. 連線mysql,插入關鍵字

public class Dao {
    private static final String USER = "root";
    private static final String PASSWD = "123456";
    private static final String URL = "jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";
    
    public static void add(String value,String title) throws SQLException {
        //  1、註冊資料庫的驅動,使用反射註冊驅動
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Connection connection = null;
         //2、獲得資料庫的連線訪問許可權
        try {
            connection = DriverManager.getConnection(URL, USER, PASSWD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
         //3、向資料庫傳送執行的SQL執行語句
        PreparedStatement pstmt;
        
            String sql = "insert into hotel_brand_test(brand_value,title) Values(?,?) ";
            pstmt = (PreparedStatement) connection.prepareStatement(sql);
            pstmt.setString(1, value);
            pstmt.setString(2, title);
            pstmt.executeUpdate();
         //5、關閉資料庫連線
         try {
            pstmt.close();
            connection.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }
}
​

3. 大功告成

相關推薦

表示式頁面原始碼提取酒店資訊插入mysql資料庫

file_regEx_mysql_io desc: 從txt檔案中讀取字串,通過正則表示式提取關鍵字,並插入mysql資料庫的一個小demo. 前言 ​ 因為最近公司需要用到攜程上面的一些酒店資料,由於沒有接觸過爬蟲,所以只能投機取巧去爬html原始檔的程式碼,然後

QT 表示式tableView中篩選出某一日期範圍內的資料

QDate date1,date2; date1=ui->dateEdit_2->date();//提取開始時間 date2=ui->dateEdit_3->date();//提取結束時間 data_filter->

【python學習筆記】表示式含中文的網頁中提取資料(含編碼轉換)

目標:用正則表示式從含中文的網頁中提取資料 1、獲得網頁全部資料 1.1思考過程 確定我們要操作的網頁:url = 'http://q.stock.sohu.com/cn/603077/cwzb.shtml' 開啟要操作的網頁:req = urllib2.open(url)

表示式載入靜態頁面(HTML5+Jquery)

很多人可能用過Vie.js,網頁動態載入資料。一般來說,HTML在後面呼叫new Vue()載入資料的。Vue很有創意,在HTML中插入{{}}標記,使用HTML模板化,方便開發。但其也有一定不便。我受Vue啟發,想與Jquery結合(我很喜歡JQuery)。 我嘗試使用$Ajax()載入資料,並把資料顯示

如何用python文中獲取檔名再表示式批量修改檔名

第零步:問題的提出 我在網上購買了星火英語的六級晨讀美文100篇(六級早已高分飄過,不過很喜歡這些文章,買來重新品味),但是發現其文章的命名都為01.txt或10.txt等。為了便於檢索需要修改檔名稱。 第一步:從檔案中取出檔名。 我發現txt檔案的第一行為檔名,格式為如

java表示式判斷一個字串是否是車牌號

public boolean checkCarNumber(String content) { String pattern = "([京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊]{1}(([A-HJ-Z]{1}[A-HJ-NP-Z0-9]{5})|([A-HJ-

Java表示式判斷輸入的電話號碼格式是否正確

import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; /** *三大運營商號碼均可驗證(不含衛星通訊1349) */ p

java使用表示式一長串字元中獲取一段特徵字串

只能說String工具類太強大,導致一直以來,幾乎沒怎麼用到過正則表示式,現在突然要用到,參考正則表示式語法,摸索一上午才搞出來。記錄分享一下,以免忘記 從一長串字元中,截取出邀請碼,我想很多人都遇到過。 String s = "邀請您加入隨心購,自動搜尋淘寶天貓優惠券!先領券,再購

怎麼表示式限制輸入框輸入數字的範圍(數字範圍是50-1000),怎麼限制輸入框輸入的數字是以9506開頭的

轉自 https://zhidao.baidu.com/question/1829801257322895700.html   <input type="text" onkeyup="var v=this.value||'';v=v.replace(/[^\d]/g,'')

鬥圖網鬥圖全站爬取(表示式re)

import  re  import requests import os class doutu_spyder():     first_url=[]     first_name=[]     headers=

PHP批量替換Img中src內容,表示式獲取圖片路徑實現縮圖功能

/** * 圖片地址替換成壓縮URL * @param string $content 內容 * @param string $suffix 字尾 */ function get_img_thumb_url($content="",$suffix="!c550x260.jpg") { // by

notepad++ 等表示式自動新增sql引號的技巧

轉:https://www.jb51.net/article/73605.htm notepad正則表示式新增sql引號,具體內容請看下文詳解。 一般sql語句會經常用到給括號裡的內容新增引號,sql如下 ? 1 2 3 4 5 6 7 8 S

表示式修改html字串的所有div的style樣式

 最近專案中有一介面返回的一個欄位是html格式的字串,裡邊每個div中style的高度是固定的px,然後再手機端顯示的時候發現,div中的內容重疊了;效果圖如下: 對應的div如下: 由於高度固定,一行內容顯示不完的情況下,內容換行的時候就出現重疊; 現在一種解決方案就是將heigh

c# 表示式獲取開始和結束字串中間的值

/// <summary> /// 獲得字串中開始和結束字串中間得值 /// </summary> /// <param name="str">字串</param> /// <param name="s">開始</param>

表示式表示IP,埠和子網掩碼

一、IP地址的正則表示式 1、無任何判斷: /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/ 2、判斷0.0.0.0不符合IP書寫規範: /^(25[0-5]|2[

表示式實現 計算器

#!/usr/bin/env python # coding:utf-8 import re def dealwith(express): express.replace('+-','-') express.replace('--','+') return express d

Python 表示式一次替換文章中所有特殊符號,如“-,$()#+&*”之類

一個簡單的正則表示式,可能會起大作用。比如說字符集就是這樣。一篇文章如果有各種亂碼,就可以用這種方法去除。如去除“-,$()#+&*”之類符號是很方便的。按照查詢、分割、替換的套路再做一做這樣的練習。今天晚了,後續還要操作檔案來完善這一點。 import re

python 遇到表情程式碼出錯, 表示式去掉表情程式碼

>>> aa = '\U0001f60a\adwkdkdkkdk' # 這裡“\U0001f60a” 這是表情的程式碼 帶這個\ >>> import re >>> cc = re.compile(r'\U0

表示式匹配HTML標籤

<script> //匹配HTML標籤 方法一: var str = '<p class="odd" id="odd">123</p>'; var pattern = /<\/?[a-zA-Z]+(\s+[a-zA-

Perl表示式(3) - 表示式處理文字

用正則表示式處理文字 3.1 替換操作 3.1.1 用s///進行替換操作 (substitution) 如果把m//想象為文理處理器的字串“查詢”功能,那麼s///就是查詢並替換功能。 如:s/Barney/Fred/; 可以實現將Barney替