skindervik

WEB-SCRAPING-ANGLE-SHARP-MAIN

Aug 3rd, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.29 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Threading;
  7. using System.Windows;
  8. using AngleSharp;
  9. using System.Net;
  10.  
  11. namespace webBot9000
  12. {
  13.     class GUI
  14.     {
  15.         public Application application;
  16.         public MainGui maingui;
  17.         public GUI()
  18.         {
  19.             //RUN GUI IN NEW THREAD
  20.             Thread GuiThread = new Thread(InitializeGUI);
  21.             //SET THE THREAD TO BE SPECIALLY FOR GUI
  22.             GuiThread.SetApartmentState(ApartmentState.STA);
  23.             //START THE THREAD
  24.             GuiThread.Start();
  25.         }
  26.         public void InitializeGUI()
  27.         {
  28.             //CREATE THE USER-CONTROL CLASS, THAT WILL BE OUR GUI
  29.             maingui = new MainGui();
  30.  
  31.             //CREATE NEW APPLICATION CLASS, THAT WILL RUN THE GUI WINDOWS
  32.             application = new System.Windows.Application();
  33.  
  34.             //CREATE A NEW GUI WINDOW
  35.             application.MainWindow = new System.Windows.Window();
  36.  
  37.             //SET SOME GUI WINDOW SETTINGS
  38.             application.MainWindow.Height = 450;
  39.             application.MainWindow.Width = 800;
  40.             //THIS WILL ABORT ALL OF THE THREADS
  41.             application.MainWindow.Closing += (x, e) => { Environment.Exit(0); };
  42.  
  43.             //SET OUR GUI WINDOW CONTENT TO OUR USER-CONTROL GUI CONTENT
  44.             application.MainWindow.Content = maingui;
  45.  
  46.             //SHOW THE WINDOW
  47.             application.MainWindow.Show();
  48.  
  49.             //RUN THE APPLICATION WHICH HANDLES THE RESPONSIVE GUI
  50.             application.Run();
  51.         }
  52.     }
  53.     class AngleSharp
  54.     {
  55.         //WE WILL STORE HERE ALL THE LINKS THAT WE CHECK
  56.         public List<string> AllLinks;
  57.  
  58.         //THIS IS FOR ANGLE-SHARP CONFIGURATION
  59.         IConfiguration config;
  60.         IBrowsingContext context;
  61.  
  62.         //THIS WILL BE USED FOR DOWNLOADING THE HTML FROM LINKS
  63.         WebClient client = new WebClient();
  64.  
  65.         public AngleSharp()
  66.         {
  67.             //CONFIGURE OUR HTML PARSER WHICH IS ANGLE-SHARP
  68.             config = Configuration.Default.WithDefaultLoader();
  69.             context = BrowsingContext.New(config);
  70.  
  71.             //CREATE LIST WHERE WE WILL STORE ALL LINKS
  72.             AllLinks = new List<string>();
  73.         }
  74.  
  75.         public async Task<List<string>> GetTheLinks(string url, string LookFor)
  76.         {
  77.             //LIST THAT WE WILL RETURN IF WE FIND ANY LINKS THAT CONTAINS THE SPECIFIED WORD
  78.             List<string> FoundLinks = new List<string>();
  79.  
  80.             //TRY DOWNLOADING HTML, PARSING IT, SEARCHING IT, IT CRASHES OFTEN BECAUSE OF BAD LINKS
  81.             try
  82.             {
  83.                 //DOWNLOAD THE SPECIFIED URL
  84.                 string source = client.DownloadString(url);
  85.  
  86.                 //PARSE THE DOWNLOADED HTML
  87.                 var HTML = await context.OpenAsync(req => req.Content(source));
  88.  
  89.                 //SEARCH FOR LINKS
  90.                 var LinkList = HTML.GetElementsByTagName("a");
  91.  
  92.                 //CONVERT LINKS TO STRINGS
  93.                 List<string> LinkList_Strings = LinkList.Select(item => item.GetAttribute("href")).ToList();
  94.  
  95.                 //CHECK EVERY STRING
  96.                 foreach (string item in LinkList_Strings)
  97.                 {
  98.                     //IF THE STRING IS A VALID LINK
  99.                     if (Uri.TryCreate(item, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
  100.                     {
  101.                         //IF WE ALREADY HAVE THE STRING
  102.                         if (!AllLinks.Contains(item))
  103.                         {
  104.                             //IF IT IS, ADD IT TO THE LIST
  105.                             AllLinks.Add(item);
  106.  
  107.                             //IF IT CONTAINS THE WORD, ADD IT TO FOUND-LINKS LIST TOO
  108.                             if (item.Contains(LookFor))
  109.                                 FoundLinks.Add(item);
  110.                         }
  111.                     }
  112.                 }
  113.             }
  114.             catch (Exception)
  115.             {
  116.                 //RETURN THE LIST IF IT CRASHES
  117.                 return FoundLinks;
  118.             }
  119.  
  120.             //RETURN THE LIST IF IT DOESN'T CRASH
  121.             return FoundLinks;
  122.         }
  123.     }
  124.     class main
  125.     {
  126.         //CLASS FOR CREATING GUI
  127.         static GUI gui;
  128.  
  129.         //CLASS FOR SEARCHING LINKS
  130.         static AngleSharp anglesharp;
  131.  
  132.         //BOOL FOR STOPPING THE SEARCH FOR THE LINKS
  133.         public static bool searching = false;
  134.  
  135.         static void Main()
  136.         {
  137.             //LOAD GUI
  138.             gui = new GUI();
  139.  
  140.             //LOAD ENGINE
  141.             anglesharp = new AngleSharp();
  142.         }
  143.  
  144.         public static void ToggleLinkSearch(string looking_at, string looking_for)
  145.         {
  146.             //GET BUTTON STATUS
  147.             string ButtonState = string.Empty;
  148.             Application.Current.Dispatcher.Invoke(() =>
  149.             {
  150.                 ButtonState = gui.maingui.SEARCH_BUTTON.Content.ToString();
  151.             });
  152.  
  153.             //IF BUTTON STATUS IS SET TO SEARCH - BEGIN SEARCH
  154.             if (ButtonState == "SEARCH")
  155.             {
  156.                 //RESET EVERYTHING BACK TO ZERO
  157.                 Application.Current.Dispatcher.Invoke(() =>
  158.                 {
  159.                     //RESET GUI COUNTER
  160.                     gui.maingui.COUNT.Text = "0";
  161.                     //RESET GUI LIST
  162.                     gui.maingui.ViewList.Items.Clear();
  163.                 });
  164.                 //RESET INTERNAL LINK LIST
  165.                 anglesharp.AllLinks.Clear();
  166.  
  167.                 //UPDATE SEARCH STATUS
  168.                 searching = true;
  169.  
  170.                 //ADD FIRST PAGE FROM WHERE WE WILL START
  171.                 anglesharp.AllLinks.Add(looking_at);
  172.  
  173.                 ////START NEW THREAD WITH INFINITE LOOP
  174.                 new Thread(async () => {
  175.  
  176.                     //GRABS A LINK FROM THE LIST AND SEARCHES IT
  177.                     for (int i = 0; searching == true; i++)
  178.                     {
  179.                         //SEARCH LINK FROM LIST, FOR SPECIFIED WORD
  180.                         var FoundLinks = await anglesharp.GetTheLinks(anglesharp.AllLinks[i], looking_for);
  181.  
  182.                         //UPDATE GUI
  183.                         Application.Current.Dispatcher.Invoke(() =>
  184.                         {
  185.                             //UPDATE THE COUNTER
  186.                             gui.maingui.COUNT.Text = anglesharp.AllLinks.Count.ToString();
  187.                             //IF WE FOUND LINKS, ADD THEM
  188.                             if (FoundLinks.Count > 0)
  189.                             {
  190.                                 //ADD THE LINKS
  191.                                 foreach (var item in FoundLinks)
  192.                                     gui.maingui.ViewList.Items.Add(item);
  193.                                 //FORCE SCROLL THE LIST TO THE BOTTOM
  194.                                 gui.maingui.ViewList.SelectedIndex = gui.maingui.ViewList.Items.Count - 1;
  195.                                 gui.maingui.ViewList.ScrollIntoView(gui.maingui.ViewList.SelectedItem);
  196.                             }
  197.                         });
  198.  
  199.                     }
  200.                     //UPDATE THE GUI AFTER LOOP WAS STOPPED
  201.                     Application.Current.Dispatcher.Invoke(() =>
  202.                     {
  203.                         //RESET BUTTON STATUS/TEXT
  204.                         gui.maingui.SEARCH_BUTTON.Content = "SEARCH";
  205.                         //ENABLE THE BUTTONN
  206.                         gui.maingui.SEARCH_BUTTON.IsEnabled = true;
  207.                     });
  208.                 }).Start();
  209.                 //UPDATE THE GUI AFTER THE LOOP WAS STARTED
  210.                 Application.Current.Dispatcher.Invoke(() =>
  211.                 {
  212.                     //SET BUTTON STATUS/TEXT TO STOP
  213.                     gui.maingui.SEARCH_BUTTON.Content = "STOP";
  214.                 });
  215.             }
  216.             //IF BUTTON STATUS IS STOP
  217.             else
  218.             {
  219.                 //UPDATE SEARCH STATUS
  220.                 searching = false;
  221.  
  222.                 //DISABLE THE BUTTON - IT WILL BE ENABLED AFTER THREAD STOPS - (AFTER LOOP)
  223.                 Application.Current.Dispatcher.Invoke(() =>
  224.                 {
  225.                     gui.maingui.SEARCH_BUTTON.IsEnabled = false;
  226.                 });
  227.             }
  228.  
  229.         }
  230.     }
  231. }
  232.  
Add Comment
Please, Sign In to add comment