0

我是新手Web Crawling,我正在使用HttpWebRequest从网站抓取数据。

到目前为止,我已经成功地从我的 wordpress 网站抓取并获取数据。该数据是一个简单的用户配置文件数据。(如姓名、电子邮件、AIM id 等...)

现在作为一个练习,我想爬取维基百科,我将使用最后输入到文本框中的值进行搜索,然后使用搜索值爬取维基百科并从搜索中获取适当的标题。

现在我有以下疑问/困难。

  • 首先,这甚至可能吗?我听说 wiki 有 robots.txt 设置来阻止这个。虽然我只从朋友那里听说过,因此不确定。

  • 我正在使用我之前使用的相同程序,但我没有得到所需的结果。

谢谢 !

更新: 经过@svick的一些解释和帮助,我尝试了下面的代码,但仍然无法获得任何值(参见最后一行代码,我期待搜索结果页面的 html 标记)

string searchUrl = "http://en.wikipedia.org/w/index.php?search=Wikipedia&title=Special%3ASearch";

var postData = new StringBuilder();
postData.Append("search=" + model.Query);
postData.Append("&");
postData.Append("title" + "Special:Search");

byte[] data2 = Crawler.GetEncodedData(postData.ToString());

var webRequest = (HttpWebRequest)WebRequest.Create(searchUrl);

webRequest.Method = "POST";
webRequest.UserAgent = "Crawling HW (http://yassershaikh.com/contact-me/)";
webRequest.AllowAutoRedirect = false;

ServicePointManager.Expect100Continue = false;

Stream requestStream = webRequest.GetRequestStream();
requestStream.Write(data2, 0, data2.Length);
requestStream.Close();

var responseCsv = (HttpWebResponse)webRequest.GetResponse();
Stream response = responseCsv.GetResponseStream();

// Todo Parsing
var streamReader = new StreamReader(response);
string val = streamReader.ReadToEnd();

// val is empty !! <-- this is my problem !

这是我的GetEncodedData方法定义。

public static byte[] GetEncodedData(string postData)
    {
        var encoding = new ASCIIEncoding();
        byte[] data = encoding.GetBytes(postData);
        return data;
    }

请帮助我。

4

1 回答 1

2
  1. 您可能不需要使用HttpWebRequest. 使用WebClient(或者HttpClient如果您使用的是 .Net 4.5)对您来说会容易得多。
  2. robots.txt实际上并没有阻止任何东西。如果某些东西不支持它(并且.Net 不支持它),它可以访问任何东西。
  3. Wikipedia 确实会阻止未设置User-Agent标头的请求。并且您应该在您的联系信息中使用信息丰富的 User-Agent 字符串。
  4. 访问 Wikipedia 的更好方法是使用它的 API,而不是抓取。这样,您将获得一个专门供自定义应用程序读取的答案,格式为 XML 或 JSON。还有包含来自维基百科的所有信息的转储可供下载。

编辑:您新发布的代码的问题是您的查询返回302 Moved Temporarily对搜索文章的响应(如果存在)。删除 forbids 的行AllowAutoRedirect,或添加&fulltext=Search到您的查询中,这意味着您不会被重定向。

于 2012-08-23T15:04:59.643 回答