Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml.Serialization;
- using System.Net.Http;
- using System.Text.RegularExpressions;
- using System.Data.SqlClient;
- using System.Data;
- namespace ConsoleApplication1
- {
- public static class SCPLoader
- {
- private static SqlMaker sql = new SqlMaker("Server=(localdb)\\mssqllocaldb;Database=GunShop;Trusted_Connection=True;MultipleActiveResultSets=true");
- public static async void LoadScps(IEnumerable<int> ids)
- {
- List<Task> TaskList = new List<Task>();
- foreach (var id in ids)
- {
- var LastTask = new Task(() => loadScp(id, true));
- LastTask.Start();
- TaskList.Add(LastTask);
- }
- await Task.WhenAll(TaskList.ToArray());
- Console.WriteLine("DONE");
- }
- private static async void loadScp(int scpid, bool verbose)
- {
- Console.WriteLine("Loading scp " + scpid);
- var html = "";
- try
- {
- html = await LoadHtmlAsync("http://scpfoundation.ru/scp-" + scpid);
- }
- catch
- {
- Console.WriteLine("Cannot load scp " + scpid);
- return;
- }
- var classregexp = new Regex("<p><strong>Класс объекта:<\\/strong> <a href=\"\\/\\w+");
- var scpclass = classregexp
- .Match(html)
- .Value
- .Replace("<p><strong>Класс объекта:</strong> <a href=\"/", "");
- var descregexp = new Regex("<strong>Описание:<\\/strong>(.|\n)+<div class=\"page-tags\">");
- var desc = FlushHTML(descregexp
- .Match(html)
- .Value);
- if (verbose)
- {
- Console.WriteLine(scpid);
- Console.WriteLine(scpclass);
- if (desc.Length > 50)
- {
- Console.WriteLine(desc.Substring(0, 50) + "...\n\n");
- }
- else
- {
- Console.WriteLine(desc + "...\n\n");
- }
- }
- var outp = "";
- sql.TryExecuteQuery($"INSERT INTO Objects VALUES ({scpid},N'{scpclass}',N'{desc}')", ref outp);
- }
- private static string FlushHTML(string input)
- {
- return Regex.Replace(input, "<.*?>", string.Empty);
- }
- private static async Task<string> LoadHtmlAsync(string url)
- {
- using (HttpClient client = new HttpClient())
- using (HttpResponseMessage response = await client.GetAsync(url))
- using (HttpContent content = response.Content)
- {
- // ... Read the string.
- string result = await content.ReadAsStringAsync();
- // ... Display the result.
- if (result != null &&
- result.Length >= 50)
- {
- Console.WriteLine(result.Substring(0, 50) + "...");
- }
- return result;
- }
- }
- }
- class Program
- {
- static SqlMaker sql = new SqlMaker("Server=(localdb)\\mssqllocaldb;Database=GunShop;Trusted_Connection=True;MultipleActiveResultSets=true");
- static void Main()
- {
- Task t = new Task(() => SCPLoader.LoadScps(Enumerable.Range(0, 2000)));
- t.Start();
- Console.WriteLine("Downloading page...");
- Console.ReadLine();
- }
- }
- public class SqlMaker
- {
- private readonly string _connectionString;
- public SqlMaker(string connectionString)
- {
- _connectionString = connectionString;
- }
- public bool TryExecuteQuery(string query, ref string output)
- {
- using (var con = new SqlConnection(_connectionString))
- {
- con.Open();
- try
- {
- var command = new SqlCommand(query, con);
- using (command)
- {
- var result = command.ExecuteReader();
- var heading = string.Join(",", Enumerable.Range(0, result.FieldCount)
- .Select(i => result.GetName(i))) + "\n";
- var rows = ReadAllRows(result);
- output = heading + string.Join("", RowsToStrings(rows));
- return true;
- }
- }
- catch (SqlException ex)
- {
- output = ex.Message;
- return false;
- }
- }
- }
- private static IEnumerable<IDataRecord> ReadAllRows(SqlDataReader reader)
- {
- using (reader)
- {
- while (reader.Read())
- {
- yield return reader;
- }
- }
- }
- private static IEnumerable<string> RowsToStrings(IEnumerable<IDataRecord> rows)
- {
- foreach (var r in rows)
- {
- var t = new List<string>();
- for (int i = 0; i < r.FieldCount; i++)
- {
- t.Add(r[i].ToString());
- }
- yield return $"{string.Join(",", t)}\n";
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement