Написание логики парсинга выбранных сайтов



 

В качестве площадок, базы цен которых будут представлены в будущей программе, были выбраны следующие сайты:

1. https://opskins.com – крупнейшая торговая площадка, позволяющая пользователям покупать и продавать внутриигровые предметы из более чем 25 игр. Предоставляет публичное API.

2. https://bitskins.com – еще одна крупная торговая площадка. Ее особенностью является возможность быстрой продажи предметов по запросам автоматической покупки, созданным пользователями, а также мгновенный вывод баланса сайта на кошельки криптовалют – Bitcoin, Ethereum, Litecoinи другие. Предоставляет публичное API.

3. https://cs.money– крупнейший в мире «обменник» предметов CS:GO, предлагающий пользователям автоматический обмен их предметов на предметы, находящиеся на ботах сайта. Стоимость одного и того же предмета на ввод меньше, чем на вывод. Нет публичного API.

4. https://loot.farm – сайт-«обменник», который предлагает для трейда предметы из 4 игр. Нет публичного API, но есть список всех предметов и их цен в общем доступе.

Определившись с выбором площадок, необходимо продумать способ получения списка всех предметов. И если в случае с первым и вторым сайтами, которые при помощи публичного APIпозволяют получить список всех предметов конкретной игры на сайте и их минимальные цены (а также максимальную цену среди запросов на автоматическую покупку на сайте BitSkins) в формате JSON, а также с четвертым сайтом, который предоставляет открытый список предметов и цен в том же формате JSON, то с сайтом cs.moneyне все так просто. Для того, чтобы получить список всех предметов, необходимо проанализировать весь трафик, генерируемый при загрузке и работе с сайтом. В результате этих манипуляций при помощи консоли разработчика Googleбыло установлено, что работа со списком всех предметов происходит посредством двух файлов: один содержит код предмета на этом сайте и его стоимость, а другой – пару код-название. Соответственно, для составления базы цен этого сайта необходимо соотнести по коду стоимость из одного файла и название из другого.

Для парсинга результатов, полученных после обращения к API или к файлам использовались два метода: средствами библиотеки Newtonsoft.JSON в случаях, когда JSONфайл можно явно преобразовать в классы, и при помощи регулярных выражений в случаях, когда этого сделать нельзя. Примеры реализации парсинга этими двумя способами приведены в листингах 3.1 и 3.2 соответственно.

Листинг 3.1 – Реализация парсинга сайта loot.farmсредствами библиотеки Newtonsoft.JSON

public class Loot {    public Thing[] stuff; }   public class Thing {    public string name;    public string price;    public string have;    public string max;      public override string ToString()    {        return string.Format("{0} price: {1} have: {2} max: {3}", name, price, have, max); } }   /* другойкод */   Loot loot = JsonConvert.DeserializeObject<Loot>(Out);        foreach (Thing thing in loot.stuff)        {            sw.WriteLine(thing);            if (filename.Contains("CS"))            {                for (int i = 0; i < AllTable_CS.GetLength(0); i++)                {                    if (thing.name == AllTable_CS[i, 0])                    {                        AllTable_CS[i, 7] = Convert.ToString(Convert.ToDouble(thing.price) / 100);                        AllTable_CS[i, 8] = Convert.ToString(DateTime.Now);                        AllTable_CS[i, 9] = thing.have + "/" + thing.max;                    }                    else if (AllTable_CS[i, 0] == "-")                    {                        AllTable_CS[i, 0] = thing.name;                        AllTable_CS[i, 7] = Convert.ToString(Convert.ToDouble(thing.price) / 100);                        AllTable_CS[i, 8] = Convert.ToString(DateTime.Now);                        AllTable_CS[i, 9] = thing.have + "/" + thing.max;                    }                }            }            else if (filename.Contains("DOTA"))            {                for (int i = 0; i < AllTable_DOTA.GetLength(0); i++)                {                    if (thing.name == AllTable_DOTA[i, 0])                    {                        AllTable_DOTA[i, 5] = Convert.ToString(Convert.ToDouble(thing.price) / 100);                        AllTable_DOTA[i, 6] = Convert.ToString(DateTime.Now);                        AllTable_DOTA[i, 7] = thing.have + "/" + thing.max;                    }                    else if (AllTable_DOTA[i, 0] == "-")                    {                        AllTable_DOTA[i, 0] = thing.name;                        AllTable_DOTA[i, 5] = Convert.ToString(Convert.ToDouble(thing.price) / 100);                        AllTable_DOTA[i, 6] = Convert.ToString(DateTime.Now);                        AllTable_DOTA[i, 7] = thing.have + "/" + thing.max; }                }            }        }

 

Листинг 3.2 – Парсинг файла, содержащего коды и названия предметов на сайте cs.money

 

string splitstring = "},";        string[] OutStr = Regex.Split(Out, splitstring);        StreamWriter test = new StreamWriter("test.txt");        int nom = 1;        for (int i = 0; i < OutStr.Length; i++)        {            string pat = @"{""m"":";            Regex rg = new Regex(pat);            OutStr[i] = rg.Replace(OutStr[i], "");            OutStr[i] = OutStr[i] + " EnD";            string pat1 = @""","".* EnD";            Regex rg1 = new Regex(pat1);            OutStr[i] = rg1.Replace(OutStr[i], " EnD");            string ch = @" EnD";            Regex rg2 = new Regex(ch);            OutStr[i] = rg2.Replace(OutStr[i], "");            string da = @"""";            Regex rg3 = new Regex(da);            OutStr[i] = rg3.Replace(OutStr[i], "");            sw.WriteLine(OutStr[i]);            if (i == OutStr.Length - 1)                nom = Convert.ToInt32(OutStr[i].Substring(0, OutStr[i].IndexOf(':')));          }        sw.Close();          string[] Prices = new string [nom + 1];          for (int i = 0; i < Prices.Length; i++)            Prices[i] = "";        for (int i = 0; i < OutStr.Length; i++)        {            if (OutStr[i].Contains(':')) {                int n = Convert.ToInt32(OutStr[i].Substring(0, OutStr[i].IndexOf(':')));                Prices[n] = OutStr[i].Substring(OutStr[i].IndexOf(':') + 1);   }        }

По результатам парсинга каждого сайта заполняется массив из названия предмета, его цены и времени парсинга, каждый из который впоследствии объединяется в единый массив.


Дата добавления: 2018-08-06; просмотров: 217; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!