我正在尝试使用R
在此链接http://www.rchsd.org/doctors/index.htm?strt=0&ln=&fn=&sp=&grp=&loc=&lng=&gen=中提取数据,但这很难。
我注意到每当我点击页码时,网址链接都不会改变。这个表是用JavaScript创建的吗?该表是由某些外部源创建的,我如何才能访问它?此外,这种类型的表有技术名称吗?
此外,对于使用R
或任何其他程序知道网页抓取的任何人,您如何从此表中提取所有数据?我尝试在R
中使用以下代码来提取数据,但我得到NULL
。你会如何解决这个问题?
mps <- paste("http://www.va.gov/providerinfo/SANDIEGO/index.asp?servicesearch=&specialtysearch=&gendersearch=&sort=¤tPage=1")
mps.doc <- htmlParse(mps)
mps.tabs <- readHTMLTable(mps.doc)
另外,如果你不能回答我问题的后半部分,那也没关系。我主要想知道我问题上半部分的答案。
答案 0 :(得分:5)
回答使用3种不同的技术进行修订,所有技术都基于.ajax()和基于YQL。
参考HTML: http://doctors.ucsd.edu/?index=1
对于问题的第一部分,您提供的网址中的表格类型是标准的HTML Table Model种类。在创建table
时,网站使用 XML文件来填充rows
和columns
数据,包括医生的照片。
为了让服务器满意,并非 XML文件中的所有数据都加载到浏览器中,只显示有限结果并带有选项以继续下一页。
对于您撰写的评论部分(即http://doctors.ucsd.edu/?index=1)中的网址链接也是如此,其中访问者可以从网页中选择10个,25个或50个结果 每页结果< / em> 下拉菜单。网络地址栏会通过 &setsize=25
显示 请求 的数字。
虽然您可能想要data scrape that reference URL,但最好不要 您已经 XML文件包含您需要的所有数据。 直接访问它的工作量减少了!
参考XML: http://www.rchsd.org/api/physdir/
您的问题的第二部分很容易,因为 XML文件随时可用。这一次,当您data scrape that reference XML File时,它会快速显示您正在寻找的信息,并且具有非常高的可读性。
我在 上面的数据抓取查询 中将请求限制为5个结果用于测试目的,但您可以将其增加到更大的采样值。第一个示例中的额外网页数据量需要使用XPATH
来映射节点,并需要额外的处理来使用该数据。
我已经准备了一个详细的jsFiddle,它可以解释你对这个过程的很多疑问。在其中,我将解释如何使用YQL,.ajax()
以及 XML文件的链接。
参考示例:
$.ajax({
type: 'GET',
url: 'http://query.yahooapis.com/v1/public/yql?q=SELECT%20phys%20FROM%20xml%20WHERE%20url%3D%22http%3A%2F%2Fwww.rchsd.org%2Fapi%2Fphysdir%2F%22%20LIMIT%205',
dataType: 'xml',
success: function(data) {
var dataResults = $(data).find('results');
console.log(dataResults);
}
});
参考教程:
jsFiddle Data Scraping XML Demo(请参阅下面的jsFiddle HTML演示)
编辑:返回 原始 参考HTML:http://doctors.ucsd.edu/?index=1
我在第一部分写的最后一件事 实际上不是真的 ,因为你不必 / em>拥有您需要的所有数据。虽然您可以从 XML文件中的物理医生地址创建自己的 Google地图位置数据,但该信息已可供使用。
然后还发现此网址还包含唯一格式化的 缩略图 ,并包含 医生信息 < / strong>部分可用。
那么,接下来是一个重写的jsFiddle,它显示了如何抓取HTML网页的数据。您将在这个新的jsFiddle中注意到 YQL语句不再是ACCESS phys FROM xml
,因为我们现在处理的是HTML文档。此外,我们将在 YQL语句中使用通配符*
而不是标记名phys
。然后它将是ACCESS * FROM html
从上面记得数据抓取第一种方法,从该请求返回的数据太多。我将解释如何向 YQL语句添加XPATH
,以便您只获得所需的数据。
从哪里开始问你?在浏览器中的该网站!我将继续使用Firefox。
首先,让我们在测试中返回5个结果。要执行此操作,请将每页结果更改为25,然后在浏览器栏中将&setsize=
查询的25更改为5。点击键盘上的Enter键以应用更改。
使用网页其他搜索条件,显示更多特色,位置和按结果排序结果将还修改浏览器栏并进一步创建要使用的自定义URL。
对于我们的演示,我们只需要另外一次自定义排序结果:姓氏A-Z 。如果需要,请重新加载网页,并确保...我们的自定义网址应如下所示:
http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5
现在网页上填充了我们要求的5个结果,我们需要看看布局是如何支持这些项目的。
使用Firefox 检查元素工具,右键单击鼠标以查看和学习表格布局结构。很快,您会看到返回的所有结果都包含在 唯一类名 中。
以下是使用Firefox来说明的截图:
当通过检查元素工具底部的图标弹出 HTML面板时(到Inspect Element的右侧)图标),您可以看到layout
对于单个医生框如何:
在上面的照片中,您可以直观地 遍历DOM 以查看主 classname resultsList
是{{ 1}}保持请求的5个结果。该实际的类名是可以使用,但要使用的 精炼的类名 是 div
每个返回的项目都有。
您现在拥有构建要使用的YQL语句所需的信息。首先,这是我们开始使用的最低要求:
resultsListProvider
上面真的不会这样做,因为它返回了太多非必要的网页数据,这就是为什么我们使用 Inspect Element 来发现真正重要的内容。话虽如此,我们将使用XPATH
通过 classname ACCESS * FROM html WHERE url="http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5"
访问我们需要的网页部分。
resultsListProvider
现在我们可以使用xpath="//div[@class='resultsListProvider']"
合并这两个部分来创建我们可以抓取数据的Final YQL Statement:
AND
上面的最终YQL语句现在将提供可用的结果,以便在我创建的新jsFiddle中使用,该jsFiddle已更新注释以反映这些更改。如果需要,您可以将 XML文件和 HTML网址方法结合使用,以满足您的数据抓取要求,因为每种方法都提供了其他方法可能缺少的内容。
提醒:当网页加载或使用 YQL Rest State 查询时,可能会直接呈现某些数据。这意味着 您的动态数据 可能基于 他们的动态数据 。 哦,我的!
参考教程:
jsFiddle Data Scraping HTML Demo(参见上面的jsFiddle XML演示)
编辑2:直接使用HTML
jsFiddle Data Scraping HTML Demo: Clone That Webpage
最新的编辑显示了如何使用原始网页的样式表(是可选的,您可以创建自己的),但使用SELECT * FROM html WHERE url="http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5" AND xpath="//div[@class='resultsListProvider']"
以不同方式请求Ajax数据属性。使用此方法可以在本地网页上放置确切的标记,包括任何dataType
或classnames
。
jsFiddle截图:
答案 1 :(得分:2)
该表格使用此XML
形成