我正在尝试从https://www.kff.org/interactive/subsidy-calculator抓取信息。例如,放置州=加利福尼亚州,邮政编码= 90001,收入= 20000,无覆盖范围,1人,1个成年人,没有孩子,年龄= 21岁,没有烟草。
我想获取“估计的财务帮助”和“您的白银计划费用”的数字(在“结果”灰色框中,它们以蓝色粗体显示,由于某些原因,我无法上传屏幕截图) 。当我使用xpath作为数字时,我得到了空字符串。如果要检索其他文本(不在灰色框中),则不是这种情况。我不知道这可能是什么问题。我在下面附加了代码。如果这是一个愚蠢的问题,请原谅我,因为我是网络爬虫的新手。谢谢!
state = tolower('CA')
zip = 94704
income = 20000
people = 1
adult = 1
children = 0
url = paste0("https://www.kff.org/interactive/subsidy-calculator/#state=", state, "&zip=", zip, "&income-type=dollars&income=", income, "&employer-coverage=0&people=", people, "&alternate-plan-family=individual&adult-count=", adult, "&adults%5B0%5D%5Bage%5D=21&adults%5B0%5D%5Btobacco%5D=0&child-count=", children)
# This returns empty string
r = read_html(url) %>%
html_nodes(xpath ='//*[@id="subsidy-calculator-new"]/div[5]/div/div/dl/dd[1]/span') %>% html_text()
# This returns "Number of children (20 and younger) enrolling in Marketplace coverage", a line that's not in the grey box.
r = read_html(url) %>%
html_nodes(xpath = '//*[@id="subsidy-form"]/div[2]/div[3]/div[3]/p') %>%
html_text()
答案 0 :(得分:0)
这些值是通过页面上运行的脚本生成的。您当前的方法不允许这样做,因此您的结果。使用允许运行脚本的方法(例如RSelenium)可能会更好。
您完成的表单#subsidy-form将值输入到脚本标签#results-template中的模板中。脚本https://www.kff.org/wp-content/themes/kaiser-foundation-2016/interactives/subsidy-calculator/2019/calculator.js?ver=1.7.7涵盖了相关的计算,您将在其中找到逻辑和预设值,例如每年的贫困线。
最简单的快速视图可能是在创建新的SubsidyCalculator
对象以处理表单(即以var sc = new SubsidyCalculator
开头的js)时检查javascript变量。您可以使用值加上从json返回的值(我认为是但尚未确认)对这些变量进行“反向工程”,根据邮政编码,将kff_sc
开头的6个变量馈入计算器,例如silver: kff_sc.silver
。有了脚本顶部的默认值,您就会了解大致数字。
与邮政编码有关的数字可从以下位置检索:https://www.kff.org/wp-content/themes/kaiser-foundation-2016/interactives/subsidy-calculator/2019/json/zips/94.json,其中.json之前的最后两个数字是邮政编码的前两个数字。您可以从输入验证脚本确定:https://www.kff.org/wp-content/themes/kaiser-foundation-2016/interactives/subsidy-calculator/2019/shared.js?ver=1.7.7
var bucket = $( this ).val().substring( 0, 2 );
if ( kff_sc.buckets[bucket] ) return;
$.ajax( '/wp-content/themes/vip/kaiser-foundation-2016/interactives/subsidy-calculator/2019/json/zips/' + bucket + '.json',
前两位数字确定存储桶。
总而言之,您可能会实现自己的计算器,但是您将重新发明轮子。似乎只需将浏览器自动化然后提取结果值就容易得多。