Соскоб ajax сайтов с г - PullRequest
       119

Соскоб ajax сайтов с г

2 голосов
/ 26 марта 2020

Кто-нибудь знает, могу ли я очистить этот сайт или этот с помощью httr и rvest, или мне следует использовать селен или фантом js?

Оба сайтов, кажется, используют ajax, и я, кажется, не могу пройти через него.

По сути, я хочу сказать следующее:

# I want this to return the titles of the listings, but I get character(0)
"https://www.sahibinden.com/satilik" %>% 
  read_html() %>% 
  html_nodes(".searchResultsItem .classifiedTitle") %>% 
  html_text() 

# I want this to return the prices of the listings, but I get 503
"https://www.hurriyetemlak.com/konut" %>% 
  read_html() %>% 
  html_nodes(".listing-item .list-view-price") %>% 
  html_text()

Любые идеи с v8, или искусственные сеансы приветствуются.

Также приветствуются любые чисто скрученные решения. Я постараюсь перевести их в httr позже :)

Спасибо

1 Ответ

2 голосов
/ 30 марта 2020

Вам нужно будет установить куки, чтобы сделать успешный запрос.

Необходимо проверить, разрешает ли сайт (sahibinden) очищать.

  • robotstxt::paths_allowed(paths = "https://www.sahibinden.com/satilik", warn = FALSE) -> robotstxt делает Кажется, не запрещайте это
  • , если вы обновляете сайт после удаления файлов cookie в браузере, сайт больше не разрешает доступ и сообщает о необычном поведении -> указание на меры против царапанья
  • Обязательно ознакомьтесь с условиями использования.

Поэтому я хотел бы поделиться «теоретическим» кодом, но не требуемыми данными cook ie, которые в любом случае зависят от пользователя.

Полный код будет читать:

library(xml2)
library(httr)
library(magrittr)
library(DT)
url <- "https://www.sahibinden.com/satilik"

YOUR_COOKIE_DATA <- NULL
if(is.null(YOUR_COOKIE_DATA)){
  stop("You did not set your cookie data. 
        Also please check if terms of usage allow the scraping.")
}
response <- url %>% GET(add_headers(.headers = c(Cookie = YOUR_COOKIE_DATA))) %>%
            content(type = "text", encoding = "UTF-8")
xpathes <- data.frame(
    XPath0 = 'td[2]',
    XPath1 = 'td[3]/a[1]',
    XPath2 = 'td/span[1]',
    XPath3 = 'td/span[2]',
    XPath4 = 'td[4]',
    XPath5 = 'td[5]',
    XPath6 = 'td[6]',
    XPath7 = 'td[7]',
    XPath8 = 'td[8]'
)

nodes <- response %>% read_html %>% html_nodes(xpath = 
"/html/body/div/div/form/div/div/table/tbody/tr"
)

output <- lapply(xpathes, function(xpath){
    lapply(nodes, function(node) html_nodes(x = node, xpath = xpath) %>% 
    {ifelse(length(.), yes = html_text(.), no = NA)}) %>% unlist
})
output %>% data.frame %>% DT::datatable()

Относительно права на очистку данных сайта. Я пытаюсь следовать: Следует ли помечать вопросы, которые нарушают Условия использования API? . Хотя в данном случае это «потенциальное нарушение».

Чтение файлов cookie программно:

Я не уверен, что с помощью браузера можно полностью пропустить:

...