Bobzilla Donovan Ответов: 4

Почему я не могу использовать scrapysharp в форме windows?


Я выяснил, как использовать scrapysharp в консольном приложении. Но когда я переключился на использование формы (для лучшего пользовательского интерфейса), программа передала эту строку кода:

WebPage PageResult = Browser.NavigateToPage(new Uri("http://192.168.1.99"));


Что я уже пробовал:

Вот полное консольное приложение:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using ScrapySharp.Core;
using ScrapySharp.Html.Parsing;
using ScrapySharp.Network;
using HtmlAgilityPack;
using ScrapySharp.Extensions;
using ScrapySharp.Html.Forms;

namespace SampleScraperClient
{
    class Program
    {
        static void Main(string[] args)
        {
            // setup the browser
            ScrapingBrowser Browser = new ScrapingBrowser();
            Browser.AllowAutoRedirect = true; // Browser has many settings you can access in setup
            Browser.AllowMetaRedirect = true;
            //go to the home page
            WebPage PageResult = Browser.NavigateToPage(new Uri("http://192.168.1.99/"));
            // get first piece of data, the page title
            HtmlNode Center = PageResult.Html.CssSelect("Center").First();
            string Bobby = Center.InnerText;
            Console.WriteLine(Bobby);
            // find a form and send back data
            //PageWebForm form = PageResult.FindFormById("dataForm");
            // assign values to the form fields

            //Console.ReadKey();
            //Console.WriteLine(Bobby);
            Console.ReadKey();
            Console.WriteLine("this far");

            string test = Bobby;
            string search = "T1";
            int foundPos = findPermutation(test, search);
            Console.WriteLine(foundPos);
            if (foundPos != -1)
            {
                Console.WriteLine(test.Substring(foundPos, search.Length));
                Console.WriteLine(" ");
                
                char[] x = { Bobby[foundPos + 5], Bobby[foundPos + 6], Bobby[foundPos + 7], Bobby[foundPos + 8] };
                string T1 = new string(x);
                Console.WriteLine(T1);
                double j;
                if (double.TryParse(T1, out j))
                {
                    j = (1.8 * j) + 32;
                    Console.WriteLine(j);
                }
                else
                {
                    Console.WriteLine("String could not be parsed.");
                }
            }
            else
            {
                Console.WriteLine("Oops!");
            }
            Console.ReadKey();
        }

        static bool matchesPermutation(string test, string search)
        {
            string remaining = search;
            for (int i = 0; i < test.Length; i++)
            {
                int pos = remaining.IndexOf(test[i]);
                if (pos == -1)
                    return false;
                else
                    remaining = remaining.Remove(pos, 1);
            }
            return true;
        }

        static int findPermutation(string test, string search)
        {
            for (int i = 0; i < test.Length - search.Length + 1; i++)
                if (matchesPermutation(test.Substring(i, search.Length), search))
                    return i;
            return -1;
        }
    }
}



А вот и код формы Windows:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using ScrapySharp.Network;
using HtmlAgilityPack;
using ScrapySharp.Extensions;

namespace UGH2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // setup the browser
            ScrapingBrowser Browser = new ScrapingBrowser();
            Browser.AllowAutoRedirect = true; // Browser has many settings you can access in setup
            Browser.AllowMetaRedirect = true;
            WebPage PageResult = Browser.NavigateToPage(new Uri("http://192.168.1.99"));
            //go to the home page
            // get first piece of data, the page title
            HtmlNode Center = PageResult.Html.CssSelect("Center").First();
            string fruit = Center.InnerText;
            label1.Text = fruit;
        }
    }
}

ZurdoDev

В чем же ошибка?

Bobzilla Donovan

Здесь действительно нет никакой ошибки. Код не выходит за пределы браузера.Инструкция навигации. Если я приостанавливаю отладку, она всегда переходит к этой точке кода. Я не могу закрыть форму, кроме как нажав кнопку "Остановить отладку" на панели инструментов.

Philippe Mori

Куча бесполезного кода. Вы всегда должны предоставлять минимальный код, необходимый для воспроизведения проблемы. Сброс большого количества кода никому не помогает.

4 Ответов

Рейтинг:
2

Richard MacCutchan

На эту тему есть статья CodeProject по адресу Webscraping с помощью C#[^].


Рейтинг:
1

Bobzilla Donovan

Я вообще бросил Скрэппи Шарпа. Я только что использовал webclient() внутри оператора using. Я также использовал регулярные выражения, чтобы найти нужный мне текст.

Сработало отлично.


Рейтинг:
1

chmod2222

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

Task.Factory.StartNew(() => 
{
    Forum forum = new Forum(txtUsername.Text, pass);

    //line below calls the hanging NavigateToPage
    Subject s = forum.AnalyzeSubject(id, ct.Token);
    //displaying result in the UI thread
    
    foreach (var item in s.CategoryActivity.OrderByDescending(so=>so.Count))
    {
        this.txtRez.BeginInvoke(new Action(() =>
        {
            this.txtRez.Text += item.ToString() + "\r\n";
        }));
    }
});


Рейтинг:
0

Greg Kesting

Единственное, что я вижу, что разница между этими двумя примерами-это косая черта в URI. Это может решить проблему, поскольку используется частный IP-адрес.

Приставка:

//go to the home page
WebPage PageResult = Browser.NavigateToPage(new Uri("http://192.168.1.99/"));


WinForm:
WebPage PageResult = Browser.NavigateToPage(new Uri
("http://192.168.1.99"));


Bobzilla Donovan

Я просто попробовал добавить /. Он все еще торчит там. Очень странный. Но все равно спасибо.