欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何模擬HTTP請求實(shí)現(xiàn)網(wǎng)頁自動操作及數(shù)據(jù)采集-創(chuàng)新互聯(lián)

本篇內(nèi)容主要講解“如何模擬HTTP請求實(shí)現(xiàn)網(wǎng)頁自動操作及數(shù)據(jù)采集”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何模擬HTTP請求實(shí)現(xiàn)網(wǎng)頁自動操作及數(shù)據(jù)采集”吧!

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、順慶網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為順慶等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

前言

網(wǎng)頁可分為信息提供和業(yè)務(wù)操作類,信息提供如新聞、股票行情之類的網(wǎng)站。業(yè)務(wù)操作如網(wǎng)上營業(yè)廳、OA之類的。當(dāng)然,也有很多網(wǎng)站同時具有這兩種性質(zhì),像微博、豆瓣、淘寶這類網(wǎng)站,既提供信息,也實(shí)現(xiàn)某些業(yè)務(wù)。

普通上網(wǎng)方式一般都是手動操作(這個不需要解釋:D)。但有時候人工手動操作的方式可能就無法勝任了,如爬取網(wǎng)絡(luò)上大量數(shù)據(jù),實(shí)時監(jiān)測某個頁面的變化,批量操作業(yè)務(wù)(如批量發(fā)微博,批量淘寶購物)、刷單等。由于操作量大,而且都是重復(fù)的操作,人工操作效率低下,且易出錯。這時候就可以使用軟件來自動操作了。

本人開發(fā)過多個這類軟件,有網(wǎng)絡(luò)爬蟲、自動批量操作業(yè)務(wù)這類的。其中使用到的一個核心功能就是模擬HTTP請求。當(dāng)然,有時會使用HTTPS協(xié)議,而且網(wǎng)站一般需要登陸后才能進(jìn)一步操作,還有最重要的一點(diǎn)就是弄清楚網(wǎng)站的業(yè)務(wù)流程,即知道為了實(shí)現(xiàn)某個操作該在什么時候向哪個頁面以什么方式提交什么數(shù)據(jù),最后,要提取數(shù)據(jù)或知道操作結(jié)果,就還需要解析HTML。本文將一一闡述。

本文使用C#語言來展示代碼,當(dāng)然也可以用其它語言實(shí)現(xiàn),原理是一樣的。以登陸京東為實(shí)例。

模擬HTTP請求

C#模擬HTTP請求需要使用到如下類:

?WebRequest


?HttpWebRequest


?HttpWebResponse


?Stream

先創(chuàng)建一個請求對象(HttpWebRequest),設(shè)置相關(guān)的Headers信息后發(fā)送請求(如果是POST,還要把表單數(shù)據(jù)寫入網(wǎng)絡(luò)流),如果目標(biāo)地址可訪問,會得到一個響應(yīng)對象(HttpWebResponse),從相應(yīng)對象的網(wǎng)絡(luò)流中就可讀出返回結(jié)果。

示例代碼如下:


String contentType = "application/x-www-form-urlencoded";
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 userAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36";

public String Get(String url, String encode = DEFAULT_ENCODE)
{
   HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
   InitHttpWebRequestHeaders(request);
   request.Method = "GET";
   var html = ReadHtml(request, encode);
   return html;
}

public String Post(String url, String param, String encode = DEFAULT_ENCODE)
{
   Encoding encoding = System.Text.Encoding.UTF8;
   byte[] data = encoding.GetBytes(param);
   HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
   InitHttpWebRequestHeaders(request);
   request.Method = "POST";
   request.ContentLength = data.Length;
   var outstream = request.GetRequestStream();
   outstream.Write(data, 0, data.Length);
   var html = ReadHtml(request, encode);
   return html;
}

private void InitHttpWebRequestHeaders(HttpWebRequest request)
{
  request.ContentType = contentType;
  request.Accept = accept;
  request.UserAgent = userAgent;
}

private String ReadHtml(HttpWebRequest request, String encode)
{
  HttpWebResponse response = request.GetResponse() as HttpWebResponse;
  Stream stream = response.GetResponseStream();
  StreamReader reader = new StreamReader(stream, Encoding.GetEncoding(encode));
  String content = reader.ReadToEnd();
  reader.Close();
  stream.Close();
  return content;
}

可以看出,Get和Post方法的代碼大部分都相似,所以代碼進(jìn)行了封裝,提取了相同代碼作為新的函數(shù)。

HTTPS請求

當(dāng)網(wǎng)站使用https協(xié)議時,以上代碼就可能會出現(xiàn)以下錯誤:

The underlying connection was closed: Could not establish trust relationship for

原因是證書錯誤,用瀏覽器打開會出現(xiàn)如下頁面:

如何模擬HTTP請求實(shí)現(xiàn)網(wǎng)頁自動操作及數(shù)據(jù)采集

當(dāng)點(diǎn)擊繼續(xù)前往xxx.xx(不安全)時,就可繼續(xù)打開網(wǎng)頁。在程序中,也只要模擬這一步就可以繼續(xù)了。C#中只需設(shè)置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網(wǎng)站了。

記錄Cookies實(shí)現(xiàn)身份認(rèn)證

有些網(wǎng)站需要登錄才能執(zhí)行下一步操作,比如在京東購物需要先登錄。網(wǎng)站服務(wù)器使用session來記錄客戶端用戶,每一個session對應(yīng)一個用戶,而前面的代碼每次創(chuàng)建一個請求都會重新建立一個session。即使登錄成功,在執(zhí)行下一步操作由于新創(chuàng)建了一個連接,登錄也是無效的。這時就得想辦法讓服務(wù)器認(rèn)為這一系列的請求來自同一個session。

客戶端只有Cookies,為了在下次請求的時候讓服務(wù)器知道該客戶端對應(yīng)哪個session,Cookies中會有一個記錄session ID的記錄。所以,只要Cookies相同,對服務(wù)器來說就是同一個用戶。

這時需要使用到CookieContainer,顧名思義,這就是一個Cookies容器。HttpWebRequest有一個CookieContainer屬性。只要把每次請求的Cookies都記錄在CookieContainer,下次請求時設(shè)置HttpWebRequest的CookieContainer屬性,由于Cookies相同,對于服務(wù)器來說就是同一個用戶了。

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);
   }
}

分析調(diào)試網(wǎng)站

以上就實(shí)現(xiàn)了模擬HTTP請求,當(dāng)然,最重要的還是分析站。一般的情況都是沒有文檔、找不到網(wǎng)站開發(fā)人員,從一個黑盒子開始探索。分析工具有很多,推薦使用Chrome+插件Advanced Rest Client,Chrome的開發(fā)者工具能讓我們知道打開一個網(wǎng)頁時后臺做了哪些操作與請求,Advanced Rest Client可模擬發(fā)送請求。

比如在登錄京東時,會提交如下數(shù)據(jù):


如何模擬HTTP請求實(shí)現(xiàn)網(wǎng)頁自動操作及數(shù)據(jù)采集

我們還能看到京東的密碼居然是明文傳輸,安全性很讓人擔(dān)心啊!

還能看到返回的數(shù)據(jù):

如何模擬HTTP請求實(shí)現(xiàn)網(wǎng)頁自動操作及數(shù)據(jù)采集

返回的是JSON數(shù)據(jù),不過\u8d26這些是什么?其實(shí)這是Unicode編碼,使用Unicode編碼轉(zhuǎn)換工具,即可轉(zhuǎn)換成可讀的文字,比如這次返回的結(jié)果是:賬戶名與密碼不匹配,請重新輸入。

解析HTML

HTTP請求獲得的數(shù)據(jù)一般是HTML格式,有時也可能是Json或XML。需要解析才能提取有用數(shù)據(jù)。解析HTML的組件有:

?HTML Parser。多個平臺可用,如Java/C#/Python。很久沒用了。

?HtmlAgilityPack。通過通過XPath來解析HMTL。一直使用。 關(guān)于XPath教程,可以看W3School的XPath教程。

結(jié)語

本文介紹了開發(fā)模擬自動網(wǎng)頁操作所需要的技能,從模擬HTTP/HTTPS請求,到Cookies、分析網(wǎng)站、解析HTML。代碼旨在說明使用方法,并非完整代碼,可能無法直接運(yùn)行。

到此,相信大家對“如何模擬HTTP請求實(shí)現(xiàn)網(wǎng)頁自動操作及數(shù)據(jù)采集”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)建站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

分享題目:如何模擬HTTP請求實(shí)現(xiàn)網(wǎng)頁自動操作及數(shù)據(jù)采集-創(chuàng)新互聯(lián)
URL分享:http://www.chinadenli.net/article28/dodjjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站動態(tài)網(wǎng)站網(wǎng)站排名網(wǎng)站內(nèi)鏈ChatGPT網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)