C#爬蟲實戰(1)通過Post請求獲取搜索結果
自從關注了python話題,天天推送Python爬取XX,看膩了,以前不理解爬蟲是個什麼東西,自從做了一個微信項目,一下子就懂了,不就是程序發送請求到web伺服器,然後web伺服器,返回數據給爬蟲程序嗎?在這裡我們不探究爬蟲程序是如何發送請求道web伺服器,我只關注結果。
今天的主題就是爬取某個美劇網站,上面某個美劇的下載鏈接,並提供Post請求的例子
第一步,新建一個控制台項目 ,然後添加一個引用using http://system.net .http
由於我們的爬蟲是通過Post請求的方式,去請求某個美劇的資源,所以我們要寫一個HttpPost請求的方法,它有兩個參數,url是請求的頁面地址,postDataStr是要搜索的美劇的名字。
其代碼如下。
HttpPost請求的方法
public async Task<string> HttpPsot(string url, string postDataStr)
{
var task = Task.Run(() =>
{
string html = "";
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = new CookieContainer();
CookieContainer cook = request.CookieContainer;
request.Referer = "http://www.meijutt.com/search.asp";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
request.Headers["Accept-Language"] = "zh-CN,zh;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36";
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
Encoding encod = Encoding.GetEncoding("GB2312");
string code = HttpUtility.UrlEncode(postDataStr, encod).ToUpper();
code = "searchword=" + code;
//Console.WriteLine(code);
byte[] postData = encod.GetBytes(code);
request.ContentLength = postData.Length;
Stream requestSteam = request.GetRequestStream();
requestSteam.Write(postData, 0, postData.Length);
//獲得響應的信息
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("GB2312"));
html = reader.ReadToEnd();
requestSteam.Close();
responseStream.Close();
return html;
});
return await task;
}
對於一個要Post請求的頁面,首先最重要的是查看請求信息,我們打開chrome瀏覽器
打開網站地址,在搜索框輸入要搜索的美劇名

然後右鍵,點擊檢查,然後點擊Network,然後點擊搜索

然後找到要查看的請求信息,點擊search.asp,然後在把右側拉到最底部,找到

如圖所示的信息。
在這個地方一般都會顯示Post請求的參數,發現不是我們輸入的末日孤艦,這個幾個字,
通過serchword,一眼會看出這是一個16進位的數,然後百度16進位轉字元串,記得要將%去掉。發現轉不了

然後測試下末日孤艦,轉成16進位是什麼?測試結果:末日孤艦=e69cabe697a5e5ada4e888b0
這個時候,我們直接使用字元串轉成16進位去請求就不起作用了。要怎麼解決呢。
如果你研究過很多網頁的這種搜索你會發現,有些這種搜索是Get請求的,有些是post請求的,get請求會把請求的參數放在Url後面,而post請求則會把闡述放在http請求的包體中,是看不見。所以就要對參數進行編碼,現在回過頭來看,上面的代碼。
Encoding encod = Encoding.GetEncoding("GB2312");
string code = HttpUtility.UrlEncode(postDataStr, encod).ToUpper();
code = "searchword=" + code;
在上面HttpPost的方法的的中間有3行上面所示的代碼,第二行代碼的作用就是對字元串進行編碼。其中 HttpUtility.UrlEncode(postDataStr, encod).ToUpper();第二個參數要根據網頁所使用的編碼,去設置,一般網頁的編碼,網頁Dom文檔中的meta標籤中,你也可以用其他編碼去猜,如utf-8等。忘了說了HttpUtility這個類,必須引用system.web才能使用。
這個時候我們運行下程序,看看輸出結果
var task = HttpPsot("http://www.meijutt.com/search.asp", "末日孤艦");
using (FileStream fs = new FileStream(@"C:UserswqawdDesktop測試.txt", FileMode.Open, FileAccess.Write))
{
byte[] buffer = Encoding.UTF8.GetBytes(task.Result);
fs.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("寫入完成");
Console.ReadKey();
接下來,驗證下是否Post到了數據。


結尾:
這只是一個簡單的post請求的例子就這麼完成了。接下來會繼續推出深入的例子。
推薦閱讀:
