本篇文章是使用C#抓取数据的,使用WebClient+HtmlAgilityPack的方法对页面进行抓取和数据分析。通过使用WebClient库对58同城二手房列表页进行抓取,通过HtmlAgilityPack对页面进行解析,并从中获取房源价格,面积,户型和价格等数据。
首先获取网站的html文本
58同城 地址
http://sh.58.com/ershoufang/pn1/?utm_source=market&spm=b-31580022738699-me-f-824.bdpz_biaoti&PGTID=0d30000c-0000-2fe5-d01a-f5d4e12dfa56&ClickID=4
这里可以看出
url中sh代表城市
ershoufang表示栏目
pn后面的数字就是当前的列表的页码
循环获取列表页的html只需要将pn后的数字加1即可
我们把网址传入下面函数
////// 获取html /// /// public static void gethtmlli(string url) { WebClient mywebclient = new WebClient(); //获取或设置用于向Internet资源的请求进行身份验证的网络凭据 mywebclient.Credentials = CredentialCache.DefaultCredentials; Byte[] PageData = null; //设置编码类型Gbk string pagehtml = ""; for (int i = 1; i <= sum; i++) { PageData = mywebclient.DownloadData(string.Format(url, i)); pagehtml = Encoding.UTF8.GetString(PageData); Reger(pagehtml); } }
循环返回列表页的html,得到html之后将其解析,这里我使用的是HtmlAgilityPack,当然你也可以用正则表达式
58同城的列表信息放在一个table标签里
获取hrml之后可以通过Htmldocument的Load()或LoadHtml()来加载静态内容
Htmldocument doc = new Htmldocument();
doc.LoadHtml(pagehtml);//把刚刚获取到的html给doc
doc.documentNode.SelectNodes("//table[@class='tbimg']/tr");//获取所有tr的集合
HtmlAgilityPack对应的属性
Attributes 获取节点的属性集合
ChildNodes 获取子节点集合(包括文本节点)
Closed 该节点是否已关闭()
ClosingAttributes 在关闭标签的属性集合
FirstChild 获取第一个子节点
HasAttributes 判断该节点是否含有属性
HasChildNodes 判断该节点是否含有子节点
HasClosingAttributes 判断该节点的关闭标签是否含有属性()
Id 获取该节点的Id属性
InnerHtml 获取该节点的Html代码
InnerText 获取该节点的内容,与InnerHtml不同的地方在于它会过滤掉Html代码,而InnerHtml是连Html代码一起输出
LastChild 获取最后一个子节点
Line 获取该节点的开始标签或开始代码位于整个HTML源代码的第几行(行号)
LinePosition 获取该节点位于第几列
Name Html元素名
NextSibling 获取下一个兄弟节点
NodeType 获取该节点的节点类型
OriginalName 获取原始的未经更改的元素名
OuterHtml 整个节点的代码
Ownerdocument 节点所在的Htmldocument文档
ParentNode 获取该节点的父节点
PreviousSibling 获取前一个兄弟节点
StreamPosition 该节点位于整个Html文档的字符位置
XPath 根据节点返回该节点的XPath
我们获取到了列表中所有房源的信息10 惊爆价,经典双南户型,婚房装修,楼层适中,特别适
长风公园 - 长风二村二手房 双南户型装修全送地铁房拎包入住 土巴兔礼包 :王龙剑 我爱我家 金沙江店3组 今天 310 万 57760元/㎡
2室1厅1卫 (53.67㎡)
接下来我们需要对每条房源解析
SelectSingleNode设置获取规则,比如说属性class='t'的tb标签下面属性class='bthead'的p标签的文本就是房源的标题,我们就通过如下方法获取
string Title =nodes[i].SelectSingleNode("td[@class='t']/p[@class='bthead']/a").InnerText;
InnerText获取当前标签的文本
nodes[i].SelectSingleNode("td[@class='t']/p[@class='bthead']/a").Attributes["href"].Value;
Value获取当前标签的属性,Attributes["href"]设置属性名称
其他数据以此类推
—【所有文章及图片版权归 追梦的懒熊 所有,转载请注明出处】



