веб-очистка таблицы мутаций из базы данных COSMI C - PullRequest
1 голос
/ 12 апреля 2020

У меня возникают трудности при очистке таблицы мутаций в гене MY C из базы данных COSMI C с использованием rvest. Я получаю только пустой список. Выход ниже. Я подтвердил, что значения находятся в файле HTML (т. Е. Не JAVA, поскольку значения находятся в самом файле HTML). Я также подтвердил, что элемент, который я пытаюсь очистить, - это таблица. Я пытался использовать xpath и CSS. Я также подтвердил разрешение на очистку. Пожалуйста, посоветуйте

R Консольный вывод

> library("rvest")
> library("dplyr")
> library("robotstxt")
> library("XML")
> library("RSelenium")
> library("splashr")
> library("reticulate")
> url = "https://cancer.sanger.ac.uk/cosmic/gene/analysis?ln=MYC#variants"
> paths_allowed(url)
 cancer.sanger.ac.uk                      No encoding supplied: defaulting to UTF-8.


[1] TRUE
> Xpath = "//*[@id= 'DataTables_Table_0']"
> a = read_html(url) %>% html_nodes(xpath = Xpath) %>% html_table()
> a
list()
> Selector = "#DataTables_Table_0"
> a = read_html(url) %>% html_nodes(css = Selector) %>% html_table()
> a
list()

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете сделать тот же запрос, что и веб-страница, для динамического получения результатов (отображается на вкладке сети инструментов dev F12 .) Измените параметр DisplayLength на все результаты (1394) или установите для него начальный большое число и проверьте возврат, чтобы получить действительный общий счетчик результатов и выполнить любые дальнейшие запросы, необходимые для получения всех результатов.

Пока вы можете сделать простой запрос rvest

library(rvest)

url <- 'https://cancer.sanger.ac.uk/cosmic/gene/mutations?all_data=&coords=AA%3AAA&dr=&end=455&gd=&id=359910&ln=MYC&seqlen=455&src=gene&start=1&export=json&sEcho=2&iColumns=6&sColumns=&iDisplayStart=0&iDisplayLength=1394&mDataProp_0=0&sSearch_0=&bRegex_0=false&bSearchable_0=true&bSortable_0=true&mDataProp_1=1&sSearch_1=&bRegex_1=false&bSearchable_1=true&bSortable_1=true&mDataProp_2=2&sSearch_2=&bRegex_2=false&bSearchable_2=true&bSortable_2=true&mDataProp_3=3&sSearch_3=&bRegex_3=false&bSearchable_3=true&bSortable_3=true&mDataProp_4=4&sSearch_4=&bRegex_4=false&bSearchable_4=true&bSortable_4=true&mDataProp_5=5&sSearch_5=&bRegex_5=false&bSearchable_5=true&bSortable_5=true&sSearch=&bRegex=false&iSortCol_0=0&sSortDir_0=asc&iSortingCols=1'

r <- read_html(url) %>% html_node('p') %>% html_text()

write.table(r,file="data.txt", sep='\t', row.names = FALSE)

Отредактируйте @Snehal Patel, чтобы получить желаемый формат:

x = read.table("data.txt", sep = "\t", skip = 2, fill = TRUE) 
colnames(x) = c("AA_Position", "CDS_Mutation", "AA_Mutation", "COSMIC_ID", "count", "Mutation_type")

С помощью httr, передавая различные заголовки и создавая фрейм данных из ответа.

library(httr)
library(purrr)
library(rvest)

headers = c(
  'X-Requested-With' = 'XMLHttpRequest',
  'User-Agent' = 'Mozilla/5.0',
  'Referer' = 'https://cancer.sanger.ac.uk/cosmic/gene/analysis?ln=MYC'
)

params = list(
  'coords' = 'AA:AA',
  'end' = '455',
  'id' = '359910',
  'ln' = 'MYC',
  'seqlen' = '455',
  'src' = 'gene',
  'start' = '1',
  'export' = 'json',
  'sEcho' = '4',
  'iColumns' = '6',
  'iDisplayStart' = '0',
  'iDisplayLength' = '1394', #for all results. You can set to number higher than you expect then check first result for actual
  'mDataProp_0' = '0',
  'bRegex_0' = 'false',
  'bSearchable_0' = 'true',
  'bSortable_0' = 'true',
  'mDataProp_1' = '1',
  'bRegex_1' = 'false',
  'bSearchable_1' = 'true',
  'bSortable_1' = 'true',
  'mDataProp_2' = '2',
  'bRegex_2' = 'false',
  'bSearchable_2' = 'true',
  'bSortable_2' = 'true',
  'mDataProp_3' = '3',
  'bRegex_3' = 'false',
  'bSearchable_3' = 'true',
  'bSortable_3' = 'true',
  'mDataProp_4' = '4',
  'bRegex_4' = 'false',
  'bSearchable_4' = 'true',
  'bSortable_4' = 'true',
  'mDataProp_5' = '5',
  'bRegex_5' = 'false',
  'bSearchable_5' = 'true',
  'bSortable_5' = 'true',
  'bRegex' = 'false',
  'iSortCol_0' = '0',
  'sSortDir_0' = 'asc',
  'iSortingCols' = '1'
)

r <- content(httr::GET(url = 'https://cancer.sanger.ac.uk/cosmic/gene/mutations', httr::add_headers(.headers=headers), query = params)) %>% 
      .$aaData

df <- map_df(r, function(i) {

  data.frame(
   `Position` = read_html(i[[1]]) %>% html_node('a') %>% html_text() %>% as.numeric() ,
   `CDS Mutation` = read_html(i[[2]]) %>% html_node('a') %>% html_text(),
    `AA Mutation` = read_html(i[[3]]) %>% html_node('a') %>% html_text(),
   `Legacy Mutation ID` = i[[4]],
      `Count` = i[[5]] ,
      `Type` = i[[6]] , 
      stringsAsFactors=FALSE)
}) 
...