【问题标题】:R scraping entire html, not just page viewR抓取整个html,而不仅仅是页面视图
【发布时间】:2014-07-15 14:10:40
【问题描述】:

一个很难用一句话来表达的问题,但我正在尝试从以下页面中抓取一些 html

http://www.ncbi.nlm.nih.gov/snp/?term=(human[Organism])+AND+GLRA3[Gene Name]

我可以使用 R 抓取我需要的内容,但由于浏览器只显示前 20 个条目,因此我只能使用相应的 html。这会导致问题,因为我想抓取 所有 条目,而不仅仅是浏览器页面提供的条目。无论如何,这是我的 R 代码

library(XML)
library(httr)

#Go to Nectar Mutation and get SNP refs
dbsnp.searchterm="(human[Organism])+AND+GLRA1[Gene Name]"
dbsnp.url=paste0("http://www.ncbi.nlm.nih.gov/snp/?term=",dbsnp.searchterm)
dbsnp.get=GET(dbsnp.url)
dbsnp.content=content(dbsnp.get, as="text")
links<-xpathSApply(htmlParse(dbsnp.content), "//a[contains(@href, 'snp_ref')]",xmlGetAttr,"href")

结果

> links
 [1] "/projects/SNP/snp_ref.cgi?rs=116474260"
 [2] "/projects/SNP/snp_ref.cgi?rs=121918408"
 [3] "/projects/SNP/snp_ref.cgi?rs=121918409"
 [4] "/projects/SNP/snp_ref.cgi?rs=121918410"
 [5] "/projects/SNP/snp_ref.cgi?rs=121918411"
 [6] "/projects/SNP/snp_ref.cgi?rs=121918412"
 [7] "/projects/SNP/snp_ref.cgi?rs=121918413"
 [8] "/projects/SNP/snp_ref.cgi?rs=121918414"
 [9] "/projects/SNP/snp_ref.cgi?rs=121918415"
[10] "/projects/SNP/snp_ref.cgi?rs=121918416"
[11] "/projects/SNP/snp_ref.cgi?rs=121918417"
[12] "/projects/SNP/snp_ref.cgi?rs=121918418"
[13] "/projects/SNP/snp_ref.cgi?rs=267600494"
[14] "/projects/SNP/snp_ref.cgi?rs=267606848"
[15] "/projects/SNP/snp_ref.cgi?rs=281864912"
[16] "/projects/SNP/snp_ref.cgi?rs=281864913"
[17] "/projects/SNP/snp_ref.cgi?rs=281864914"
[18] "/projects/SNP/snp_ref.cgi?rs=281864915"
[19] "/projects/SNP/snp_ref.cgi?rs=281864916"
[20] "/projects/SNP/snp_ref.cgi?rs=281864917"

您会注意到我需要 4058 个条目。

【问题讨论】:

    标签: html r xpath web-scraping


    【解决方案1】:

    我花了整个下午的时间,但我仍然只有一半的解决方案(第一次使用 XML)。无论如何,我发现您可以使用以下链接获取 XML 格式的结果;

    http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=SNP&term=(human[Organism])+AND+GLRA3[Gene+Name]
    

    db 代表您要在其中搜索的数据库,term 是不言自明的。

    在结果之上,您将看到;

    <Count>4736</Count>
    <RetMax>20</RetMax>
    

    在此 ID 列表开始并显示 20 个 ID,相当于 rs 中的值;

    /projects/SNP/snp_ref.cgi?rs=116474260

    您可以使用 GET 函数在 R 中获取此信息。现在,如果您能找到一种方法让 R 读取 Count 行中的数字(这是可能的结果数量) ),然后再次使用GET 函数,但现在将&amp;RetMax=X 添加到链接末尾,其中X 是Count 行中的数字。

    例如;

    http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=SNP&term=(human[Organism])+AND+GLRA3[Gene+Name]&RetMax=4736
    

    现在所有的 ID 都导入到 R 中(同样我缺乏从数据中很好地提取它们的技能,所以这可能是由其他人来弄清楚)。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      你会想要使用@Roost 找到的 api。我要补充一点,httr 有一个用于添加查询参数的内置方法,您应该使用它,因为它会自动为您的查询参数进行 URL 编码。

      在 XML 中,如果您对 xPath 不太熟悉,使用 xmlToList 会更容易,但您可以选择自己的方式来解析 XML。

      library(XML)
      library(httr)
      
      # Go to api and get Count
      dbsnp.searchterm <- "(human[Organism]) AND GLRA3[Gene Name]"
      dbsnp.url <- "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi"
      dbsnp.get <- GET(dbsnp.url, query=list(db="SNP", term=dbsnp.searchterm))
      dbsnp.content <- content(dbsnp.get, as="text")
      dbsnp.xml <- xmlParse(dbsnp.content)
      
      max_count <- xmlToList(dbsnp.xml)$Count
      
      # Use the Count to form the query that you want
      dbsnp.full.get <- GET(dbsnp.url, query=list(
          db="SNP", 
          term=dbsnp.searchterm, 
          RetMax=max_count))
      dbsnp.full.content <- content(dbsnp.full.get, as="text")
      dbsnp.full.xml <- xmlParse(dbsnp.full.content)
      dbsnp.full.list <- xmlToList(dbsnp.full.xml)
      
      prefix <- "/projects/SNP/snp_ref.cgi?rs="
      
      dbsnp.links <- paste0(prefix, unlist(dbsnp.full.list$IdList))
      

      【讨论】:

      • 嗨 Waternova - 这是我会采取的类似方法。我很习惯使用 xpath 查询,这就是为什么 xpathSAPpply() 函数对我有用。但这看起来也可以。
      猜你喜欢
      • 1970-01-01
      • 2018-06-08
      • 2020-10-15
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      相关资源
      最近更新 更多