This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable,
visit the help center。
已关闭8年。
我正在尝试使用
R
在此链接
http://www.rchsd.org/doctors/index.htm?strt=0&ln=&fn=&sp=&grp=&loc=&lng=&gen=中提取数据,但这非常困难。
我注意到,只要单击页面编号,URL链接就不会更改。该表是用JavaScript创建的吗?该表是由某个外部源创建的,我如何访问它?另外,这种 table 有技术名称吗?
此外,对于任何知道使用
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)
另外,如果您不能回答我问题的后半部分,那也可以。我主要想知道问题上半部分的答案。
答案使用3种不同技术进行了修订,所有技术均基于.ajax()和YQL。
技术1
引用HTML: http://doctors.ucsd.edu/?index=1
对于问题的第一部分,您提供的URL中的表格类型是标准的HTML Table Model变体。在创建该table
时,网站使用 XML文件来填充rows
和columns
中的数据,包括医生的照片。
为了使服务器保持满意状态,并不是将 XML文件中的所有数据都加载到浏览器中,仅显示有限的结果,并带有进入下一页的选项。
您撰写的评论部分(即http://doctors.ucsd.edu/?index=1)中的URL链接也是如此,访问者可以从网页每页结果下拉菜单中选择10、25或50个结果。网站的地址栏将显示所请求的号码,例如 &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演示,请参见下文)
技术2
编辑:返回
原始引用HTML:
http://doctors.ucsd.edu/?index=1我在第一部分中写的最后一句话是
实际上不是真正的,因为您不一定拥有所需的所有数据。虽然您可以通过
XML文件中的物理医生地址创建自己的Google map 位置数据,但该信息已可供使用。
然后,我们还发现此URL还包含唯一格式的
缩略图,并在可用时包括
Doctors Information 部分。
因此,接下来是重写的jsFiddle,它显示了如何对HTML网页进行数据抓取。您会在这个新的jsFiddle中注意到,由于我们现在正在处理HTML文档,因此YQL语句不再是
ACCESS phys FROM xml
。另外,我们将在该YQL语句中使用通配符
*
而不是标记名
phys
。然后将是
ACCESS * FROM html
您从上面的数据抓取第一种方法中还记得,该请求返回了太多数据。我将说明如何在该YQL语句中添加
XPATH
,以便仅返回所需的数据。
你问从哪里开始?在您浏览器中的那个网站上!我将使用Firefox继续。
首先,让我们在测试中强制返回5个结果。为此,请将
每页结果更改为25,然后在浏览器栏上将
&setsize=
查询的25更改为5。按键盘上的Enter以应用更改。
使用网页
其他搜索条件,
显示更多专业,
位置和
对结果进行排序:还将修改浏览器栏,并进一步创建要使用的自定义URL。
对于我们的演示,我们只需要对
进行1个其他自定义结果排序方式:姓A-Z 。如有需要,请重新加载网页,并确保...我们的自定义URL应该如下所示:
http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5现在,该网页已填充了我们请求的5个结果,我们需要查看布局如何支持这些项目。
通过右键单击鼠标来使用Firefox
检查元素工具,以查看和学习表格布局结构。很快,您将看到所有返回的结果都包含在
唯一类名称中。
这是使用Firefox来说明的屏幕截图:
通过
Inspect Element 工具(位于Inspect Element Icon右侧)底部的图标弹出HTML面板时,您可以看到该单个Doctors框的
layout
如下:
在上面的照片中,您可以通过
直观地遍历DOM来查看主要类名
resultsList
是保存请求的5个结果的
div
。可以使用实际的类名,但是要使用的更多
改进的类名是每个返回项目携带的
resultsListProvider
。
现在,您具有构造YQL语句以使用所需的信息。首先,这是我们开始使用的最低要求:
ACCESS * FROM html WHERE url="http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5"
上面的代码实际上不会执行任何操作,因为它返回了太多非必需的网页数据,这就是为什么我们使用
检查元素来发现真正重要的原因。话虽如此,我们将使用
XPATH
通过类名
resultsListProvider
访问所需的网页部分。
xpath="//div[@class='resultsListProvider']"
现在,我们可以使用
AND
组合这两个部分,以创建可以对数据进行抓取的
Final YQL Statement:
SELECT * FROM html WHERE url="http://doctors.ucsd.edu/?sortby=familyName&sortDirection=asc&setsize=5" AND xpath="//div[@class='resultsListProvider']"
现在,上面的
最终YQL语句将提供可用的结果,以便在我创建的新jsFiddle中使用,该更新已更新了注释以反射(reflect)这些更改。如果需要,您可以结合使用
XML文件和
HTML URL 方法来满足数据抓取要求,因为每种方法都提供了其他方法可能缺少的内容。
提醒:加载网页或使用
YQL剩余状态查询时,可能会直接呈现某些数据。这意味着
您的动态数据可能基于
他们的动态数据。天啊!
引用教程: jsFiddle Data Scraping HTML Demo(请参阅上面的jsFiddle XML演示)
技术3
编辑2:直接使用HTML jsFiddle Data Scraping HTML Demo: Clone That Webpage最新的编辑显示了如何使用原始网页的样式表(这是可选的,您可以创建自己的样式表),但是使用
dataType
属性以不同的方式请求Ajax数据。使用这种方法,将确切的标记放置在本地网页上,包括任何
classnames
或
id's
。
jsFiddle屏幕截图: