예제 #1
0
        private Car GetCar(ModelSearchDto model, string adUrl)
        {
            WebPage carPage = null;
            int counter = 0;
            while (carPage == null)
            {
                if (counter == 10)
                {
                    return null;
                }
                try
                {
                    carPage = browser.NavigateToPage(new Uri(adUrl));
                    counter++;
                }
                catch (IOException)
                {
                    logger.LogWarning("Connection failed, retry");
                }
                catch (SocketException)
                {
                    logger.LogWarning("Connection failed, retry");
                }
                catch (WebException)
                {
                    logger.LogWarning("Timed out, retry");
                }
                catch (Exception)
                {
                    logger.LogWarning("Unknow error during navigation, retry");
                }
            }
#if DEBUG
            File.WriteAllText(@"./CarsBg/" + model.BrandName.Trim() + "/" + model.Name.Trim() + "/" + adUrl.Substring(25) + ".html", carPage.Content);
#endif
            HtmlNode pageNode = carPage.Html;

            Car car = new Car();
            car.SourceId = (int)SourceEnum.CarsBg;
            car.AdUrl = adUrl;
            car.ModelId = model.Id;

            foreach (PropertyInfo property in typeof(Car).GetProperties())
            {
                if (CarSelectors.ContainsKey(property.Name))
                {
                    string xpathSelector = CarSelectors[property.Name];
                    HtmlNode node = pageNode.SelectSingleNode(xpathSelector);
                    if (node != null)
                    {
                        AssignProperty(car, property.Name, node.InnerText.Trim());
                    }
                }
            }

            return car;
        }
예제 #2
0
        public void AddModel(ModelSearchDto model)
        {
            if (parameters.ContainsKey("brandId") && model.BrandKey != parameters["brandId"])
            {
                throw new ArgumentException(
                          AutoResourceFile.OnlyModelsUnderTheSameBrandCanBeUsedForSearchCriteria);
            }

            parameters["modelId"] = "0";

            parameters.Add("models[]", model.ModelKeys);
        }
예제 #3
0
        public IEnumerable <Car> GetAllCars(ModelSearchDto model, bool newCars)
        {
#if DEBUG
            Directory.CreateDirectory(@"./CarsBg/" + model.BrandName + "/" + model.Name);
#endif
            CarsBgSearchCriteria carsBgSearchCriteria = new CarsBgSearchCriteria();
            carsBgSearchCriteria.AddModel(model);

            var results = new List <Car>();
            logger.LogDebug("Exploring" + model.BrandName + " " + model.Name);

            while (true)
            {
                // CarsBg bugs and displays the 50 page for any page after 50
                if (carsBgSearchCriteria.Page > 50)
                {
                    break;
                }

                var url = carsBgSearchCriteria.ToString();

                WebPage carsPage = browser.NavigateToPage(new Uri(url));

                HtmlNodeCollection links = carsPage.Html.SelectNodes("//table[@class='tableListResults']//tr[contains(@class, 'odd') or contains(@class, 'even')]/td[2]/a");

                if (links == null || links.Count == 0)
                {
                    break;
                }

                foreach (HtmlNode link in links)
                {
                    string href  = link.GetAttributeValue("href");
                    string adUrl = $"https://www.cars.bg/{href}";

                    if (!existingCars.Contains(adUrl) && existingCars.Add(adUrl))
                    {
                        logger.LogDebug("Processing:" + adUrl);
                        Car car = GetCar(model, adUrl);
                        results.Add(car);
                    }
                    else if (newCars)
                    {
                        return(results);
                    }
                }

                carsBgSearchCriteria.Page++;
                logger.LogDebug("Exploring page number:" + carsBgSearchCriteria.Page);
            }

            return(results);
        }