3 回答

TA貢獻1802條經(jīng)驗 獲得超4個贊
Html Agility Pack 旨在解析、查詢和操作 HTML DOM。某種爬蟲將是它的用例。但是您想真正運行http 請求、javascript 事件或這些按鈕后面的任何內(nèi)容。具有大多數(shù)功能的最簡單方法是遠程控制網(wǎng)絡(luò)瀏覽器。
首先安裝 Selenium 和瀏覽器驅(qū)動程序。我在這里使用 Firefox,因為它是免費的、開源的并且關(guān)注隱私:
Install-Package Selenium.WebDriver
Install-Package Selenium.Firefox.WebDriver
下載瀏覽器的驅(qū)動程序可執(zhí)行文件。可以在 github 上找到 Firefox gecko 驅(qū)動程序:https ://github.com/mozilla/geckodriver/releases/download/v0.24.0/geckodriver-v0.24.0-win64.zip如果帖子變舊,版本概述:https:// github.com/mozilla/geckodriver/releases
現(xiàn)在執(zhí)行存檔并將其路徑復制到變量:
string geckoDriverPath = @"D:\Downloads\geckodriver-v0.24.0-win64";
我們準備開始使用 Firefox。一個簡單的例子,在 stackoverflow 的搜索字段中輸入一些查詢,然后單擊右側(cè)的搜索按鈕:
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
using System;
class Program {
static void Main(string[] args) {
string geckoDriverPath = @"D:\Downloads\geckodriver-v0.24.0-win64";
using (var driver = new FirefoxDriver(geckoDriverPath)) {
driver.Navigate().GoToUrl("https://stackoverflow.com");
var searchBox = driver.FindElementByCssSelector("#search .js-search-field");
searchBox.SendKeys("Selenium");
var searchButton = driver.FindElementByCssSelector("#search .js-search-submit");
searchButton.Click();
Console.Read();
}
}
}
請耐心等待,初始化瀏覽器可能需要幾秒鐘。
根據(jù)您單擊按鈕的作用,可能還有其他方法。如果是某種 http 請求(表單或 ajax 調(diào)用),您可以手動發(fā)送。這更快,節(jié)省資源,您可以輕松地無頭運行它。但這更難實現(xiàn)。特別是在需要從頁面源中提取 id 等數(shù)據(jù)的復雜頁面上。如果您關(guān)心性能和資源,則可以考慮這一點。

TA貢獻1839條經(jīng)驗 獲得超15個贊
使用無頭鍍鉻怎么樣?您可以導航到網(wǎng)頁并根據(jù)需要進行任何操作。
https://github.com/kblok/puppeteer-sharp
// lauch browser and save in variable
var _browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
ExecutablePath = _config.ChromePath, // get path to chrome executable
});
// go to page
var _page = await _browser.NewPageAsync();
var page.GoToAsync("http://www.example.com");
// click on form input
await _page.ClickAsync("#name");
// set data
await _page.Keyboard.SendCharacterAsync("John");
// submit form
await _page.ClickAsync("#SubmitButton");

TA貢獻1802條經(jīng)驗 獲得超6個贊
如果表單是標準的HTML表單,可以獲取回傳url,然后自己post表單數(shù)據(jù)。本質(zhì)上,您正在執(zhí)行按鈕通常會執(zhí)行的操作,而不是填寫表單本身。
要使其正常工作,您需要發(fā)布到的 URL 以及發(fā)布回服務器的元素的名稱。您可以通過任何 Web 檢查器工具輕松獲得它。擁有它后,您可以執(zhí)行以下操作:
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = HttpMethod.Post.ToString();
request.ContentType = "application/json";
// replace name1, name2, value1, value2 with the
// key value pairs that need to be posted.
var content = $"{name1}={value1}&{name2}={value2}"
using (var writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(content);
}
request.ContentLength = content.Length;
using (var response = (HttpWebResponse)request.GetResponse())
{
var encoding = Encoding.GetEncoding(response.CharacterSet);
using (var responseStream = response.GetResponseStream())
{
using (var reader = new StreamReader(responseStream, encoding))
{
return reader.ReadToEnd();
}
}
}
如果您使用的是 .NET 4.5 或更高版本,則可以使用HttpClient類,這使這變得更加簡單:
var httpClient = new HttpClient();
response = await httpClient.PostAsync(uri, new StringContent(data));
response.EnsureSuccessStatusCode();
string content = await response.Content.ReadAsStringAsync();
- 3 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報