模拟HTTP请求实现网页自动操作和数据收集的方法
序
网页可以分为信息提供和业务运营,以及新闻、股票行情等信息提供网站。网上营业厅、OA等业务运营。当然,同时具备这两个属性的网站也有很多,比如微博、豆瓣、淘宝,它们不仅提供信息,还实现一定的业务。
上网常用的方式一般是手动操作(这个不用解释:d)。但有时候手动操作可能无法胜任,比如在网络上抓取大量数据,实时监控某个页面的变化,批量操作业务(比如批量发微博,批量在淘宝购物),刷账单等。由于操作量大,重复操作,人工操作效率低,容易出错。此时,您可以使用软件自动操作。
我开发过很多这样的软件,比如网络爬虫,自动批量操作业务。使用的核心功能之一是模拟HTTP请求。当然,有时也会用到HTTPS协议,网站一般需要登录后才能进一步操作。最重要的一点是要了解网站的业务流程,也就是要知道什么时候,如何把数据提交到哪个页面,才能实现一个操作。最后,要提取数据或者知道操作结果,需要解析HTML。本文将逐一解释。
本文用C#语言展示代码,但也可以用其他语言实现,原理是一样的。以登陆JD.COM为例。
模拟HTTP请求
C#使用以下类模拟HTTP请求:
网络请求
HttpWebRequest
HttpWebResponse
流
首先,创建一个请求对象(HttpWebRequest),设置相关的Headers信息,然后发送请求(如果是POST,将表单数据写入网络流)。如果目标地址是可访问的,您将获得一个响应对象(HttpWebResponse),返回的结果可以从相应对象的网络流中读取。
示例代码如下:
string ContentType=' application/x-www-form-URL encoded ';String accept='image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/x-shockwave-flash,application/x-silverlight,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,application/x-ms-application,application/x-ms-xbap,application/vnd.ms-xpsdocument,application/xaml xml,application/x-silverlight-2-b1,*/*;string user agent=' Mozilla/5.0(Windows NT 6.3;WOW64)applebwebkit/537.36(KHTML,像Gecko)Chrome/34 . 0 . 1847 . 116 Safari/537.36 ';公共字符串获取(字符串url,字符串编码=DEFAULT _ ENCODE){ HttpWebRequest request=WebRequest。将(url)创建为HttpWebRequestInitHttpWebRequestHeaders(请求);请求。方法=' GETvar html=ReadHtml(请求,编码);返回html}公共字符串发布(字符串url,字符串参数,字符串编码=DEFAULT_ENCODE){编码编码=系统。Text . Encoding.UTF8byte[]数据=编码。GetBytes(param);HttpWebRequest请求=WebRequest。将(url)创建为HttpWebRequestInitHttpWebRequestHeaders(请求);请求。方法=' POST请求。ContentLength=数据。长度;var outstream=请求。getrequest stream();外流。写入(数据,0,数据。长度);var html=ReadHtml(请求,编码);返回html} private void InitHttpWebRequestHeaders(Httpwebrequest请求){ request。ContentType=contentType请求。接受=接受;请求。用户代理=用户代理;}私有String ReadHtml(HttpWebRequest请求,String encode){ HttpWebResponse响应=请求。GetResponse()作为HttpWebResponse流流=响应。GetResponseStream();流阅读器=新的流阅读器(流,编码。GetEncoding(encode));字符串内容=阅读器。ReadToEnd();读者。close();小溪。close();返回内容;}可以看出Get和Post方法的代码大多相似,所以将代码进行封装,提取相同的代码作为新的函数。
HTTPS请求
当网站使用https协议时,上述代码可能会出现以下错误:
基础连接已关闭:无法建立信任关系,原因是证书错误,用浏览器打开时将出现以下页面:
当你点击继续到xxx.xx(不安全)时,你可以继续打开网页。在程序中,只要模拟这一步,就可以继续了。在C#中,您只需要设置servicepointmanager。server certificate evaluidationcallback代理,并直接在代理方法中返回true。
私有Httpwebrequest createHttpwebrequest(字符串URL){ Httpwebrequest;if(IsHttpsProtocol(URL)){ ServiCepointmanager。server certificate evaluidationcallback=new remote certificate evaluidationcallback(CheckValidationResult);request=WebRequest。将(url)创建为HttpWebRequest请求。ProtocolVersion=HttpVersion。版本10;} else { request=WebRequest。将(url)创建为HttpWebRequest}退货请求;}私有Httpwebrequest createHttpwebrequest(字符串URL){ Httpwebrequest;if(IsHttpsProtocol(URL)){ ServiCepointmanager。server certificate evaluidationcallback=new remote certificate evaluidationcallback(CheckValidationResult);request=WebRequest。将(url)创建为HttpWebRequest请求。ProtocolVersion=HttpVersion。版本10;} else { request=WebRequest。将(url)创建为HttpWebRequest}退货请求;}这样,您就可以正常访问https网站。
记录Cookies实现身份认证
有些网站需要登录才能执行下一步,例如,在JD.COM购物需要先登录。网站服务器使用session记录客户端用户,每个session对应一个用户,以前的代码每次创建请求时都会重新建立一个session。即使登录成功,登录也是无效的,因为下一步会创建一个新的连接。此时,我们必须找到一种方法,让服务器认为这一系列请求来自同一个会话。
客户只有Cookies。为了让服务器知道下一次请求时客户端对应的是哪个会话,Cookies中会有一条会话ID的记录。因此,只要Cookies相同,它们对于服务器来说就是同一个用户。
此时需要使用CookieContainer。顾名思义,这是一个cookie容器。HttpWebRequest有一个CookieContainer属性。只要每次请求的CookieContainer都记录在CookieContainer中,HttpWebRequest的CookieContainer属性就会在下一个请求中设置。因为Cookies是相同的,所以它们对于服务器来说是相同的用户。
公共字符串获取(字符串url,字符串编码=DEFAULT _ ENCODE){ HttpWebRequest request=WebRequest。将(url)创建为HttpWebRequestInitHttpWebRequestHeaders(请求);请求。方法=' GET请求。CookieContainer=CookieContainer;HttpWebResponse请求。GetResponse()作为HttpWebResponseforeach (Cookie c)作为响应。cookieContainer)。添加(c);}}分析和调试网站
上面实现了HTTP请求的模拟,当然最重要的是分析站。一般没有文档,也没有网站开发者,所以我们从黑箱开始探索。分析工具很多,建议使用Chrome插件高级Rest客户端。Chrome开发者工具可以让我们知道在打开网页时后台做了哪些操作和请求,Advanced Rest Client可以模拟发送请求。
例如,登录JD.COM时,将提交以下数据:
我们也可以看到JD。COM的密码其实是明文传输的,安全性非常堪忧!
您还可以看到返回的数据:
返回JSON数据,但是这些是什么?其实这是Unicode编码,可以用Unicode编码转换工具转换成可读的文本。比如这次返回的结果是:帐户名和密码不匹配,请重新输入。
解析HTML
HTTP请求得到的数据一般是HTML格式的,有时可能是Json或者XML。需要解析来提取有用的数据。用于解析HTML的组件有:
超文本标记语言分析器.有多种平台可用,比如Java/C#/Python。已经很久没用了。
HtmlAgilityPack .用XPath解析HMTL。一直在用。至于XPath教程,可以看看W3School的XPath教程。
标签
本文介绍了开发模拟自动网页操作所需的技巧,从模拟HTTP/HTTPS请求到Cookies、分析网站和解析HTML。该代码旨在解释如何使用它。它不完整,可能无法直接运行。
以上模拟HTTP请求实现网页自动操作和数据采集的方法,都是边肖分享的内容。希望能给大家一个参考,支持我们。
版权声明:模拟HTTP请求实现网页自动操作和数据收集的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。