using System;
using System.Collections.Generic;
using System.Net;
using HtmlAgilityPack;
namespace ConProductSearch
{
/// <summary>
/// Rip the web site, looking for available products.
/// </summary>
class Program
{
static void Main(string[] args)
{
Program me = new Program();
me.Run();
}
private void Run()
{
// Each product has a name (for your benefit) and a product code (to search by). You can figure out the codes easily from each product's url
// Change this list as you see fit
DisplayProductAvailability("45 ACP", 70);
DisplayProductAvailability("9 MM", 51);
DisplayProductAvailability("40 S&W", 59);
DisplayProductAvailability("308 Win", 101);
DisplayProductAvailability("30-06", 105);
DisplayProductAvailability("6.5 Creedmoor", 776);
Console.WriteLine();
Console.WriteLine("Hit enter to exit");
Console.ReadLine();
}
private List<HtmlNode> GetAvailableProducts(int productId)
{
List<HtmlNode> availableProducts = new List<HtmlNode>();
// This is an internal page used by the main product page that populates all the images, price and availability
String url = "https://www.targetsportsusa.com/ISearch.aspx?PageNumber=0&PageSize=40&PageSort=pv.PricePerRound&ColorFilter=&SizeFilter=&PriceFilter=&TypeFilter=&ManufacturerFilter=&CategoryFilter=" + productId
+ "&GenreFilter=&DistributorFilter=&VectorFilter=&SectionFilter=&LibraryFilter=&stockFilter=false&Filter=%";
// Load the product page and store all it's html in a dom model
var html = new HtmlDocument();
html.LoadHtml(new WebClient().DownloadString(url));
HtmlNode root = html.DocumentNode;
HtmlNode ul = root.ChildNodes.FindFirst("ul");
HtmlNodeCollection products = ul.ChildNodes;
foreach (HtmlNode productNode in products)
{
HtmlNodeCollection productParts = productNode.ChildNodes;
foreach (HtmlNode productSubNode in productParts)
{
if (productSubNode.Name.ToUpper() == "A")
{
if (productSubNode.ChildNodes.FindFirst("button").InnerText.ToUpper() == "ADD TO CART")
{
availableProducts.Add(productSubNode);
continue;
}
}
}
}
return availableProducts;
}
private void DisplayProductAvailability(String productName,int productId)
{
// See if is anything available
List<HtmlNode> availableProducts = GetAvailableProducts(productId);
if (availableProducts.Count > 0)
{
Console.WriteLine("--------------------------------------------------------------");
Console.WriteLine(productName);
Console.WriteLine();
foreach (HtmlNode availableProduct in availableProducts)
{
HtmlNodeCollection avParts = availableProduct.ChildNodes;
String name = avParts.FindFirst("h2").InnerText;
String productUrl = "";
String src = "";
HtmlAttributeCollection imageAttributes = avParts.FindFirst("span").ChildNodes.FindFirst("img").Attributes;
HtmlAttributeCollection anchorttributes = availableProduct.ParentNode.ChildNodes.FindFirst("a").Attributes;
foreach (HtmlAttribute attr in imageAttributes)
{
if (attr.Name.ToUpper() == "SRC")
{
src = attr.Value;
break;
}
}
foreach (HtmlAttribute attr in anchorttributes)
{
if (attr.Name.ToUpper() == "HREF")
{
productUrl = "https://www.targetsportsusa.com" + attr.Value;
break;
}
}
Console.WriteLine(" " + name);
Console.WriteLine(" " + productUrl);
Console.WriteLine(" " + src);
Console.WriteLine();
}
}
}
}
}