Web Scraping интерактивная карта (javascript) с R и PhantomJS - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь собрать данные с интерактивной карты (ищу данные о преступности для округа). Я использую R (rvest) и пытаюсь использовать фантом js тоже. Я новичок в веб-очистке, поэтому я не совсем понимаю, как все элементы работают вместе (пытаясь добраться туда).

Проблема, которую я считаю, заключается в том, что после запуска фантома js и загрузив html с помощью пакета Rvest R, я получаю больше сценариев и нет четких данных в html. Мой код ниже.

writeLines("var url = 'http://www.google.com';
var page = new WebPage();
var fs = require('fs');

page.open(url, function (status) {
    just_wait();
});

function just_wait() {
    setTimeout(function() {
               fs.write('cool.html', page.content, 'w');
            phantom.exit();
    }, 2500);
}
", con = "scrape.js")

Функция, которая берет URL, который я хочу очистить

s_scrape <- function(url = "https://gis.adacounty.id.gov/apps/crimemapper/", 
                  js_path = "scrape.js", 
                  phantompath = "/Users/alihoop/Documents/phantomjs/bin/phantomjs"){

# this section will replace the url in scrape.js to whatever you want 
lines <- readLines(js_path)
lines[1] <- paste0("var url ='", url ,"';")
writeLines(lines, js_path)

command = paste(phantompath, js_path, sep = " ")
system(command)

}

Выполните функцию js_scrape () и получите файл html, сохраненный как "круто. html"

js_scrape()

Где я не понимаю, что делать дальше, это следующий код R:

map_data <- read_html('cool.html') %>%
            html_nodes('script')

Вывод, который я получаю в HTML через фантом js снова просто сценарии. Нужна помощь в том, как действовать, когда сталкиваешься (с моей точки зрения) javascript вложено в javascript сценариев (?)

Спасибо!

1 Ответ

0 голосов
/ 15 марта 2020

Этот сайт использует javascript для отправки запросов на сервер. Одно из решений заключается в том, чтобы воспроизвести запрос оставшейся части и напрямую прочитать возвращаемый файл JSON. Это исключает необходимость использования Phantom js.

В настройках инструментов разработчика в вашем браузере и просмотре файлов xhr вы найдете файл (ы) с именем «query» со ссылкой, аналогичной: «https://gisapi.adacounty.id.gov/arcgis/rest/services/CrimeMapper/CrimeMapperWAB/FeatureServer/11/query?f=json&where=1%3D1&returnGeometry=true&spatialRel=esriSpatialRelIntersects&outFields=* & outSR = 102100 & resultOffset = 0 & resultRecordCount = 1000 "

Прочтите этот ответ JSON напрямую и преобразуйте его в список с использованием пакета jsonlite:

library(jsonlite)
output<-jsonlite::fromJSON("https://gisapi.adacounty.id.gov/arcgis/rest/services/CrimeMapper/CrimeMapperWAB/FeatureServer/11/query?f=json&where=1%3D1&returnGeometry=true&spatialRel=esriSpatialRelIntersects&outFields=*&outSR=102100&resultOffset=0&resultRecordCount=1000")
output$features

Найдите первое число в ссылке , (В данном случае 11) "FeatureServer / 11 / query? F = json". Этот номер будет определять, с каким преступлением запрашивать сервер. Я обнаружил, что это может принимать значение от 0 до 11. Введите 0 для поджога, 4 для наркотиков, 11 для вандализма и т. Д. c.

...