這個版本主要是以百度圖片為對象,對其進行爬蟲操作,實現了最基本的下載功能,但是缺陷非常多,日後還會對其進行改進。 打開百度圖片,同時打開開發者工具,我們會發現,百度圖片是通過如下的一段ajax來載入圖片的。 http://image.baidu.com/search/index?tn=baiduim ...
這個版本主要是以百度圖片為對象,對其進行爬蟲操作,實現了最基本的下載功能,但是缺陷非常多,日後還會對其進行改進。
打開百度圖片,同時打開開發者工具,我們會發現,百度圖片是通過如下的一段ajax來載入圖片的。
http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1466428638972_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%94%90%E5%AB%A3&f=3&oq=tangyan&rsp=0
這裡,我們只需瞭解word後面就是我們的關鍵字,那麼,這個就比較好弄了,結合一部分V1.0的代碼,很快就可以開發出來,原理和V1.0類似。
後臺代碼如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using System.Text.RegularExpressions; namespace 針對百度圖片的動態網頁爬蟲 { public partial class Form1 : Form { static int count = 0; public Form1() { InitializeComponent(); } private void btnDo_Click(object sender, EventArgs e) { int pageCount=2; string keyword = this.keyWords.Text; for (int i = 0; i <pageCount; i++) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1466307565574_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word="+keyword.ToString()); using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { if (response.StatusCode == HttpStatusCode.OK) { using (Stream stream = response.GetResponseStream()) { try { // 下載指定頁的所有圖片 DownloadPage(stream); } catch (Exception ex) { // 跨線程訪問UI線程的txtLogs } } } else { // MessageBox.Show("獲取第" + pageCount + "頁失敗:" + response.StatusCode); } } } MessageBox.Show("執行成功,共"+count.ToString()+"圖片"); } private static string[] getLinks(string html) { const string pattern = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"; Regex r = new Regex(pattern, RegexOptions.IgnoreCase); //新建正則模式 MatchCollection m = r.Matches(html); //獲得匹配結果 string[] links = new string[m.Count]; int count=0; for (int i = 0; i < m.Count; i++) { if(isValiable(m[i].ToString())) { links[count] = m[i].ToString(); //提取出結果 count++; } } return links; } private void DownloadPage(Stream stream) { using(StreamReader reader=new StreamReader(stream)) { string r1; StringBuilder sb = new StringBuilder(); while((r1=reader.ReadLine())!=null) { sb.Append(r1); } FileStream aFile = new FileStream("../../txt.txt", FileMode.OpenOrCreate); StreamWriter sw = new StreamWriter(aFile);//將網頁存儲到了txt文本文件中 sw.WriteLine(sb.ToString()); sw.Close(); string[] s; s = getLinks(sb.ToString()); int i = 0; for(i=0;i<s.Count();i++) { if(s[i]!=null||s[i]!="") { count++; savePicture(s[i]); } } this.label2.Text = count.ToString(); } } private static bool isValiable(string url) { if (url.Contains(".jpg") || url.Contains(".gif") || url.Contains(".png")) { return true; //得到一些圖片之類的資源 } return false; } private static void savePicture(string path) { DataClasses1DataContext db = new DataClasses1DataContext(); Uri url = new Uri(path); HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url); webRequest.Referer = "http://image.baidu.com"; HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); if (isValiable(path))//判斷如果是圖片,就將其存儲到資料庫中。 { Bitmap myImage = new Bitmap(webResponse.GetResponseStream()); MemoryStream ms = new MemoryStream(); myImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); var p = new pictureUrl { pictureUrl1 = ms.ToArray() }; db.pictureUrl.InsertOnSubmit(p); db.SubmitChanges(); } } } }
演示效果:
這個程式只是解決了有無得問題,還有許多問題,以後會繼續解決。