Очистите веб-страницу с помощью phantomjs и rvest

Я пытаюсь очистить следующую веб-страницу: https://www.occ.com.mx/empleos-en-nuevo-leon с помощью rvest и selectorgadget, что кажется простым.

Однако, похоже, он построен с использованием javascript, поэтому я следил за этим, установил phantomjsи попытался создать веб-страницу html локально с помощью следующего скрипта.

// scrape_occ.js

var webPage = require('webpage');
var page = webPage.create();

var fs = require('fs');
var path = 'occ.html'

page.open('https://www.occ.com.mx/empleos-en-nuevo-leon', function (status) {
  var content = page.content;
  fs.write(path,content,'w')
  phantom.exit();
}); 

И вызов R: system("phantomjs occ.js") создает html локально, но дает результаты, аналогичные исходной rvest попытке. У меня есть еще несколько узлов, но форма, похоже, мешает ...

p <- read_html("occ.html")
p %>% html_structure()
<html>
  <head>
    {text}
    <meta [http-equiv, content]>
    {text}
    <meta [http-equiv, content]>
    {text}
    <meta [http-equiv, content]>
    {text}
    <noscript>
      {text}
    {text}
  <body>
    <apm_do_not_touch>
      {text}
      <script [language]>
        {cdata}
      {text}
    {text}
    <form [action, method]>
      <input [type, name, value]>
      <input [type, name, value]>
      <input [type, name, value]>
      <input [type, name, value]>
      <input [type, name, value]>
      <input [type, name, value]>
      <input [type, name, value]>
      <input [type, name, value]>

Как правильно это сделать? Что мне не хватает?


person eflores89    schedule 17.02.2016    source источник


Ответы (1)


RSelenium (последний вариант для меня, учитывая, что он создает скрипт для браузера) может здесь помочь:

library(RSelenium)
library(rvest)
library(dplyr)

checkForServer()
startServer()
remDr <- remoteDriver()
remDr$open()
remDr$navigate("https://www.occ.com.mx/empleos-en-nuevo-leon")
pg <- remDr$getPageSource()
remDr$close()

doc <- read_html(pg[[1]])

trimws(html_text(html_nodes(doc, "div.lineamod_sr")))

##  [1] "Feb 16  \n                Coordinador de Operaciones (Zona Cienega de Flores)"      
##  [2] "Feb 16  \n                Coordinador de Operaciones (Zona Apodaca)"                
##  [3] "Feb 16  \n                Ventas de Tecnologias de informacion (zona Monterrey)"    
##  [4] "Feb 16  \n                Practicante en Capacitación"                              
##  [5] "Feb 16  \n                Home Office: Reclutador Bilingüe"                         
##  [6] "Feb 16  \n                SISTEMAS"                                                 
##  [7] "Feb 16  \n                Asociado de RH"                                           
##  [8] "Feb 16  \n                Practicante Import Export"                                
##  [9] "Feb 16  \n                Comprador de refacciones"                                 
## [10] "Feb 16  \n                Maestra Auxiliar de Preescolar"                          

Прочитав комментарий Эдуардо, по прихоти я попробовал это с помощью rvest после того, как проверил веб-страницу и взял ресурс главной страницы с помощью «Копировать как cURL» (см. Инструменты разработчика Chrome). Я использовал свой devtools pkg curlconverter (devtools::install_github("hrbrmstr/curlconverter"))

library(httr)
library(rvest)
library(curlconverter)

req <- make_req(straighten("curl 'https://www.occ.com.mx/empleos-en-nuevo-leon' -H 'Pragma: no-cache' -H 'Origin: https://www.occ.com.mx' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.8' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.39 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: no-cache' -H 'Referer: https://www.occ.com.mx/empleos-en-nuevo-leon' -H 'Cookie: cookie_home3=240784394.20480.0000; TS01650164_28=011b64c78f24f98a905a1610d142f8f5e8e6de557a270318cd246d8bdad634ad9d692ef9a7e7c5f5ee6125dfa6d154a7ecc9912326; q=; cat=; fn=; salary=; tm=60; loc=; page=1; TS01650164_77=08cb11f491ab28002f9f692817ac18f609a6564679dd056ae514dd5ed8f04683e016c84db8ad4aff81249c3ffa6f4d72086a11c1a482380047cb7d1b1a33ef2b110ce9bf57566934a0ba894dd447b3cf48fdfb5b4e17eb905895ebb597a5e878746dd0fba0f4fbb336e2f855820d002a; JobSeekerInfo=5877fd484ea1405b8e4780c2c0b05365|; searchtype=1; loctemp=MX-NL; fntemp=MX-NL; cattemp=; qtemp=; salarytemp=; tmtemp=; jobids=8687636,8687651,8689022,8688254,8688719,8688496,8687786,8687676,8688424,8654486,8688354,8687735,8687291,8688736,8687917,8688614,8687428,8688586,8688659,8687483,8688163,8654471,8687688,8688932,8689017,8642398,8687594,8688554,8688940,8687254,8688285,8415967,8687500,8688224,8687619,8688640,8688757,8689026,8688796,8702349,8728708,8728866,8728860,8721116,8591064,8729151,8729124,8729136,8729485,8551881; returnurl=/empleos-en-nuevo-leon; Culture=es-MX; TS01650164=01b518c62e8b19f2612cfbd7378cc0b73784ab414f17fdcc566da5c243d4a31e6ef629c80498c411d543fa42cb92729a648fc738579c3333ce81ff4708684a7e9f18f32db913b5b26edaa3bb4a0ad4d5ee740b16ab26bce774e39df018e046ddcf1c6529ce4b2194e780f9f039d729db6d958e850ead9570fc4748aa65cd7f85c0b79744cbf998c055a8314887942f194106c71e4cc2f736e495d21f228e9ceabfd36dc194b5ee20d31a00bc2b6469c8645ed502656b60a0a9b38aaf38a3435488f6e942917750d71f27386a87f3ff25f3bd1d163c0e6bd60212d36a3056fbdd4e055dab8c; sitemgrOCCM=false; sitemgrRUE=false; loaded=1' -H 'Connection: keep-alive' -H 'DNT: 1' --data 'TS01650164_id=3&TS01650164_cr=08cb11f491ab2800f5f07209cf7558bf5a68e875ec0c3a7ca8beb59ff0f5da214e8ca0f0b0d3925c3466838922d655d208203848fa894800ea2891c392679d0ca17d55a2a828b5e4bbe97f5e3310800fb216c3a9821974a3aa20fa64d8feec278da6e1000bf2a8ac7f2533a8b0e5f5424e20ea558b261d881d570b85067b4859&TS01650164_76=0&TS01650164_86=0&TS01650164_md=1&TS01650164_rf=0&TS01650164_ct=0&TS01650164_pd=0' --compressed"))[[1]]
resp <- req()
doc <- content(resp, as="parsed")
trimws(html_text(html_nodes(doc, "div.lineamod_sr")))

И он возвращает те же результаты.

Этот curlconverter материал фактически выполняет такую ​​функцию:

httr::VERB(
  verb = "POST", 
  url = "https://www.occ.com.mx/empleos-en-nuevo-leon", 
  add_headers(Pragma = "no-cache", 
              Origin = "https://www.occ.com.mx", 
              `Accept-Encoding` = "gzip, deflate", 
              `Accept-Language` = "en-US,en;q=0.8", 
              `Upgrade-Insecure-Requests` = "1", 
              `User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.39 Safari/537.36", 
              Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 
              `Cache-Control` = "no-cache", 
              Referer = "https://www.occ.com.mx/empleos-en-nuevo-leon", 
              Connection = "keep-alive", 
              DNT = "1"), 
  set_cookies(cookie_home3 = "240784394.20480.0000", 
              TS01650164_28 = "011b64c78f24f98a905a1610d142f8f5e8e6de557a270318cd246d8bdad634ad9d692ef9a7e7c5f5ee6125dfa6d154a7ecc9912326", 
              q = "", cat = "", fn = "", 
              salary = "", tm = "60", 
              loc = "", page = "1", TS01650164_77 = "08cb11f491ab28002f9f692817ac18f609a6564679dd056ae514dd5ed8f04683e016c84db8ad4aff81249c3ffa6f4d72086a11c1a482380047cb7d1b1a33ef2b110ce9bf57566934a0ba894dd447b3cf48fdfb5b4e17eb905895ebb597a5e878746dd0fba0f4fbb336e2f855820d002a", 
              JobSeekerInfo = "5877fd484ea1405b8e4780c2c0b05365|", 
              searchtype = "1", loctemp = "MX-NL", 
              fntemp = "MX-NL", cattemp = "", 
              qtemp = "", salarytemp = "", 
              tmtemp = "", jobids = "8687636,8687651,8689022,8688254,8688719,8688496,8687786,8687676,8688424,8654486,8688354,8687735,8687291,8688736,8687917,8688614,8687428,8688586,8688659,8687483,8688163,8654471,8687688,8688932,8689017,8642398,8687594,8688554,8688940,8687254,8688285,8415967,8687500,8688224,8687619,8688640,8688757,8689026,8688796,8702349,8728708,8728866,8728860,8721116,8591064,8729151,8729124,8729136,8729485,8551881", 
              returnurl = "/empleos-en-nuevo-leon", 
              Culture = "es-MX", TS01650164 = "01b518c62e8b19f2612cfbd7378cc0b73784ab414f17fdcc566da5c243d4a31e6ef629c80498c411d543fa42cb92729a648fc738579c3333ce81ff4708684a7e9f18f32db913b5b26edaa3bb4a0ad4d5ee740b16ab26bce774e39df018e046ddcf1c6529ce4b2194e780f9f039d729db6d958e850ead9570fc4748aa65cd7f85c0b79744cbf998c055a8314887942f194106c71e4cc2f736e495d21f228e9ceabfd36dc194b5ee20d31a00bc2b6469c8645ed502656b60a0a9b38aaf38a3435488f6e942917750d71f27386a87f3ff25f3bd1d163c0e6bd60212d36a3056fbdd4e055dab8c", 
              sitemgrOCCM = "false", 
              sitemgrRUE = "false", loaded = "1"), 
  body = list(TS01650164_id = "3", 
              TS01650164_cr = "08cb11f491ab2800f5f07209cf7558bf5a68e875ec0c3a7ca8beb59ff0f5da214e8ca0f0b0d3925c3466838922d655d208203848fa894800ea2891c392679d0ca17d55a2a828b5e4bbe97f5e3310800fb216c3a9821974a3aa20fa64d8feec278da6e1000bf2a8ac7f2533a8b0e5f5424e20ea558b261d881d570b85067b4859", 
              TS01650164_76 = "0", TS01650164_86 = "0", 
              TS01650164_md = "1", TS01650164_rf = "0", 
              TS01650164_ct = "0", TS01650164_pd = "0"), 
  encode = "form") 

Проблема в том, что он делает этот POST запрос с теми настройками файлов cookie, которые зависят от времени. Итак, это сработает, если сделать это относительно быстро после извлечения команды «Копировать как cURL» из сеанса инструментов разработчика, но я не уверен, сколько времени спустя это произойдет.

person hrbrmstr    schedule 17.02.2016
comment
Спасибо! Это все еще вызывает эту ошибку: github.com/ropensci/RSelenium/issues/54 (Пытаюсь отладить) - person eflores89; 17.02.2016
comment
:-) Это будет моя вторая проблема с Selenium в целом. Обеспечение согласованной работы на разных платформах. Я все еще не могу справиться с фантомжсоном на Эль-Капитане. - person hrbrmstr; 17.02.2016
comment
Я только что обновил его, показывая, что простой ol rvest, кажется, работает. Что он вам не прихватывал? - person hrbrmstr; 17.02.2016
comment
Вчера я потратил часы, пытаясь заставить RSelenium работать, но безрезультатно. Я не уверен, почему мой rvest не работает, но я попробую ваш подход сегодня вечером (сейчас я не могу проверить). Спасибо. - person eflores89; 18.02.2016
comment
одну секунду. Я просто понял, что что-то делал до этого. буду обновлять. - person hrbrmstr; 18.02.2016
comment
Спасибо! Две проблемы: 1) похоже, что это работает (я вижу doc как то, что кажется html, за исключением того, что rvest действует, не уверен, что это моя локаль или есть какой-либо способ принуждения к html, потому что ошибка кажется скажите, что это не так: Error in UseMethod("read_xml") : no applicable method for 'read_xml' applied to an object of class "c('HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument')" 2) Chrome cURL вроде работает, но вы правы насчет файлов cookie, в идеале что-то программное было бы лучше ... посмотрю, работает ли Rselenium ... - person eflores89; 18.02.2016