您的位置:首页 > 职场人生

面试官让我上机写一个爬虫,没有经验,写的也没什么价值,就是想记录一下

2016-08-22 21:00 393 查看
1.用WebRequest相关API抓取数据的时候会返回403服务器拒绝的问题。

经网上寻找解决方案,是用指定UserAgent参数伪装浏览器,并成功解决问题。

2.大众点评网上要抓取的数据是动态生成。抓取的Html内容中不包含想要获取的内容。

后来找到一个网友提供的思路: 用WinForm里的webBrowser控件,可以把网页内容全部 加载完后,再通过Document获取。并最终使用这种方式实现。

using System;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
string url = "http://www.dianping.com/search/category/2/10/g110";
webBrowser1.Navigate(url);
}

/// <summary>
/// 点击获取信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGetInfo_Click(object sender, EventArgs e)
{
StringBuilder result = new StringBuilder();
HtmlElementCollection lis = webBrowser1.Document.GetElementsByTagName("li");

foreach (HtmlElement element in lis)
{
//最开始的三个 店铺信息 li class="top"
if (element.OuterHtml.Contains("li class=\"top\"")|| element.OuterHtml.Contains("li data-midas="))
AppendResultInfo(result, element.InnerHtml);
}

this.textConent.Text = result.ToString();

}

/// <summary>
/// 添加符合的信息到结果中
/// </summary>
/// <param name="result">结果数据</param>
/// <param name="InnerHtml">html内容</param>
private void AppendResultInfo(StringBuilder result, string InnerHtml)
{
result.Append("店名:").Append(GetMidStr(InnerHtml.Replace("a title=\"\"", ""), "<a title=\"", "\"")).Append("\n");
result.Append("地址:").Append(GetMidStr(InnerHtml, "<span class=\"addr\">", "</span>")).Append("\n\n");
}

/// <summary>
/// 获取中间的字符串
/// </summary>
/// <param name="inStr">源字符串</param>
/// <param name="startString">开始字符串</param>
/// <param name="endString">结束字符串</param>
/// <returns></returns>
private static string GetMidStr(string inStr, string startString, string endString)
{
int iBodyStart = inStr.IndexOf(startString, 0);               //开始位置
if (iBodyStart == -1)
return null;
iBodyStart += startString.Length;                            //要查找的字符串起始位置
int iBodyEnd = inStr.IndexOf(endString, iBodyStart+1);
if (iBodyEnd == -1)
return null;
iBodyEnd += endString.Length;                                //要查找的字符串结束位置
string strResult = inStr.Substring(iBodyStart, iBodyEnd - iBodyStart - endString.Length);
return strResult;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐