我一直花了很多时间试图弄清楚这里的问题,但不幸的是还没有运气。我希望有人能为我指出正确的方向。
我正在尝试提取以下脚本中提供的链接中列出的所有属性的地址元素。但是,输出始终为空列表。我尝试了不同的变体,但没有一种奏效。
lapply(c('XML','httr'),require,character.only=TRUE)
link <- "http://www.realtor.ca/Map.aspx?CultureId=1&ApplicationId=1&RecordsPerPage=9&MaximumResults=9&PropertyTypeId=300&TransactionTypeId=2&SortOrder=A&SortBy=1&LongitudeMin=-114.52066040039104&LongitudeMax=-113.60536193847697&LatitudeMin=50.94776904194829&LatitudeMax=51.14246522072541&PriceMin=0&PriceMax=0&BedRange=0-0&BathRange=0-0&ParkingSpaceRange=0-0&viewState=m&Longitude=-114.063011169434&Latitude=51.0452194213867&ZoomLevel=11&CurrentPage=1#CultureId=1&ApplicationId=1&RecordsPerPage=9&MaximumResults=9&PropertyTypeId=300&TransactionTypeId=2&SortOrder=A&SortBy=1&LongitudeMin=-114.9913558959965&LongitudeMax=-113.1346664428715&LatitudeMin=50.91552869934793&LatitudeMax=51.1745480567661&PriceMin=0&PriceMax=0&BedRange=0-0&BathRange=0-0&ParkingSpaceRange=0-0&viewState=l&Longitude=-114.063011169434&Latitude=51.0452194213867&ZoomLevel=11&CurrentPage=1"
doc <- htmlTreeParse(link,useInternalNodes = T)
addresses <- xpathSApply(doc,"//div[@id='listView']//span",xmlValue)
addresses
的输出如下:
> addresses
list()
事实上,我无法在上面的链接中获取任何其他 html 元素。我想知道这是否是因为页面需要一段时间才能加载,而GET{httr}
或htmlTreeParse{XML}
会立即抓取网页,而没有给它先完全加载的机会。不确定我的推理是否有意义。我将不胜感激社区在这个问题上的帮助。
站点正在使用 AJAX POST
调用来动态检索结果列表的数据http://www.realtor.ca/api/Listing.svc/PropertySearch_Post
。您需要执行相同的操作来获取原始数据,然后从生成的 R 列表结构中提取地址:
library(httr)
params <- list(CultureId=1,
ApplicationId=1,
RecordsPerPage=9,
MaximumResults=9,
PropertyTypeId=300,
TransactionTypeId=2,
SortOrder="A",
SortBy=1,
LongitudeMin="-114.9913558959965",
LongitudeMax="-113.1346664428715",
LatitudeMin="50.91552869934793",
LatitudeMax="51.1745480567661",
PriceMin=0,
PriceMax=0,
BedRange="0-0",
BathRange="0-0",
ParkingSpaceRange="0-0",
viewState="l",
Longitude="-114.063011169434",
Latitude="51.0452194213867",
ZoomLevel=11,
CurrentPage=1)
pg <- POST("http://www.realtor.ca/api/Listing.svc/PropertySearch_Post",
body=params, encode="form")
data <- content(pg)
sapply(data$Results, function(x) { x$Property$Address$AddressText })
## [1] "# 297 6220 17 AV SE|Penbrooke, Calgary, Alberta T2A0W6"
## [2] "# 298 6220 17 AV|Redcarpet Mountview, Calgary, Alberta T2A0W6"
## [3] "10 VILLAGE WY|Westpark Village, Strathmore, Alberta T1P1A2"
## [4] "51 Village WY|Downtown Strathmore, Strathmore, Alberta T1P1A2"
## [5] "# 324 6220 17 AV SE|Penbrooke, Calgary, Alberta T2A7H4"
## [6] "# 345 6220 17 AV SE|Penbrooke, Calgary, Alberta T2A7H4"
## [7] "# 28 6724 17 AV SE|Redcarpet Mountview, Calgary, Alberta T2A0W5"
## [8] "# 328 6220 17 AV SE|Penbrooke, Calgary, Alberta T2A7H4"
## [9] "# 253 99 Arbour Lake RD NW|Arbour Lake, Calgary, Alberta T3G4E4"
警告刮刀
我觉得有必要指出,使用此代码违反了网站的版权声明:
本网站和本网站上的所有材料均受版权法保护,归CREA或提供数据的会员和/或其他第三方所有。本网站上提供的房产列表和其他数据仅供个人私人、非商业使用。明确禁止直接或间接地将全部或部分列表或数据用于商业用途,除非事先获得版权所有者的书面授权。
根据这些使用条款,用户可以打印或以其他方式保存单个页面供私人使用。但是,不得在任何方面修改或更改物业列表和/或数据,不得与其他数据合并或以任何形式全部或部分发布。禁止的用途包括"屏幕抓取","数据库抓取"以及旨在收集,存储,重组或操作CREA网站上产生或显示的页面上的数据的任何其他活动。
并且使用此代码肯定会违反上述 TOS。
我只是因为像房地产经纪人这样的组织才提到它。[com|ca] 确实会查找上述抓取活动并将它们追溯到 IP 地址。
我检查了你的代码:它是正确的。问题是您必须处理的HTML页面格式不正确。因此,xpath 无法获取地址。
您可以控制此页面和/或其生成方式。在这种情况下,您必须使其格式良好。
或者你不能。在这种情况下,您必须遵循另一种方法:将 HTML 代码页作为字符串加载,并使用子字符串或更好的正则表达式提取地址。