因為需要,自己寫了個批量查詢qs的小軟體。從網站中抓出需要的數據,格式化顯示: 對字元串進行檢測處理,先用Replace函數去掉字元串的空格,再用正則表達式匹配,返回匹配的字元串,如果沒有匹配,則返回空字元串: 獲取網頁內容。這部分我還是不太會,拿了別人的代碼。但它就是用用HttpWebReques ...
因為需要,自己寫了個批量查詢qs的小軟體。從網站中抓出需要的數據,格式化顯示:
對字元串進行檢測處理,先用Replace函數去掉字元串的空格,再用正則表達式匹配,返回匹配的字元串,如果沒有匹配,則返回空字元串:
//檢測輸入字元是否合法 private string CheckText(string waitregexstr) { waitregexstr = waitregexstr.Replace(" ", ""); string qsregex = "[qQ][sS][0-9]{12}"; return Regex.Match(waitregexstr,qsregex).Value; }
獲取網頁內容。這部分我還是不太會,拿了別人的代碼。但它就是用用HttpWebRequest和HttpWebResponse的各個函數與stream來獲取網頁內容。
#region GetWebContent 根據url返回網頁編碼 HttpWebRequest httpReq; HttpWebResponse httpResp; string strBuff = ""; char[] cbuffer = new char[256]; int byteRead = 0; //string filename = @"c:\log.txt"; ///定義寫入流操作 public string GetWebContent(string url) { url = url.Replace("\r\n", ""); Uri httpURL = new Uri(url); ///HttpWebRequest類繼承於WebRequest,並沒有自己的構造函數,需通過WebRequest的Creat方法 建立,併進行強制的類型轉換 httpReq = (HttpWebRequest)WebRequest.Create(httpURL); ///通過HttpWebRequest的GetResponse()方法建立HttpWebResponse,強制類型轉換 httpResp = (HttpWebResponse)httpReq.GetResponse(); ///GetResponseStream()方法獲取HTTP響應的數據流,並嘗試取得URL中所指定的網頁內容 ///若成功取得網頁的內容,則以System.IO.Stream形式返回,若失敗則產生ProtoclViolationException錯 誤。在此正確的做法應將以下的代碼放到一個try塊中處理。這裡簡單處理 Stream respStream = httpResp.GetResponseStream(); ///返回的內容是Stream形式的,所以可以利用StreamReader類獲取GetResponseStream的內容,並以 //StreamReader類的Read方法依次讀取網頁源程式代碼每一行的內容,直至行尾(讀取的編碼格式:UTF8) StreamReader respStreamReader = new StreamReader(respStream, Encoding.UTF8); byteRead = respStreamReader.Read(cbuffer, 0, 256); while (byteRead != 0) { string strResp = new string(cbuffer, 0, byteRead); strBuff = strBuff + strResp; byteRead = respStreamReader.Read(cbuffer, 0, 256); } respStream.Close(); return strBuff; } #endregion
定義從網頁內容中獲取特定字元的函數。調用獲取網頁源碼後,對字元串進行多次處理,首先用正則匹配regex.Match匹配到需要的字元串,再用Replace處理函數,得到自己所要顯示的函數,這部分如果有大牛有更好的方案,請指教,感謝!
private string operastr( string textboxtext) { try { string url = "避嫌,這裡去掉了網址" + textboxtext.ToUpper() + ".htm"; string webcontent = GetWebContent(url); string pattern = @"<h3>[\s\S]*?</table>"; string butifulwoman = ""; Regex regex = new Regex(pattern); if (regex.IsMatch(webcontent)) { int flag = 0; string fatwoman = regex.Match(webcontent).Value; butifulwoman = fatwoman.Replace("<td class=\"info-field\"><div>", "\r\n").Replace("</div></td>", "").Replace("<td class=\"info-value\"><div style=\"\">", ":").Replace("\n", "").Replace("</tr>", "").Replace("<tr>", "").Replace("</tbody></table>", "").Replace("<table class=\"info-table\"><tbody>", "").Replace("<h3>", "").Replace("</h3>", "").Replace(" ", ""); } loadingGrid.IsOpen = false; return butifulwoman; } catch (Exception ex) { return ""; } }
定義多行字元串的處理方法。根據TextBox的LineCount屬性與getLinetext函數,對字元串進行處理
//多行字元串的處理 private void MutilpleStr(TextBox tb,Label lb) { int k = 0; string linestr=""; for (int i = 0; i <tb.LineCount; i++) { linestr = CheckText(tb.GetLineText(i)); if (linestr == "") { wrong("qs格式錯誤!"); return; } else { if (lb.Content==null) lb.Content = operastr(tb.GetLineText(i)); else { lb.Content += "\r\n------------------------------------"; lb.Content += "\r\n" + operastr(tb.GetLineText(i)); } } } }
主體。根據用戶輸入的qs編號行數,分開一行與多行處理,
if (mutipleText.Text == "") { wrong("文本框不能為空!"); // mutipleText.Style =Style("mytextbox"); } else if (this.mutipleText.LineCount>1) { loadingGrid.IsOpen = true; mutipleText.BorderBrush = Brushes.White; MutilpleStr(mutipleText,my); } else if(this.mutipleText.LineCount==1) { if (CheckText(mutipleText.Text).Length < 1) { wrong("請輸入正確的qs!"); return; } mutipleText.BorderBrush = Brushes.White; string text = mutipleText.Text.Replace(" ", ""); string myneedstr = operastr(text); my.Content = myneedstr; }
最新測試,抓取的數據太快會導致返回的qs全部是同一個,因為抓取的速度太快了,有空我改善下
項目已經上傳: http://files.cnblogs.com/files/ssvip/qs.rar