Форум Игромании
 
Регистрация
Справка

Программирование Создание, разработка и доработка различных игр и программного обеспечения

Ответ
 
Опции темы
Старый 26.01.2014, 00:10   #141
Пугатель
 
Аватар для [CCCP] Monster

 
Регистрация: 26.06.2005
Адрес: Москва, СССР
Сообщений: 5,811
Репутация: 856 [+/-]
Pharaon, Возьми какой-нить парсер хтмл, или вообще руками из странички выдери. Жаваскрипт - лучше не надо, ему виртуальную машину надо, и там, возможно, придется запилить какие-то браузерные методы, которых изначально в машине нету.

Еще стековерфлоу никто не отменял:

http://stackoverflow.com/questions/6...tml-with-c-net
__________________
Служу Советскому Союзу!

Хорошо смеется тот, кто стреляет первым! (танкистская мудрость)
[CCCP] Monster на форуме  
Отправить сообщение для [CCCP] Monster с помощью Skype™ Ответить с цитированием
Старый 26.01.2014, 05:08   #142
Игрок
 
Аватар для Pharaon
 
Регистрация: 14.06.2006
Адрес: Future
Сообщений: 675
Репутация: 154 [+/-]
[CCCP] Monster,
Суть не в самом парсинге а в скорости обработки страницы и выполнении js кода. Я бы с радостью его не выполнял, но Надо!
Сейчас у меня данные скачиваются WebClient'ом в строку, строка загружается в парсер, в парсере ищется ссылка на страницу и та загружается в браузере, браузер жмет кнопку на которой завязан ajax-метод(иначе бы скрытый блок все равно был в ихсоднике страницы как я понимаю), открывающий данные, именно эти данные я и забираю.
Суть именно в скорости, так как обработка 40 ссылок занимает около 20-30 секунд, учитывая что на каждую ссылку выделяется по потоку, да даже по 10 ссылок на поток...
bober_maniac,
Вообще я уже думал вставить вебкит, хромиум но пугает именно нативность, нет ли для него простеньких врапперов, подходящих для моих целей?
Я спрашиваю тут в целях экономии времени и надежде быть может услышать еще какие советы. А так конечно потратить лишнее время на встраивание и разбор, быть может написание враппера это наш выбор.

Забыл упомянуть, отображение сайта не требуется
__________________
Understanding is impossible...
Η κατανόηση είναι αδύνατο
理解することは不可能である
समझना असंभव है

Mr. Freeman +1

[url=https://deepbit.net][img]https://deepbit.net/userbar/4f1ea27f06917288bf000000_375ff6ce34.png[/img][/url]

Последний раз редактировалось Pharaon; 26.01.2014 в 10:18.
Pharaon вне форума  
Отправить сообщение для Pharaon с помощью ICQ Отправить сообщение для Pharaon с помощью Skype™ Ответить с цитированием
Старый 26.01.2014, 12:30   #143
Пугатель
 
Аватар для [CCCP] Monster

 
Регистрация: 26.06.2005
Адрес: Москва, СССР
Сообщений: 5,811
Репутация: 856 [+/-]
Pharaon, ajax-запрос - это обычное подключение и скачивание данных по ссылке. Может тебе следует выпарсить эту ссылку из js? Если она там динамически образуется, можно написать то же самое на шарпе и просто получить http-запросом опять же строку, также как тебе XMLHTTPRequest возвращает.
__________________
Служу Советскому Союзу!

Хорошо смеется тот, кто стреляет первым! (танкистская мудрость)
[CCCP] Monster на форуме  
Отправить сообщение для [CCCP] Monster с помощью Skype™ Ответить с цитированием
Старый 11.02.2014, 18:56   #144
Игрок
 
Аватар для Pharaon
 
Регистрация: 14.06.2006
Адрес: Future
Сообщений: 675
Репутация: 154 [+/-]
[CCCP] Monster,
Попробовал сделать таким способом, но на серве походу стоит защита, данные получаются, но они намеренно искажаются (в данном случае получается номер телефона, если делать прямой запрос то код оператора всегда ставится фейковый). В конце концов использую awesomium (движок chromium без интерфейса) и доволен.

Но мой вопрос сейчас не об этом. То ли я чего-то недопонимаю, то ли что.
Задача следующая, вкратце. Составляется текстовый документ - каждая строчка ссылка на сайт. В программе я загружаю каждую ссылку, делаю парсинг контента и ожидаю повтора парсинга. Так вот путем нехитрых проверок пришел к выводу что System.Net.WebClient.DownloadString не распараллеливается. Пробовал его Async версию тоже самое. Подскажите что делать и как быть?

Полный текст тестовой программы:
Скрытый текст:

Цитата:
PHP код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Net;
using System.Diagnostics;

namespace 
TestTest
{
    class 
Program
    
{
        static List<
stringListUrl;

        static 
void Main(string[] args)
        {
            
ListUrl File.ReadAllLines("BAZA.txt").ToList();
            var 
listThread = new List<Thread>();

            while (
true)
            {
                
listThread.Clear();
                
Parallel.For(0ListUrl.Count, new Action<int>((int i) =>
                {
                    var 
th = new Thread(new ParameterizedThreadStart(thread), ListUrl.Count);
                    
listThread.Add(th);
                    
th.Start(i);
                }));

                
Console.ReadLine();
            }
        }

        static 
void thread(object obj)
        {
            
int i = (int)obj;

            var 
text "";
            
bool complete false;
            
Stopwatch sw = new Stopwatch();
            
sw.Start();
            var 
cl = new WebClient();
            
cl.DownloadStringCompleted += new DownloadStringCompletedEventHandler((object clientDownloadStringCompletedEventArgs e) =>
            {
                
text e.Result;
                
complete true;
            });
            
cl.DownloadStringAsync(new Uri(ListUrl[i]));

            while (!
complete)
            {
                
Thread.Sleep(50);
            }
            
sw.Stop();
            
Console.WriteLine(i.ToString() + " номер. " sw.Elapsed.ToString());
        }
    }



Суть в том что работа потоков идет параллельно вплоть до того момента когда нам нужно скачать строку. В итоге чем больше ссылок тем дольше мы ждем окончания последнего потока (когда как они должны завершаться примерно одинаково).
__________________
Understanding is impossible...
Η κατανόηση είναι αδύνατο
理解することは不可能である
समझना असंभव है

Mr. Freeman +1

[url=https://deepbit.net][img]https://deepbit.net/userbar/4f1ea27f06917288bf000000_375ff6ce34.png[/img][/url]

Последний раз редактировалось Pharaon; 11.02.2014 в 19:02.
Pharaon вне форума  
Отправить сообщение для Pharaon с помощью ICQ Отправить сообщение для Pharaon с помощью Skype™ Ответить с цитированием
Старый 14.02.2014, 14:09   #145
Пугатель
 
Аватар для [CCCP] Monster

 
Регистрация: 26.06.2005
Адрес: Москва, СССР
Сообщений: 5,811
Репутация: 856 [+/-]
Pharaon, Понятно, что задачу ты уже решил, но все же, если вдруг по какой-то причине эта штука от тебя ускользнула. Есть прога, TCPView, позволяющая поснифать весь IP трафик на твоей тачке. Можно выбрать нужный процесс и подключение и посмотреть, чем обмениваются браузер и сервер, например, что позволит правильно сформировать запрос, если вдруг в следующий раз возникнет проблема с хитростями их отправки и получения.

Цитата:
Так вот путем нехитрых проверок пришел к выводу что System.Net.WebClient.DownloadString не распараллеливается. Пробовал его Async версию тоже самое. Подскажите что делать и как быть?
Я не уверен, но подозреваю, что DownloadString использует в тайне от тебя функционал WinHTTP, а у него стоит ограничение на количество потоков с одного и того же хоста (Майкрософт оправдывается каким-то стандартом HTTP протокола, не помню уже). И вот по умолчанию это количество одновременных закачек равно 2. Его можно увеличить в реестре, или использовать какие-то другие методы. В любом случае, погугли в эту сторону.
__________________
Служу Советскому Союзу!

Хорошо смеется тот, кто стреляет первым! (танкистская мудрость)
[CCCP] Monster на форуме  
Отправить сообщение для [CCCP] Monster с помощью Skype™ Ответить с цитированием
Старый 14.02.2014, 15:06   #146
Игрок
 
Аватар для Pharaon
 
Регистрация: 14.06.2006
Адрес: Future
Сообщений: 675
Репутация: 154 [+/-]
Потихоньку разбирался и пока решил заменить скачку прямым запросом с сокетов. Но и тут возникла беда.
На каждую ссылку открываю по сокету (не знаю правильно или нет, когда их будет от 30 до 200), каждые 5 секунд шлю заранее сформированный хедер, получаю нужный ответ. Все бы ничего но примерно к 20-30 сокету (работает то все параллельно) они начинают выдавать 0 полученных байт (причем если параллельно открывать оперу и перейти по той же ссылке опера тоже говорит что сервер не ответил, однако файрфокс всегда отвечает, наверное связано с архитектурой брузера), причем отсылка в сокет работает нормально. то бишь сервер получает хедер но ничего не возвращает. В итоге при таком сценарии я закрываю сокет создаю заново подключаю и получаю ответ, в итоге возвращается что нужно. Однако количество закрытый открытый одного и того же сокета может проходить от 2 до 40 раз подряд, что конечно замедляет работу. Но даже при таком сценарии опрос 70 ссылок снизился с 30 секунд до 10-13, из этих 10 около 8 тратится на переоткрытие сокетов.
В общем в сетевой части я полный профан, столько всякой ерунды всплывает уже не знаешь куда копать.

Насчет winhttp спасибо, в итоге хочу прийти к такому решению где я бы точно понимал что откуда и как, а не иметь всякие непонятности.

Цитата:
чем обмениваются браузер и сервер, например, что позволит правильно сформировать запрос, если вдруг в следующий раз возникнет проблема с хитростями их отправки и получения.
Я снифал трафик с помощью Charles. Вся проблема вот в чем.
За кнопочкой с аджаксом скрыт телефон, телефон получается из хмл, к которому можно обратиться напрямую, но иногда нужна капча. Так вот сама капча в хмле не присутствует, но ему нужен ответ с неё, а значит я должен откуда-то брать картинку. Это время нужно на исследование которого у меня пока нет. Поэтому на ближайший месяц хрома мне хватит (хотя отказаться от него и все делать через сетевой обмен было бы идеально)

Бывает думаю стоит или нет сделать дллку на плюсах для решения сетевых задач а потом из дотНЕта уже использовать... сильно поможет или те же проблемы будут возникать?
__________________
Understanding is impossible...
Η κατανόηση είναι αδύνατο
理解することは不可能である
समझना असंभव है

Mr. Freeman +1

[url=https://deepbit.net][img]https://deepbit.net/userbar/4f1ea27f06917288bf000000_375ff6ce34.png[/img][/url]

Последний раз редактировалось Pharaon; 14.02.2014 в 15:13.
Pharaon вне форума  
Отправить сообщение для Pharaon с помощью ICQ Отправить сообщение для Pharaon с помощью Skype™ Ответить с цитированием
Старый 14.02.2014, 21:51   #147
Пугатель
 
Аватар для [CCCP] Monster

 
Регистрация: 26.06.2005
Адрес: Москва, СССР
Сообщений: 5,811
Репутация: 856 [+/-]
Pharaon, Если тебе пришел 0 байт (а шарповые сокеты, опять же, в тайне от тебя, используют WinSock2 sockets из няшной Сишки), стало быть, состояние сокета изменилось и надо бы его обработать. То есть или ошибка там, или еще что - это уже тебе надо выяснить. куча сокетов для общения с разными ресурсами - это ок, подругому все равно не сделаешь в параллели.

У тебя сокеты синхронные? Ты на каждый по потоку выделяешь и сидишь в нем, ждешь ответа через recv? Сервер - это твое хозяйство, т.е. ты к нему вообще как-то доступ имеешь, или эта третья фигня, типа черный ящик?
__________________
Служу Советскому Союзу!

Хорошо смеется тот, кто стреляет первым! (танкистская мудрость)
[CCCP] Monster на форуме  
Отправить сообщение для [CCCP] Monster с помощью Skype™ Ответить с цитированием
Старый 14.02.2014, 22:39   #148
Игрок
 
Аватар для Pharaon
 
Регистрация: 14.06.2006
Адрес: Future
Сообщений: 675
Репутация: 154 [+/-]
[CCCP] Monster,
Да, в каждом потоке выделаю сокет который слушает recv, сокет синхронный. К серверу доступ не имею, просто левый сайт.
На си я когда-то давно использовал сокеты, чувствую нужно освежить память.
Есть советы как это изменившееся состояние обработать?
__________________
Understanding is impossible...
Η κατανόηση είναι αδύνατο
理解することは不可能である
समझना असंभव है

Mr. Freeman +1

[url=https://deepbit.net][img]https://deepbit.net/userbar/4f1ea27f06917288bf000000_375ff6ce34.png[/img][/url]
Pharaon вне форума  
Отправить сообщение для Pharaon с помощью ICQ Отправить сообщение для Pharaon с помощью Skype™ Ответить с цитированием
Старый 17.02.2014, 19:55   #149
Пугатель
 
Аватар для [CCCP] Monster

 
Регистрация: 26.06.2005
Адрес: Москва, СССР
Сообщений: 5,811
Репутация: 856 [+/-]
Pharaon,
Цитата:
To check status, use getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, &error_code, sizeof(error_code))
Какой же все-таки няшка этот Джоел Спольски и его Stack Overflow
__________________
Служу Советскому Союзу!

Хорошо смеется тот, кто стреляет первым! (танкистская мудрость)
[CCCP] Monster на форуме  
Отправить сообщение для [CCCP] Monster с помощью Skype™ Ответить с цитированием
Старый 17.02.2014, 20:21   #150
Игрок
 
Аватар для Pharaon
 
Регистрация: 14.06.2006
Адрес: Future
Сообщений: 675
Репутация: 154 [+/-]
Да я имел ввиду стандартные дотнетовские средства, ну ок будем инвокить. Я уже так сделал
__________________
Understanding is impossible...
Η κατανόηση είναι αδύνατο
理解することは不可能である
समझना असंभव है

Mr. Freeman +1

[url=https://deepbit.net][img]https://deepbit.net/userbar/4f1ea27f06917288bf000000_375ff6ce34.png[/img][/url]
Pharaon вне форума  
Отправить сообщение для Pharaon с помощью ICQ Отправить сообщение для Pharaon с помощью Skype™ Ответить с цитированием
Старый 02.03.2014, 15:59   #151
Кандидат наук
 
Аватар для pokibor
 
Регистрация: 13.06.2005
Адрес: 0x00000000
Сообщений: 7,637
Репутация скрыта [+/-]
У меня довольно глупый вопрос. Я всю жизнь сам, явно прописывал транзакции. Однако недавно столкнулся с кодом, где для работы с БД применяется TransactionScope. Так вот: может ли кто-то объяснить мне преимущества применения этого класс в работе с одной-единственной БД?
Что TransactionScope предназначен для распределенных транзакций - это ясно. Наверное, в таких случаях из него можно извлечь пользу. Хотя на мой взгляд, неявные транзакции в любом случае затрудняют понимание кода и отладку ошибок. Если можно, хотелось бы услышать, насколько я прав и в этом утверждении.
__________________
Товарищ, верь: пройдет она -
Эпоха лживых, злых понятий.
Весь мир очнется ото сна,
И на обломках "демократий"
Напишут наши имена!

Мы были волшебницами (оригинальное фентези)
Тень Войны (фанфик по ГП)
pokibor вне форума  
Отправить сообщение для pokibor с помощью ICQ Ответить с цитированием
Ответ

Метки
c#, обсуждение, помощь, программирование

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 14:39.


Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Rambler's Top100 Яндекс цитирования