[英]How can I call method in Event and vice versa C#
我有兩個班級,每個 class 都有自己的事件。 第一個 class 有兩個事件:
public class Crawler
{
public event EventHandler CrawlingComplete;
public event EventHandler NextPage;
protected virtual void OnCrawlingComplete(EventArgs e)
{
CrawlingComplete?.Invoke(this,e);
}
protected virtual void OnNextPage(EventArgs e)
{
NextPage?.Invoke(this,e);
}
public IWebDriver Driver { get; set; }
public By NextButton { get; set; }
public virtual void Start()
{
var nextButton= Driver.FindElement(NextButton);
if (nextButton!=null&&nextButton.Enabled&&nextButton.Displayed )
{
nextButton.Click();
OnNextPage(EventArgs.Empty);
}
else
{
OnCrawlingComplete(EventArgs.Empty);
}
}
}
第二個 class 有一個事件:
public class Scraper
{
public event EventHandler ScrapingComplete;
protected virtual void OnScrapingComplete(EventArgs e)
{
ScrapingComplete?.Invoke(this, e);
}
public IWebDriver Driver { get; set; }
public By Element { get; set; }
private List<string> Result { get; set; } = new List<string>();
public void Start()
{
var findElements = Driver.FindElements(Element);
foreach (var findElement in findElements)
{
if (findElement != null && findElement.Displayed && findElement.Enabled)
{
Result.Add(findElement.Text);
}
}
OnScrapingComplete(EventArgs.Empty);
}
private void SaveToFile()
{
System.IO.File.AppendAllLines(@"L:\ebooks\asdad.txt",Result);
}
}
最后在第三個 class 中將這些類組合在一起:
public class Spider
{
public IWebDriver Driver { get; set; }
public Crawler _crawler;
public Scraper _scraper;
public void SetUrl(string url)
{
Driver.Navigate().GoToUrl(url);
Driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(3000);
}
public void SetSpider(Crawler crawler, Scraper scraper)
{
_crawler = crawler;
_scraper = scraper;
_scraper.Driver = Driver;
_crawler.Driver = Driver;
}
public void Start()
{
Scraping();
}
private void Crawling()
{
_crawler.NextButton = By.CssSelector("a.nextpostslink");
_crawler.Start();
_crawler.NextPage += _crawler_NextPage;
}
private void Scraping()
{
_scraper.Element = By.CssSelector("div.wp-post-details-img > div > a > h2");
_scraper.Start();
_scraper.ScrapingComplete += Scraper_ScrapingComplete;
}
private void _crawler_NextPage(object sender, EventArgs e)
{
Console.ForegroundColor=ConsoleColor.DarkYellow;
Console.WriteLine("crawler event fired!");
Scraping();
}
private void Scraper_ScrapingComplete(object sender, EventArgs e)
{
Console.ForegroundColor=ConsoleColor.Magenta;
Console.WriteLine("scraper event fired!");
Crawling();
}
}
第三個在 Program.cs 中使用:
class Program
{
static void Main(string[] args)
{
Console.ForegroundColor=ConsoleColor.DarkYellow;
Console.WriteLine(" fired!");
Spider spider = new Spider();
spider.Driver = new ChromeDriver();
//persian script crawler
Crawler psCrawler = new Crawler {NextButton = By.CssSelector("a.nextpostslink")};
//persian script Scraper
Scraper psScraper = new Scraper {Element = By.CssSelector("div.wp-post-details-img > div > a > h2")};
spider.SetUrl("https://www.persianscript.ir/");
spider.SetSpider(psCrawler,psScraper);
spider.Start();
Console.ReadKey();
}
}
正如您在 Spider 類中看到的那樣,我將爬蟲的事件稱為爬蟲,而對於爬蟲的事件則稱為爬蟲。 原因首先運行抓取方法然后運行抓取方法(用於逐頁抓取和抓取 - 事件循環)
但事件不會引發。 我不知道為什么。
至少在這兩個地方你應該在開始工作之前訂閱
private void Crawling()
{
_scraper.ScrapingComplete += Scraper_ScrapingComplete;
_crawler.NextPage += _crawler_NextPage;
_crawler.Start();
}
private void Scraping()
{
_scraper.ScrapingComplete += Scraper_ScrapingComplete;
_scraper.Start();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.