正如意見建議
感謝,使用網頁瀏覽器的做法似乎很重,會受到其他環境的限制。您最好的方法是創建一個單獨的可測試存儲庫來抓取數據 - 如果您確實需要(並且目標數據不會更改),則可以按需提供或使用spider方法。
是的,如果你嘗試使它成爲ActiveX,不同的瀏覽器會遇到問題。安全性可能不允許。這裏有很多因素。如果你的環境不受控制,這不是一個好的選擇。
假設你用按需方式去,我會強烈建議創建一個可以引用的web服務或類。然後,您可以使用一個開源的解析服務器端,如:
- CsQuery如果沒有很好地形成文件,或
- Fizzler,如果你可以信任的文檔的完整性。
基本上,您需要進行身份驗證,存儲您的身份驗證Cookie,並最終通過填充身份驗證Cookie的第二個請求加載目標文檔。 Feed 將頁面添加到您的解析器(CsQuery或Fizzler)中。
進行登錄將如下的例子:
private HttpWebRequest PerformLoginRequest(CookieContainer container)
{
var request = (HttpWebRequest) WebRequest.Create(YOUR_POST_URL);
request.Method = "POST";
request.CookieContainer = container;
_logger.DebugFormat("Attempting login for '{0}'", _username);
var encoding = new ASCIIEncoding();
// assumes the un/pw is stored in a field
var credentials = string.Format("username={0}&password={1}", _username, _password);
byte[] data = encoding.GetBytes(credentials);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var requestStream = request.GetRequestStream())
{
try
{
requestStream.Write(data, 0, data.Length);
}
catch (Exception e)
{
_logger.Error("Error in login attempt.", e);
}
finally
{
requestStream.Close();
}
}
return request;
}
說回來都會有一個Set-Cookie,你需要解析出來,以便後續請求有驗證位的餅乾的容器正確呈現。我必須這樣做,並且用我在這裏找到的某處代碼,但是現在找不到參考。它可能看起來是這樣的(解釋一下Set-Cookie):
private static CookieContainer ProcessCookieContainer(HttpWebRequest request, CookieContainer container)
{
var response = (HttpWebResponse) request.GetResponse();
var cookierReader = new StreamReader(response.GetResponseStream());
string htmldoc = cookierReader.ReadToEnd();
var cookieHeader = response.GetResponseHeader("Set-Cookie");
response.Close();
container = new CookieContainer();
foreach (var cookie in cookieHeader.Split(','))
{
// these are ; seperated name/value pairs
var split = cookie.Split(';');
string name = split[0].Split('=')[0];
string value = split[0].Split('=')[1];
// create the cookie with the domain
var c = new Cookie(name, value) {Domain = "YourCookieDomain.com"};
container.Add(c);
}
return container;
}
並加載文檔解析它,你會做這樣的事情:
public string GetValueFromSomePage(int first, string second)
{
var container = new CookieContainer();
// do login
var request = PerformLoginRequest(container);
// chew on cookies
container = ProcessCookieContainer(request, container);
var result = string.Empty;
var requestUrl = string.Format("http://YourUrlWithParams.com/?first={0}&second={1}", 123, "abc");
var request = (HttpWebRequest)WebRequest.Create(requestUrl);
request.CookieContainer = container;
using (var serverResponse = (HttpWebResponse)request.GetResponse())
{
try
{
var reader = new StreamReader(serverResponse.GetResponseStream());
var responseDoc = new CQ(reader);
// do something with CSS selectors...
result = responseDoc["input[name=name]"].FirstElement().Value;
}
catch (Exception e)
{
_logger.Error("Error fetching data.", e);
}
finally
{
serverResponse.Close();
}
}
return result;
}
我希望這有助於。這裏有幾個移動部件,但您可能期望已經考慮到您的任務的性質。
乾杯。
你有沒有考慮過使用'System.Net.Http.HttpClient'或'System.Net.WebRequest'獲取所需內容? –
是的,是的,我嘗試使用相同的,但它失敗了。我懷疑是因爲要報廢的網站包含多個框架? – BonDaviD
您是否有可能創建一個單獨的應用程序來處理刮擦?然後將結果保存在數據庫或文本文件中,以便您的網站可以讀取。 – NoLifeKing