模拟HTTP请求以实现网页自动操作和数据采集
优采云 发布时间: 2020-08-07 23:54当网站使用https协议时,以上代码可能会出现以下错误:
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
原因是证书错误,使用浏览器打开时将显示以下页面:
单击以继续到xxx.xx(不安全)时,可以继续打开网页. 在程序中,只要您模拟此步骤,就可以继续. 在C#中,您只需要设置ServicePointManager.ServerCertificateValidationCallback代理,并直接在代理方法中返回true.
private HttpWebRequest CreateHttpWebRequest(String url)
{
HttpWebRequest request;
if (IsHttpsProtocol(url))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
return request;
}
private HttpWebRequest CreateHttpWebRequest(String url)
{
HttpWebRequest request;
if (IsHttpsProtocol(url))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
return request;
}
通过这种方式,您可以正常访问https网站.
记录Cookies以实现身份认证
某些站点需要登录才能执行下一步,例如在JD上购物. 您需要先登录. Web服务器使用会话记录客户端用户,每个会话对应一个用户,并且前面的代码每次创建请求时都会创建一个新会话. 即使登录成功,执行下一个操作时由于新创建的连接,登录也是无效的. 目前,您必须找到一种方法,使服务器认为这一系列请求来自同一会话.
客户端只有cookie. 为了让服务器知道客户端在下一个请求中对应的会话,将在cookie中记录会话ID. 因此,只要Cookie相同,服务器的用户就是同一用户.
这时,您需要使用CookieContainer,顾名思义,这是一个Cookie容器. HttpWebRequest具有CookieContainer属性. 只要每个请求的cookie都记录在CookieContainer中,则在下一个请求中设置HttpWebRequest的CookieContainer属性. 由于Cookie相同,因此服务器是同一用户.
public String Get(String url, String encode = DEFAULT_ENCODE)
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
InitHttpWebRequestHeaders(request);
request.Method = "GET";
request.CookieContainer = cookieContainer;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
foreach (Cookie c in response.Cookies)
{
cookieContainer.Add(c);
}
}
分析和调试网站
上面已经实现了模拟的HTTP请求. 当然,最重要的是分析站. 一般情况是,没有文档,找不到网站开发人员,并且探索从黑匣子开始. 有很多分析工具. 建议使用Chrome +插件Advanced Rest Client. Chrome的开发人员工具可以让我们知道打开网页时在后台进行了哪些操作和请求. Advanced Rest Client可以模拟发送请求.
例如,登录京东时,将提交以下数据:
我们还可以看到JD的密码实际上是以纯文本形式传输的,安全性令人担忧!
您仍然可以看到返回的数据:
返回的是JSON数据,但是这些是什么?实际上,这是Unicode编码. 使用Unicode编码转换工具将其转换为可读文本. 例如,这次返回的结果是: 帐户名与密码不匹配,请重新输入.
解析HTML