本篇文章是使用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即可
我们把网址传入下面函数
/// <summary>
/// 获取html
/// </summary>
/// <param name="url"></param>
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 该节点是否已关闭(</xxx>)
ClosingAttributes 在关闭标签的属性集合
FirstChild 获取第一个子节点
HasAttributes 判断该节点是否含有属性
HasChildNodes 判断该节点是否含有子节点
HasClosingAttributes 判断该节点的关闭标签是否含有属性(</xxx class="xxx">)
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
我们获取到了列表中所有房源的信息
<tr logr="d_2_37815579919119_28653741792844_15_2_sortid:1483857357739@ses:pc12defrank^0" _pos="2 sortid="1483857357739">
<td class="img">
<div class="img_list">
<span class="img_picCount"><span class="img_picCountOpacity"></span><span>10</span></span>
<span class="mianshuiTip"></span> <a href="http://sh.58.com/ershoufang/28653741792844x.shtml?utm_source=market&spm=b-31580022738699-me-f-824.bdpz_biaoti?psid=117141666194581055298773342&entinfo=28653741792844_0" target="_blank">
<img lazy_src='http://pic2.58cdn.com.cn/anjuke_58/26fd5a005a6b852a76b3d68de9e2f0dd?w=132&h=99' class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="http://pic2.58.com/n/images/list/noimg.gif" alt="惊爆价,经典双南户型,婚房装修,楼层适中,特别适合居家过日子" />
</a>
</div>
</td>
<td class="t">
<p class="bthead">
<a href="http://sh.58.com/ershoufang/28653741792844x.shtml?utm_source=market&spm=b-31580022738699-me-f-824.bdpz_biaoti?psid=117141666194581055298773342&entinfo=28653741792844_0" target="_blank" class="t" infoid="1483857357739">
惊爆价,经典双南户型,婚房装修,楼层适中,特别适</a>
<span class="wlt-ico wlt1" title="58同城认证商家"></span>
<span title="免税房源" class="ico dun"></span> <span name="zaixian_37815579919119" onClick="clickLog('from=fc_pc_list_bangbang&psid=117141666194581055298773342&entityId=28653741792844&entityType=0')"></span>
<i class="clear"></i>
</p>
<div class="qj-listleft">
<a href="/changfenggongyuan/ershoufang/" class="a_xq1">长风公园</a>
- <a href="/xiaoqu/zhangfengercun/ershoufang/" target="_blank" class="a_xq1">
长风二村二手房</a>
<i class="clear"></i>
<!-- 房源特色 -->
<span class="label_fang g_tagSon1">双南户型</span><span class="label_fang g_tagSon2">装修全送</span><span class="label_fang g_tagSon3">地铁房</span><span class="label_fang g_tagSon4">拎包入住</span> <span class="label_fang tubaAdd" style="background:#f5b95f;">
<a href="http://www.to8to.com/huodong/58dalibao/?to8to_from=11_1_3" target="_blank" rel="nofollow" style="text-decoration: none;">土巴兔礼包</a>
</span>
<i class="clear"></i>
<!-- 房源特色 end -->
<span class="qj-listjjr"><span class="geren"></span><label>经纪人</label> <a class="qj-lijjrname" target="_blank" onclick="javascript:clickLog('from=fc_list_pxjjr&psid=117141666194581055298773342&entityId=28653741792844&entityType=0');">
:王龙剑 </a>
<a target="_blank" onclick="javascript:clickLog('from=fc_list_pxgs&psid=117141666194581055298773342&entityId=28653741792844&entityType=0');">
我爱我家 </a>
<label>-</label>
<a target="_blank" onclick="javascript:clickLog('from=fc_list_pxjjr&psid=117141666194581055298773342&entityId=28653741792844&entityType=0');">
金沙江店3组 </a>
今天</span> </div>
<div class="qj-listright btall">
<b class='pri'>310</b> 万
57760元/㎡ <br/>
<span class="showroom">
2室1厅1卫 </span>
(53.67㎡)
<br/>
</div>
</td>
</tr>
接下来我们需要对每条房源解析
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"]设置属性名称
其他数据以此类推
—【所有文章及图片版权归 追梦的懒熊 所有,转载请注明出处】
共同学习,写下你的评论
评论加载中...
作者其他优质文章