2015-12-26 5 views
5

मैं आर में कुछ वेब स्क्रैप स्क्रिप्ट का परीक्षण कर रहा हूं। मैंने कई ट्यूटोरियल, दस्तावेज़ पढ़े हैं और विभिन्न चीजों की कोशिश की है लेकिन अब तक कोई सफलता नहीं है।आर वेब स्क्रैपर jsessionid

यूआरएल जो मैं स्क्रैप करने की कोशिश कर रहा हूं वह this one है। इसमें सार्वजनिक, सरकारी डेटा और वेब स्क्रैपर्स के खिलाफ कोई बयान नहीं है। यह पुर्तगाली में है, लेकिन मेरा मानना ​​है कि यह एक बड़ी समस्या नहीं होगी।

यह कई क्षेत्रों के साथ एक खोज फ़ॉर्म दिखाता है। मेरा परीक्षण किसी विशेष राज्य ("आरजे" से डेटा की खोज कर रहा था, इस मामले में क्षेत्र "यूएफ" है), और "म्यूनिकिपियो" क्षेत्र में शहर ("रियो डी जेनेरो")। "Pesquisar" (खोज) क्लिक करके, यह निम्न उत्पादन पता चलता है:

enter image description here

Firebug का उपयोग करना, मैं यूआरएल यह कहता है (ऊपर मानकों का प्रयोग करके) है पाया:

http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam?buscaForm=buscaForm&codEntidadeDecorate%3AcodEntidadeInput=&noEntidadeDecorate%3AnoEntidadeInput=&descEnderecoDecorate%3AdescEnderecoInput=&estadoDecorate%3A**estadoSelect=33**&municipioDecorate%3A**municipioSelect=3304557**&bairroDecorate%3AbairroInput=&pesquisar.x=42&pesquisar.y=16&javax.faces.ViewState=j_id10 

साइट के रूप में उपयोग करते हुए देखा जा सकता है, एक jsessionid का उपयोग करता है निम्नलिखित:

library(rvest) 
library(httr) 
url <- GET("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/") 
cookies(url) 

को जानने का यह एक jsessionid का उपयोग करता है, मैं कुकीज़ (यूआरएल) इस जानकारी की जाँच करने के लिए प्रयोग किया जाता है, और यह एक नया uRL में इस्तेमाल किया इस तरह:

url <- read_html("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam;jsessionid=008142964577DBEC622E6D0C8AF2F034?buscaForm=buscaForm&codEntidadeDecorate%3AcodEntidadeInput=33108064&noEntidadeDecorate%3AnoEntidadeInput=&descEnderecoDecorate%3AdescEnderecoInput=&estadoDecorate%3AestadoSelect=org.jboss.seam.ui.NoSelectionConverter.noSelectionValue&bairroDecorate%3AbairroInput=&pesquisar.x=65&pesquisar.y=8&javax.faces.ViewState=j_id2") 
html_text(url) 

ठीक है, आउटपुट में डेटा नहीं है। वास्तव में, इसमें एक त्रुटि संदेश है। अंग्रेजी में अनुवादित, यह मूल रूप से कहता है कि सत्र समाप्त हो गया था।

मुझे लगता है कि यह एक मूल गलती है, लेकिन मैंने चारों ओर देखा और इसे दूर करने का कोई तरीका नहीं मिला।

उत्तर

3

इस संयोजन मेरे लिए काम किया:

library(curl) 
library(xml2) 
library(httr) 
library(rvest) 
library(stringi) 

# warm up the curl handle 
start <- GET("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam") 

# get the cookies 
ck <- handle_cookies(handle_find("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam")$handle) 

# make the POST request 
res <- POST("http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam;jsessionid=" %s+% ck[1,]$value, 
      user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:40.0) Gecko/20100101 Firefox/40.0"), 
      accept("*/*"), 
      encode="form", 
      multipart=FALSE, # this gens a warning but seems to be necessary 
      add_headers(Referer="http://www.dataescolabrasil.inep.gov.br/dataEscolaBrasil/home.seam"), 
      body=list(`buscaForm`="buscaForm", 
         `codEntidadeDecorate:codEntidadeInput`="", 
         `noEntidadeDecorate:noEntidadeInput`="", 
         `descEnderecoDecorate:descEnderecoInput`="", 
         `estadoDecorate:estadoSelect`=33, 
         `municipioDecorate:municipioSelect`=3304557, 
         `bairroDecorate:bairroInput`="", 
         `pesquisar.x`=50, 
         `pesquisar.y`=15, 
         `javax.faces.ViewState`="j_id1")) 

doc <- read_html(content(res, as="text")) 

html_nodes(doc, "table") 
## {xml_nodeset (5)} 
## [1] <table border="0" cellpadding="0" cellspacing="0" class="rich-tabpanel " id="j_id17" sty ... 
## [2] <table border="0" cellpadding="0" cellspacing="0">\n <tr>\n <td>\n  <img alt="" ... 
## [3] <table border="0" cellpadding="0" cellspacing="0" id="j_id18_shifted" onclick="if (RichF ... 
## [4] <table border="0" cellpadding="0" cellspacing="0" style="height: 100%; width: 100%;">\n ... 
## [5] <table border="0" cellpadding="10" cellspacing="0" class="dr-tbpnl-cntnt-pstn rich-tabpa ... 

मैं BurpSuite इस्तेमाल किया निरीक्षण करने के लिए क्या हो रहा था और "cURL के रूप में कॉपी" से उत्पादन के साथ आदेश पंक्ति पर एक त्वरित परीक्षण और --verbose जोड़ने किया था मैं कर सकता करने के लिए सत्यापित/प्राप्त किया जा रहा था मान्य करें। मैंने फिर curl पैरामीटर की नकल की।

नंगे खोज पृष्ठ पर शुरू करके, सत्र आईडी और बिगिप सर्वर के लिए कुकीज़ पहले ही गर्म हो चुकी हैं (यानी प्रत्येक अनुरोध के साथ भेजा जाएगा ताकि आपको उनके साथ गड़बड़ न हो) लेकिन आपको अभी भी आवश्यकता है इसे यूआरएल पथ पर भरें ताकि हमें उन्हें पुनर्प्राप्त करना पड़े, फिर इसे भरें।

+0

धन्यवाद बहुत, hrbmstr। यह अच्छी तरह से काम किया! –

संबंधित मुद्दे