自从关注了python话题,天天推送Python爬取XX,看腻了,以前不理解爬虫是个什么东西,自从做了一个微信项目,一下子就懂了,不就是程序发送请求到web伺服器,然后web伺服器,返回数据给爬虫程序吗?在这里我们不探究爬虫程序是如何发送请求道web伺服器,我只关注结果。

今天的主题就是爬取某个美剧网站,上面某个美剧的下载链接,并提供Post请求的例子

第一步,新建一个控制台项目 ,然后添加一个引用using 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请求的例子就这么完成了。接下来会继续推出深入的例子。


推荐阅读:
查看原文 >>
相关文章