引用
using System.Net;
using System.IO;
初始化请求
通过工厂机制初始化一个HttpWebRequest请求,参数就是要请求的地址
HttpWebRequest request = WebRequest.CreateHttp("https://search.douban.com/movie/subject_search?search_text=钢铁");
对request进行请求头的设置
只列举了少数几个常用的请求头,更多的请求头设置,直接查看HttpWebRequest对象的属性
查看需要设置的请求头
Method
获取或设置请求方法,默认为GET
request.Method = "POST";
POST方法写入数据
//把多组数据键值对用&隔开,写入一个字符串中
string data = string.Format("id={0}&pwd={1}", "123", "dfg5");
//用流的方式写入数据到请求中
using (StreamWriter myWriter = new StreamWriter(request.GetRequestStream()))
{
myWriter.Write(data);
}
Headers
获取或设置请求头
request.Headers.Add("Accept-Language: en-us;q=0.5,en;q=0.3");
request.Headers.Add("Accept-Language", "en-us;q=0.5,en;q=0.3");
有一些header为限制级的,对于这些header,你不能直接来通过headers.Add方法来添加 如: Host、Connection、User-Agent、Referer、Range、Content-Type、Content-Length、Expect、Proxy-Connection、If-Modified-Since
UserAgent
获取或设置user-agent
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0";
Referer
从哪里来的,从哪个url进入到要爬取的url页面的
request.Referer = "https://wwww.baidu.com";
设置Cookie
1.
//先设置好cookie
Cookie ck1 = new Cookie("key","value");
Cookie ck2 = new Cookie("key", "value");
//添加cookie
request.CookieContainer.Add(ck1);
request.CookieContainer.Add(ck2);
2.
CookieCollection ccl = new CookieCollection();
ccl.Add(ck1);
request.CookieContainer.Add(ccl);
3.
request.Headers.Add("Cookie", "整个cookie写入这个字符串");
设置代理
//ip,端口
WebProxy wp = new WebProxy("192.168.0.2",3303);
WebProxy wp2 = new WebProxy("192.168.0.2:3303");
//设置代理
request.Proxy = wp;
获取响应
GetResponse()才是发送请求的函数,response最后需要Close()方法关闭,所以最好写在using里面
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
response.Close();
//或者
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
//...
}
HttpWebResponse对象有很多属性,可以通过这些属性查看响应头
可能造成乱码的编码问题
//目标网页header里面没有设置charset,就会返回这种编码的字符
if (response.CharacterSet == "ISO-8859-1")
{
//注册安装更多的编码,在 .net core中,编码很少,需要这个安装
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
}
获取响应流
获取响应之后,通过响应,获取响应流
using(Stream streamResponse = response.GetResponseStream())
{
//...
}
读取响应流
string html="";
//读取响应流,设置编码
using (StreamReader streamResponseReader = new StreamReader(streamResponse,Encoding.GetEncoding("utf-8")))
{
html = streamResponseReader.ReadToEnd();
}
到这里就获取了想要抓取的页面的html的内容了。然后解析这个html代码,提取想要的数据