请教一下,我最近想在政府房管部门网站爬取房产备案信息,地址:http://www.dyyscx.com/newhouse/house_table.aspx?id=828279
每个楼盘表下有个“查看”链接,点击后就会在原页面生成新的备案内容。
这一部分内容使用元素检查是可以看见的,但查看源代码却看不见。
使用network查看XHR发现有个文件“GetBuildTableByAjax.ashx”,这里面的preview中就有相关信息。
截取片段是这样的:
物业类别:住宅 销售状态:抵预 建筑面积:117.260平米 总价:71.65万元' class='border-333333'>3单元 3-25-1</td><td width='95' height='30' style='cursor:hand;cursor:point;' bgcolor='#FDDFAB' Title='物业类别:住宅 销售状态:抵预 建筑面积:89.730平米 总价:53.89万元' class='border-333333'>3单元 3-25-2</td><td width='95' height='30' style='cursor:hand;cursor:point;' bgcolor='#FDDFAB' Title='物业类别:住宅 销售状态:抵预 建筑面积:120.870平米 总价:70.87万元' class='border-333333'>3单元
我看了下,原网页head里面有一段Scirpt,内容是这样的:
<script type="text/javascript">
function GetData(item, bulid) {
var heightobj = document.body.scrollHeight;
var widthobj = document.body.scrollWidth;
$("div.overdiv").css("width", widthobj).css("height", heightobj).css("left", "0").css("top", "0").show();
//获得显示的位置
var height = document.body.scrollTop + document.documentElement.scrollTop;
widthobj = (document.body.clientWidth - 199) / 2;
heightobj = (document.documentElement.clientHeight - 60) / 2 + height;
//显示该div
$("div.select").css("left", widthobj).css("top", heightobj).show();
$.post("GetBuildTableByAjax.ashx", { itemRecord: item, houseCode: bulid }, function (data) {
document.getElementById("BuildTable").innerHTML = data;
$("div.select").hide();
$("div.overdiv").hide();
});
}
</script>'
因为是小白,所以猜想是js隐藏了新内容的标签,导致不在原网页的源代码中显示,所以爬不到内容。
请教一下我猜想的是否正确,以及我要怎么才能获得备案信息的内容。
ps:最好是能贴个完整的方法,谢谢!!!!!!!!!
以下是获取点击查看返回内容,测试可以完成爬取
import requests
def test():
s=requests.session()
headers={
'Accept':'*/*',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Connection':'keep-alive',
'Content-Length':'43',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Host':'www.dyyscx.com',
'Origin':'http://www.dyyscx.com',
'Referer':'http://www.dyyscx.com/newhouse/house_table.aspx?id=828279',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.15 Safari/537.36',
'X-Requested-With':'XMLHttpRequest'
}
s.headers.update(headers)
data={
'itemRecord':'828279',
'houseCode':'201506250000907',
}
url='http://www.dyyscx.com/newhouse/GetBuildTableByAjax.ashx'
req=s.post(url=url,data=data).text
print(req)
test()
应该不是js隐藏了标记,那个源代码也是能看到的,而是ajax异步加载的。查看源代码看到的是直接从服务器下载的源代码,但是看不到之后js动态修改和加载的代码。
你可以F12抓包看下,是什么请求获取了这个数据,然后一样去获取。
我帮你看了下
请求的是 http://www.dyyscx.com/newhouse/GetBuildTableByAjax.ashx
用POST
没有任何Post Data
你用 require 直接发送到这个地址就可以得到html片段了
既然Network的XHR都看到这个请求,证明这是一个异步的ajax请求,看一下这个请求的参数,为所有你需要的房子备案单独请求/抓取就好了。
不需要抓包,直接查看xhr里面的参数情况就好了。