使用C#阅读和发布到网页

时间:2020-03-06 14:44:28  来源:igfitidea点击:

我有一个正在工作的项目,要求我能够将信息输入到网页中,阅读重定向到的下一页,然后采取进一步的措施。一个简化的现实世界示例就是去google.com,输入"编码技巧"作为搜索条件,然后阅读结果页面。

小型编码示例,例如链接到http://www.csharp-station.com/HowTo/HttpWebFetch.aspx的示例,讲述了如何阅读网页,但没有通过向表单提交信息并继续进行操作来与之交互的方法。转到下一页。

出于记录,我没有在开发与恶意和/或者垃圾邮件相关的产品。

那么,我该如何阅读需要首先进行几步正常浏览的网页?

解决方案

我们需要做的是继续检索和分析链中每个页面的html源。对于每一页,我们都需要弄清楚表单提交的外观,然后发送与之匹配的请求以获取链中的下一页。

我要做的是建立一个包装System.Net.HttpWebRequest / HttpWebResponse的自定义类,因此检索页面就像使用System.Net.WebClient一样简单。但是,我的自定义类还可以在请求中保留相同的cookie容器,并使其更易于发送帖子数据,自定义用户代理等。

根据网站的工作方式,我们可以操纵URL来执行所需的操作。例如,要搜索"甲壳虫"一词,我们可以打开google.com?q=beetles请求,然后阅读结果。

或者,如果网站不使用查询字符串值(url)来处理页面操作,则我们将需要处理webrequest,该请求将所需的值发布到网站上。在Google中搜索以使用WebRequest和Webresponse。

在Google示例中,我们不应在搜索条件中输入任何内容,而应直接转到搜索按钮将我们带到的页面。

以示例为例:http://www.google.com/search?hl=zh_CN&q=coding%20tricks

我们可以以编程方式创建Http请求并检索响应:

string uri = "http://www.google.com/search";
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";

        // encode the data to POST:
        string postData = "q=searchterm&hl=en";
        byte[] encodedData = new ASCIIEncoding().GetBytes(postData);
        request.ContentLength = encodedData.Length;

        Stream requestStream = request.GetRequestStream();
        requestStream.Write(encodedData, 0, encodedData.Length);

        // send the request and get the response
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {

            // Do something with the response stream. As an example, we'll
            // stream the response to the console via a 256 character buffer
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                Char[] buffer = new Char[256];
                int count = reader.Read(buffer, 0, 256);
                while (count > 0)
                {
                    Console.WriteLine(new String(buffer, 0, count));
                    count = reader.Read(buffer, 0, 256);
                }
            } // reader is disposed here
        } // response is disposed here

当然,此代码将返回错误,因为Google将GET(而不是POST)用于搜索查询。

如果我们要处理特定的网页,则此方法将起作用,因为URL和POST数据基本上都是硬编码的。如果我们需要更具动态性的内容,则必须:

  • 捕获页面
  • 删除表格
  • 根据表单字段创建POST字符串

FWIW,我认为像Perl或者Python之类的东西可能更适合此类任务。

编辑:x-www-form-urlencoded

我对这款产品非常满意:

iMacros

http://www.iopus.com/

我有一个使用他们的产品已经运行了几个月,也许一年以上的应用程序。

顶级产品具有可用来记录和编辑宏的GUI,以及可从.Net代码调用的库。

恕我直言,这是开始时看起来很简单的编程区域之一("我只是获取页面的HTML,处理字符串,然后获取下一页..."),但实际上却是一个真正的PITA。

我们可以尝试硒。使用Selenium IDE在Firefox中记录操作,将脚本保存在Cformat中,然后使用Selenium RC Cwrapper回放它们。正如其他人提到的,我们也可以使用System.Net.HttpWebRequest或者System.Net.WebClient。如果这是桌面应用程序,另请参阅System.Windows.Forms.WebBrowser。

附录:与基于Java的Selenium IDE和Selenium RC相似,WatiN Test Recorder和WatiN也基于.NET。