загрузить CSV из Google Insight?

Я успешно делал это раньше в последние 4-5, может быть, 6 месяцев назад, но теперь я вижу, что сайт изменился. Я могу получить желаемый результат поиска, используя HTTPWEBREQUEST, проблема связана с загрузкой CSV файл.

Загрузка не будет работать, я воспроизведу то же самое, используя WEBCLIENT, чтобы получить все файлы cookie, но все равно это не сработает.

Когда я это делаю, я получаю это в файле

.....мета http-equiv="refresh" content="0; url='http://www.google.com/trends#content=1&geo=US-AL&q=snooker&cmpt=q&hl=en-AU'" > location.replace("http://www.google.com/trends#content\x3d1\x26geo\x3dUS-AL\x26q\x3dsnooker\x26cmpt\x3dq\x26hl\x3den-AU")

Код для загрузки файла выглядит следующим образом:

public void downloadsheet(string url, string path)
    {
        try
        {
            using (WebClient client = new WebClient())
            {



                string tmpCookieString = string.Empty;

                string[] array = webBrowser1.Document.Cookie.Split(new char[]
                        {
                            ';'
                        });
                for (int i = 0; i < array.Length; i++)
                {
                    string cookie = array[i];
                    string name = cookie.Split(new char[]
                            {
                                '='
                            })[0];
                    string value = cookie.Substring(name.Length + 1);

                    //client.Headers.Add(name, value);
                    if (i < array.Length - 1)
                    {
                        tmpCookieString = tmpCookieString + name + "=" + value + ";";
                    }
                    else
                    {
                        tmpCookieString = tmpCookieString + name + "=" + value;
                    }
                }

                client.Headers.Add(HttpRequestHeader.Cookie, tmpCookieString);
                client.Headers.Add("Accept", "text/html, application/xhtml+xml, */*");
                client.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2)");
                client.Headers.Add("Accept-Language", "en-US");
                using (FileStream file = File.Create(path))
                {
                    byte[] bytes = client.DownloadData(url);
                    file.Write(bytes, 0, bytes.Length);
                }
            }
        }
        catch (Exception exp_DE)
        {
        }
    }

URL используется:

http://www.google.com/trends/trendsReport?hl=en-AU&q=snooker&geo=US-AL&cmpt=q&content=1&export=2

Любая помощь высоко ценится.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Если я использую элемент управления WebBrowser для перехода к соответствующей ссылке выше, он открывает диалоговое окно.


person confusedMind    schedule 29.12.2012    source источник
comment
этот URL-адрес не вызывает диалоговое окно загрузки.. так что, возможно, он изменился.. что особенного в этой ссылке, что она вам нужна..пожалуйста, объясните немного подробнее, нажали ли вы на эту ссылку в веб-браузере..? это должно сказать вам, что это не работает ..   -  person MethodMan    schedule 29.12.2012
comment
@DJKRAZE я нажимаю это в Internet Explorer, записываю вывод скрипача и повторно использую его ... Если я делаю это в скрипаче (выполнить), он работает, но не в коде здесь ... и он действительно вызывает диалоговое окно, я только что щелкнул его для этого вам необходимо войти в систему.   -  person confusedMind    schedule 29.12.2012
comment
Попробовал в FireFox..не помогло..   -  person MethodMan    schedule 29.12.2012
comment
вам нужно отправить учетные данные, это то, что звучит как пользователь/пароль, поправьте меня, если я ошибаюсь в своем предположении   -  person MethodMan    schedule 29.12.2012
comment
@DJKRAZE я пробовал как в IE, так и в FireFox, и это работает, И да, для учетных данных, но разве они не восстанавливаются из файлов cookie в управлении веб-браузером при входе в систему?   -  person confusedMind    schedule 29.12.2012


Ответы (1)


Проблема заключается в том, что файлы cookie HttpOnly (т.е. SID и HSID) отсутствуют в WebBrowser.Document.Cookie для в целях безопасности.

Вот решение:

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref uint pcchCookieData, int dwFlags, IntPtr lpReserved);
const int INTERNET_COOKIE_HTTPONLY = 0x00002000;

private static string GetGlobalCookies(string uri)
{
    uint datasize = 2048;
    StringBuilder cookieData = new StringBuilder((int)datasize);
    if (InternetGetCookieEx(uri, null, cookieData, ref datasize, INTERNET_COOKIE_HTTPONLY, IntPtr.Zero)
        && cookieData.Length > 0)
    {
        return cookieData.ToString();
    }
    else
    {
        return null;
    }
}

public void downloadsheet(string url, string path)
{
    try
    {
        using (WebClient client = new WebClient())
        {
            string tmpCookieString = GetGlobalCookies(webBrowser1.Url.AbsoluteUri);

            client.Headers.Add(HttpRequestHeader.Cookie, tmpCookieString);

            client.Headers.Add("Accept", "text/html, application/xhtml+xml, */*");
            client.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.2)");
            client.Headers.Add("Accept-Language", "en-US");
            using (FileStream file = File.Create(path))
            {
                byte[] bytes = client.DownloadData(url);
                file.Write(bytes, 0, bytes.Length);
            }
        }
    }
    catch (Exception exp_DE)
    {
    }
}

Конечно, вы должны войти в свою учетную запись перед вызовом InternetGetCookieEx.

person bwdeng    schedule 29.12.2012
comment
вход в систему из веб-браузера отличается от т.е.? - person confusedMind; 29.12.2012
comment
дело в том, что это работает :), но все же любопытно, почему у него не будет файлов cookie из управления браузером, это то же самое, не так ли ... - person confusedMind; 29.12.2012
comment
Это будет то же самое, если вы выберете «Оставаться в системе». Элементы управления IE и WebBrowser обычно совместно используют постоянные файлы cookie (сеансовые файлы cookie по своей природе для каждого процесса не используются совместно). - person bwdeng; 29.12.2012
comment
Файлы cookie доступны, но вы просто не можете получить файлы cookie httponly через WebBrowser.Document (т. е. HTML DOM). - person bwdeng; 29.12.2012