面试官让我上机写一个爬虫,没有经验,写的也没什么价值,就是想记录一下
2016-08-22 21:00
393 查看
1.用WebRequest相关API抓取数据的时候会返回403服务器拒绝的问题。
经网上寻找解决方案,是用指定UserAgent参数伪装浏览器,并成功解决问题。
2.大众点评网上要抓取的数据是动态生成。抓取的Html内容中不包含想要获取的内容。
后来找到一个网友提供的思路: 用WinForm里的webBrowser控件,可以把网页内容全部 加载完后,再通过Document获取。并最终使用这种方式实现。
经网上寻找解决方案,是用指定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; } } }
相关文章推荐
- QQ一个没有什么价值的bug 【 ALLyeSNO 】
- 一个没有什么用的程序.自动替换文件内容,并生成复本.
- 一个自认为写得还可以的存储过程,就是没有注释,看起来有点乱。与ERP的BOM相关的
- 最近遇到了一个问题,搞了好几天还是没有什么起色!郁闷中啦!
- 一个非主流的网站,秀客吧,不过没有什么内容
- 做事的人总是要挨骂的,挨骂是一件好事。如果一个人不挨骂,肯定因为他没有做事。一个职业经理人,是否因为挨了几次骂就破罐破摔,随波逐流?一个职业经理人,你的责任是把自己的工作做好,作为市场总监,我的责任是告诉公司,明年我的品牌规划、产品规划、宣传形式是什么,这是责任。
- 请教一下:Windows任务管理器中显示的进程占用的内存是什么内存? 分配的还是使用的? 另外,最小化一个进程的时候为什么其占用的内存会大大降低?谢谢
- 一个没有任何管理经验的毕业生怎么可能被聘用
- js的一个托拽功能,网上找的,记录一下
- 强悍的vbs,很多时候如果只是简单的写一个windows桌面工具,可以优先考虑一下vbs,js什么的。
- BizTalk是什么,能作什么?这个问题,以前我也搜过,不过还是一头雾水.现在知道了,它就是一个翻译官
- 好久没有blog了,今日就share一个update program的经验
- 晚上写程序的时候就是不知道STDAPI这些东西是搞什么的,分享一下!
- 今天碰到一个listener的问题,记录一下
- 好久之前,就要想写一些东西了,就是没有一个适合的博客...
- (除了一个msgbox什么也没有) directshow之"hello world"第二步
- 对一个懒散的国家或个人,没有什么比成功更令人鼓舞
- 记录一下,每次都不记得自己排名变化没有
- 今年没有发现什么特别好听的歌曲~~~所以找两首最近在听的,推荐一下~~~~
- 没有个人知识管理就是觉得学了很多,却不得记到底学到了什么。