Google URL очищает, не зацикливая строки в списке - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь отсканировать результаты поиска Google, инструмент должен просматривать страницы одну за другой. Однако проблема заключается в том, что он не берет весь список из списка. Это просто работает для первой строки списка.

Startbtn код

  foreach (string url in urlList.Items)
            {
                webBrowser1.Navigate("https://www.google.com/search?q=" + url);
                await PageLoad(30, 5);
                MessageBox.Show("sdsaD3");
                string pageSource = webBrowser1.DocumentText;
                Scrape(pageSource);
            }

- Метод очистки

  private async void Scrape(string pageSource)
        {
                string regexExpression = "(?<=><div class=\"rc\"><div class=\"r\"><a href=\")(.*?)(?=\" onmousedown=)";
                Regex match = new Regex(regexExpression, RegexOptions.Singleline);
                MatchCollection collection = Regex.Matches(pageSource, regexExpression);
                for (int i = 0; i < collection.Count; i++)
                {
                CommonCodes.WriteToTxt(collection[i].ToString(), "googlescrapedurls.txt");
                if (i == collection.Count - 1)
                {
                    var elementid = webBrowser1.Document.GetElementById("pnnext");
                    if (elementid != null)
                    {
                        for (int w = 0; w < 1; w++)
                        {
                            BackgroundWorker worker = new BackgroundWorker();
                            worker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
                            worker.RunWorkerAsync(w);
                        }
                    }
                    else if(webBrowser1.Document.GetElementById("pnnext") == null)
                    {
                          for(int pg=0; pg< urlList.Items.Count; pg++)
                    {
                      webBrowser1.Navigate("https://www.google.com/search?q=" + urlList.Items[pg+1]);
                        CommonCodes.WaitXSeconds(10);
                        //await PageLoad(30, 5);
                        Scrape(webBrowser1.DocumentText);
                    }
                    }
                }


             }

-

Background worker code:
       BackgroundWorker backgroundWorker = sender as BackgroundWorker;
            webBrowser1.Invoke(new Action(() => { gCaptcha(); }));
            webBrowser1.Invoke(new Action(() => { webBrowser1.Document.GetElementById("pnnext").InvokeMember("Click"); }));
            await PageLoad(30, 5);
            webBrowser1.Invoke(new Action(() => { Scrape(webBrowser1.DocumentText); }));

код загрузки страницы

try
{
    TaskCompletionSource<bool> PageLoaded = null;
    PageLoaded = new TaskCompletionSource<bool>();
    int TimeElapsed = 0;
    webBrowser1.DocumentCompleted += (s, e) =>
    {
        if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;
        if (PageLoaded.Task.IsCompleted) return; PageLoaded.SetResult(true);
    };
    //
    while (PageLoaded.Task.Status != TaskStatus.RanToCompletion)
    {
        await Task.Delay(delay * 1000);//interval of 10 ms worked good for me
        TimeElapsed++;
        if (TimeElapsed >= TimeOut * 100) PageLoaded.TrySetResult(true);
    }
}
catch (Exception ex)
{
    CommonCodes.WriteLog(ex.ToString());
    MessageBox.Show(ex.Message);
}

- Основная проблема заключается в том, что у меня 5 строк в списке, только для первой строки он идет на каждую страницу и просматривает URL-адреса, а для других строк он не работает должным образом. Я не понимаю проблему с в коде. Кое-как код

MessageBox.Show("sdsaD3");

выполнение несколько раз (если 5 строк в списке, то это сообщение отображается 5 раз). Спасибо за помощь.

РЕДАКТИРОВАТЬ: Я нашел проблему, кажется, проблема с await PageLoad (30, 5); но я не уверен, как вызвать асинхронный метод. У кого-нибудь есть идеи?

...