Я просто экспериментирую с Selenium Webdriver, и у меня происходит пара проблем, которые кажутся связанными, и я хочу прояснить их, прежде чем продолжить. Когда я запускаю код, вставленный внизу, Selenium всегда нужно что-то делать с браузером, и он говорит: «жду [вставить сайт здесь]» некоторое время. Как только это сделано, он, наконец, находит элементы и взаимодействует со страницей. Иногда я получаю различные ошибки, и ошибки не согласованы (но ошибки не нарушают код, просто требуется больше времени, пока Selenium сделает то, что я просил). Время от времени всплывает мой антивирус, который говорит, что он заблокировал веб-сайт (global.ymtracking.com), потому что это было вредоносное ПО. Я чувствую, что это может быть связано с рекламой на веб-странице и с тем, как Selenium загружает веб-страницу, но я не знаю, так как я новичок в этом. У меня никогда не было проблем с посещением этого сайта.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
namespace WebScrappingTesting
{
class Program
{
static IWebDriver driver;
static Dictionary<string, Dictionary<string, float>> hockeyStats = new Dictionary<string, Dictionary<string, float>>();
static string TeamName ="";
static float TeamAge;
static float Wins;
static float Losses;
static void Main(string[] args)
{
driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.hockey-reference.com/leagues/NHL_2019.html");
using (StreamWriter file = new StreamWriter(@"C:\Users\hockeyData.csv", false))
{
file.WriteLine("Team Name,Avg Age,Wins,Losses");
}
for (var year = 2019; year > 2015; year--)
{
Console.WriteLine($"Getting data for {year}");
var rowsOfData = driver.FindElements(By.CssSelector("#stats > tbody > tr"));
for (var i = 1; i <= rowsOfData.Count; i++)
{
TeamName = driver.FindElement(By.CssSelector($"#stats > tbody > tr:nth-child({i}) > td.left > a")).Text;
float.TryParse(driver.FindElement(By.CssSelector($"#stats > tbody > tr:nth-child({i}) > td:nth-child(3)")).Text, out TeamAge);
float.TryParse(driver.FindElement(By.CssSelector($"#stats > tbody > tr:nth-child({i}) > td:nth-child(5)")).Text, out Wins);
float.TryParse(driver.FindElement(By.CssSelector($"#stats > tbody > tr:nth-child({i}) > td:nth-child(6)")).Text, out Losses);
// TODO: need to change this to a 3 dim dictionary or an object to be able to also record the year of the data
hockeyStats[TeamName] = new Dictionary<string, float>() {
{ "Age", TeamAge },
{ "Wins", Wins },
{ "Losses", Losses }
};
}
foreach (var item in hockeyStats)
{
Console.WriteLine("=============================================================");
Console.WriteLine($"Team Name: {item.Key}, Avg Age: {item.Value["Age"]}");
Console.WriteLine($"Wins {item.Value["Wins"]}, Losses {item.Value["Losses"]}");
}
using (StreamWriter file = new StreamWriter(@"C:\Users\hockeyData.csv", true))
{
foreach (var item in hockeyStats)
{
file.WriteLine($"{item.Key},{item.Value["Age"]},{item.Value["Wins"]},{item.Value["Losses"]}");
}
}
driver.FindElement(By.LinkText("Previous Season")).Click();
//driver.FindElement(By.CssSelector($"[href*=/leagues/NHL_{year - 1}.html]"));
}
Console.WriteLine("=============================================================");
Console.WriteLine("=============================================================");
Console.WriteLine(@"You file has been saved to C:\Users\hockeyData.csv");
Console.WriteLine("=============================================================");
Console.WriteLine("=============================================================");
driver.Close();
driver.Dispose();
}
}
}