2

有没有办法只获取网页的文本(来源)?我尝试使用两种方法:

Using WebRequest
        WebRequest myWebRequest = WebRequest.Create("http://www.website.com/");
        WebResponse myWebResponse = myWebRequest.GetResponse();
        Stream ReceiveStream = myWebResponse.GetResponseStream();
        Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
        StreamReader readStream = new StreamReader(ReceiveStream, encode);
        string html = readStream.ReadToEnd();
        readStream.Close();
        myWebResponse.Close();

如果请求的网页是静态的,这种方法可以正常工作。但是,如果请求网页的内容仅在页面加载发生时生成,我将无法获得正确的源内容。

Using Web Browser
            WebBrowser browser = new WebBrowser();
            browser.ScrollBarsEnabled = false;
            browser.ScriptErrorsSuppressed = true;
            browser.Navigate(new Uri(http://www.website.com/));

这种方法每次都会提供适当的源内容,但会花费大量时间并且还会显示弹出窗口。此外,一些网站显示浏览器版本弹出窗口,甚至一些在 IE 中打开(我不想要)。

我的最终目标是在不打开浏览器或弹出任何弹出窗口的情况下尽快获取网页的源内容。请让我知道我可以用来实现所需解决方案的任何可能方式。谢谢。

4

2 回答 2

1

您似乎想要某种没有实际浏览器的浏览器功能。

为此存在许多工具,最突出的是Selenium,再加上PhantomJS,您将能够启动功能齐全的浏览器,而无需物理浏览器开销。

然后,您就可以执行类似(Selenium 示例)的操作:

IWebDriver driver = new PhantomJSDriver();
driver.Navigate().GoToUrl("http://www.website.com");
string fullSource = driver.PageSource;

使用 basicHttpWebRequestWebBrowsercontrol 时,您很快就会遇到页面加载缓慢或 JS 过于繁重以至于无法获得预期结果的问题。

于 2013-11-05T12:19:52.013 回答
0

决定发布我的代码。这适用于我的 ASP 和 PHP 动态页面。您可以根据需要修改代码,因为该代码用于爬取完整的 ASP 或 PHP 网站,并且调用这些方法来获取内容。

 class WebReader
    {
        private string onlineText = "";
        public string getOnlineText()
        {
            return onlineText;
        }
        public WebReader(String strLocation,String strFile){
            Stream strm = null;
            StreamReader MyReader = null;

            try
            {
                // Download the web page.
                strm = GetURLStream("http://" + strLocation +"/" + strFile);
                if (strm != null)
                {
                    // We have a stream, let's attach a byte reader.
                    char[] strBuffer = new char[3001];

                    MyReader = new StreamReader(strm);

                    // Read 3,000 bytes at a time until we get the whole file.
                    string strLine = "";
                    while (MyReader.Read(strBuffer, 0, 3000) > 0)
                    {
                        strLine += new string(strBuffer);

                    }
                    onlineText = strLine;
                }
            }
            catch (Exception excep)
            {
                Console.WriteLine("Error: " + excep.Message);
            }
            finally
            {
                // Clean up and close the stream.
                if (MyReader != null)
                {
                    MyReader.Close();
                }

                if (strm != null)
                {
                strm.Close();
                }
            }
        }
        public Stream GetURLStream(string strURL)
        {
            System.Net.WebRequest objRequest;
            System.Net.WebResponse objResponse = null;
            Stream objStreamReceive;

            try
            {
                objRequest = System.Net.WebRequest.Create(strURL);
                objRequest.Timeout = 5000;


                objResponse = objRequest.GetResponse();
                objStreamReceive = objResponse.GetResponseStream();

                return objStreamReceive;
            }
            catch (Exception excep)
            {
                Console.WriteLine(excep.Message);
                objResponse.Close();

                return null;
            }
        }

        public void ReadWriteStream(Stream readStream, Stream writeStream, frmUpdater _MyParent, int CurrentVersion, long BytesCompleted)
        {
            int Length = 2048;
            Byte[] buffer = new Byte[Length];
            int bytesRead = readStream.Read(buffer, 0, Length);
            // write the required bytes
            while (bytesRead > 0)
            {
                writeStream.Write(buffer, 0, bytesRead);
                bytesRead = readStream.Read(buffer, 0, Length);
                _MyParent.RefreshDownloadLabels(CurrentVersion,BytesCompleted + writeStream.Position);
                Application.DoEvents();
            }
            readStream.Close();
            writeStream.Close();
        }
    }
于 2013-11-05T12:22:44.327 回答