Написание логики парсинга выбранных сайтов
В качестве площадок, базы цен которых будут представлены в будущей программе, были выбраны следующие сайты:
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!