Advertisement
Guest User

eeeee Maxeeeem

a guest
Jan 18th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.59 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Xml.Serialization;
  8. using System.Net.Http;
  9. using System.Text.RegularExpressions;
  10. using System.Data.SqlClient;
  11. using System.Data;
  12.  
  13. namespace ConsoleApplication1
  14. {
  15.    
  16.  
  17.     public static class SCPLoader
  18.     {
  19.         private static SqlMaker sql = new SqlMaker("Server=(localdb)\\mssqllocaldb;Database=GunShop;Trusted_Connection=True;MultipleActiveResultSets=true");
  20.  
  21.         public static async void LoadScps(IEnumerable<int> ids)
  22.         {
  23.             List<Task> TaskList = new List<Task>();
  24.             foreach (var id in ids)
  25.             {
  26.                 var LastTask = new Task(() => loadScp(id, true));
  27.                 LastTask.Start();
  28.                 TaskList.Add(LastTask);
  29.             }
  30.  
  31.             await Task.WhenAll(TaskList.ToArray());
  32.             Console.WriteLine("DONE");
  33.         }
  34.  
  35.  
  36.  
  37.         private static async void loadScp(int scpid, bool verbose)
  38.         {
  39.             Console.WriteLine("Loading scp " + scpid);
  40.             var html = "";
  41.             try
  42.             {
  43.                 html = await LoadHtmlAsync("http://scpfoundation.ru/scp-" + scpid);
  44.             }
  45.             catch
  46.             {
  47.                 Console.WriteLine("Cannot load scp " + scpid);
  48.                 return;
  49.             }
  50.  
  51.  
  52.             var classregexp = new Regex("<p><strong>Класс объекта:<\\/strong> <a href=\"\\/\\w+");
  53.             var scpclass = classregexp
  54.                 .Match(html)
  55.                 .Value
  56.                 .Replace("<p><strong>Класс объекта:</strong> <a href=\"/", "");
  57.  
  58.             var descregexp = new Regex("<strong>Описание:<\\/strong>(.|\n)+<div class=\"page-tags\">");
  59.             var desc = FlushHTML(descregexp
  60.                 .Match(html)
  61.                 .Value);
  62.  
  63.             if (verbose)
  64.             {
  65.                 Console.WriteLine(scpid);
  66.                 Console.WriteLine(scpclass);
  67.                 if (desc.Length > 50)
  68.                 {
  69.                     Console.WriteLine(desc.Substring(0, 50) + "...\n\n");
  70.                 }
  71.                 else
  72.                 {
  73.                     Console.WriteLine(desc + "...\n\n");
  74.                 }
  75.             }
  76.             var outp = "";
  77.             sql.TryExecuteQuery($"INSERT INTO Objects VALUES ({scpid},N'{scpclass}',N'{desc}')", ref outp);
  78.  
  79.         }
  80.  
  81.         private static string FlushHTML(string input)
  82.         {
  83.             return Regex.Replace(input, "<.*?>", string.Empty);
  84.         }
  85.  
  86.         private static async Task<string> LoadHtmlAsync(string url)
  87.         {
  88.             using (HttpClient client = new HttpClient())
  89.             using (HttpResponseMessage response = await client.GetAsync(url))
  90.             using (HttpContent content = response.Content)
  91.             {
  92.                 // ... Read the string.
  93.                 string result = await content.ReadAsStringAsync();
  94.  
  95.                 // ... Display the result.
  96.                 if (result != null &&
  97.                     result.Length >= 50)
  98.                 {
  99.                     Console.WriteLine(result.Substring(0, 50) + "...");
  100.                 }
  101.                 return result;
  102.             }
  103.         }
  104.  
  105.     }
  106.  
  107.     class Program
  108.     {
  109.         static SqlMaker sql = new SqlMaker("Server=(localdb)\\mssqllocaldb;Database=GunShop;Trusted_Connection=True;MultipleActiveResultSets=true");
  110.  
  111.         static void Main()
  112.         {
  113.             Task t = new Task(() => SCPLoader.LoadScps(Enumerable.Range(0, 2000)));
  114.             t.Start();
  115.             Console.WriteLine("Downloading page...");
  116.             Console.ReadLine();
  117.         }
  118.  
  119.        
  120.     }
  121.  
  122.  
  123.     public class SqlMaker
  124.     {
  125.  
  126.         private readonly string _connectionString;
  127.  
  128.         public SqlMaker(string connectionString)
  129.         {
  130.             _connectionString = connectionString;
  131.         }
  132.  
  133.         public bool TryExecuteQuery(string query, ref string output)
  134.         {
  135.             using (var con = new SqlConnection(_connectionString))
  136.             {
  137.                 con.Open();
  138.                 try
  139.                 {
  140.                     var command = new SqlCommand(query, con);
  141.                     using (command)
  142.                     {
  143.                         var result = command.ExecuteReader();
  144.                         var heading = string.Join(",", Enumerable.Range(0, result.FieldCount)
  145.                             .Select(i => result.GetName(i))) + "\n";
  146.  
  147.                         var rows = ReadAllRows(result);
  148.                         output = heading + string.Join("", RowsToStrings(rows));
  149.                         return true;
  150.                     }
  151.                 }
  152.                 catch (SqlException ex)
  153.                 {
  154.                     output = ex.Message;
  155.                     return false;
  156.                 }
  157.             }
  158.         }
  159.  
  160.  
  161.         private static IEnumerable<IDataRecord> ReadAllRows(SqlDataReader reader)
  162.         {
  163.             using (reader)
  164.             {
  165.                 while (reader.Read())
  166.                 {
  167.                     yield return reader;
  168.                 }
  169.             }
  170.         }
  171.  
  172.         private static IEnumerable<string> RowsToStrings(IEnumerable<IDataRecord> rows)
  173.         {
  174.             foreach (var r in rows)
  175.             {
  176.                 var t = new List<string>();
  177.                 for (int i = 0; i < r.FieldCount; i++)
  178.                 {
  179.                     t.Add(r[i].ToString());
  180.                 }
  181.                 yield return $"{string.Join(",", t)}\n";
  182.             }
  183.         }
  184.  
  185.  
  186.     }
  187.  
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement