引用

  1. using System.Net;
  2. using System.IO;

初始化请求

通过工厂机制初始化一个HttpWebRequest请求,参数就是要请求的地址

  1. HttpWebRequest request = WebRequest.CreateHttp("https://search.douban.com/movie/subject_search?search_text=钢铁");

对request进行请求头的设置

只列举了少数几个常用的请求头,更多的请求头设置,直接查看HttpWebRequest对象的属性

查看需要设置的请求头

打开要爬取的网页,按f12
image.png

Method

获取或设置请求方法,默认为GET

  1. request.Method = "POST";

POST方法写入数据

  1. //把多组数据键值对用&隔开,写入一个字符串中
  2. string data = string.Format("id={0}&pwd={1}", "123", "dfg5");
  3. //用流的方式写入数据到请求中
  4. using (StreamWriter myWriter = new StreamWriter(request.GetRequestStream()))
  5. {
  6. myWriter.Write(data);
  7. }

Headers

获取或设置请求头

  1. request.Headers.Add("Accept-Language: en-us;q=0.5,en;q=0.3");
  2. 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

  1. request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0";

Referer

从哪里来的,从哪个url进入到要爬取的url页面的

  1. request.Referer = "https://wwww.baidu.com";

设置Cookie

  1. 1.
  2. //先设置好cookie
  3. Cookie ck1 = new Cookie("key","value");
  4. Cookie ck2 = new Cookie("key", "value");
  5. //添加cookie
  6. request.CookieContainer.Add(ck1);
  7. request.CookieContainer.Add(ck2);
  8. 2.
  9. CookieCollection ccl = new CookieCollection();
  10. ccl.Add(ck1);
  11. request.CookieContainer.Add(ccl);
  12. 3.
  13. request.Headers.Add("Cookie", "整个cookie写入这个字符串");

设置代理

  1. //ip,端口
  2. WebProxy wp = new WebProxy("192.168.0.2",3303);
  3. WebProxy wp2 = new WebProxy("192.168.0.2:3303");
  4. //设置代理
  5. request.Proxy = wp;

获取响应

GetResponse()才是发送请求的函数,response最后需要Close()方法关闭,所以最好写在using里面

  1. HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  2. response.Close();
  3. //或者
  4. using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
  5. {
  6. //...
  7. }

HttpWebResponse对象有很多属性,可以通过这些属性查看响应头

可能造成乱码的编码问题

  1. //目标网页header里面没有设置charset,就会返回这种编码的字符
  2. if (response.CharacterSet == "ISO-8859-1")
  3. {
  4. //注册安装更多的编码,在 .net core中,编码很少,需要这个安装
  5. Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
  6. }

获取响应流

获取响应之后,通过响应,获取响应流

  1. using(Stream streamResponse = response.GetResponseStream())
  2. {
  3. //...
  4. }

读取响应流

  1. string html="";
  2. //读取响应流,设置编码
  3. using (StreamReader streamResponseReader = new StreamReader(streamResponse,Encoding.GetEncoding("utf-8")))
  4. {
  5. html = streamResponseReader.ReadToEnd();
  6. }

到这里就获取了想要抓取的页面的html的内容了。然后解析这个html代码,提取想要的数据