У меня два класса, у каждого класса есть события для себя. первый класс имеет два события:
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);
}
}
}
, а второй класс имеет одно событие:
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);
}
}
в окончательном объединении этих классов в третий класс:
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, я вызвал событие краулера, которое вызывает scrap, и искатель вызова событий парсера. по этой причине сначала запустите метод очистки, затем запустите метод сканирования (для сканирования и очистки страниц по одной - событие l oop)
, но события не возникают. я не знаю почему.