2017-10-25 19 views
0

getURL() 기능이있는 웹 사이트를 폐업 할 때 RCurl에 문제가 있습니다. http://dogecoin.com와 예를 들어 그것은 NULL 문자 (체인의 중간에 litteral 번역하지 않다는 오류를 반환합니다. 매우 드문 경우R에서 getURL()을 사용하여 웹 페이지를 스크래핑 할 때 null 문자를 피하는 방법은 무엇입니까?

> x <- getURL("http://dogecoin.com/") 
Error in curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : 
    caractère nul au milieu de la chaîne : '\037\x8b\b\0\0\0\0\0\0\003\xed]\xebr\xdbF\x96\xfe\035=E\x9b\xa9\x89\xe4]\x82\xd4͗8\x92R\xb2|\x9d\x91-\x97\xa5\xac7\x95IiA\002$a\x81\0\x82\x8bhf2ﰯ\xb1\xaf\xb1\xfbb\xfb}\xa7\033WB\022E{\xa62\025\xa5*2I\xf4\xbdO\x9f\xcbw\xcei\xec\xdd{vrt\xf6\xe3\xbb\xe7j\x92N\xfd\x83\xb5\xbd\xfc\037\xd7v\016\xd6\024\xfeۻgY\xf2\xc1\xfcw~^\xf9\xb2\xf0\xf1\xdc\024=\xc7\177}\xd5\xc7_\xa5\xf8Y\xff\x91\xbf\xf2\x9fR\033\xe7\xf7\xf1\xaf.\xde\xc7\003\xa5\xe4\xef_\xe5\xef\177\xe1\xaf\xfe\x88V\xf4\xaf\xfa_)φ\xf1\177\xed/JI\177ů|\xae\xfaR\xfe\xaf\xe7\xe7\xdd\xf3>\xfe\xe21?+\xf9\\\xfe9Gs\xbabu\xa2ғ\xd4Y\x93\x9f\x93PM\xed\xf8"\x8bz\xeaҍ\xe7j\xe6\016\022/u{j\026\xcezR²\016\xd6־₩7nj\xcb\xf7\xaf\xf6R/\xf5݃g\xe1\xd8\035\x86^\xb0\xd7\xd7\xdf\xf1`\xca2É\035'n\xba\xdf\xc9ґ\xf5\xb8\xc3\n\xfa\xf70H\xdd\0\xbf\xe7\025\x95\x97(;Pa\xe4\006\030J\026\017]\025\xb9nl\xa5\xa1\xc5\177\x95㍽\xd4\xf6\xd50\x8bc7\030λjd_\x86\xb1\xeb\xa8\xc1\\\x9dN\xbc\x81\xad^\aY\x82\xd1 

그것을 깨끗한 HTML 코드를 반환하지만 대부분의 시간 나는이가 오류입니다. 자신의 웹 사이트와 관련이 있으며 볼 수 있듯이 4와 같은 이상한 문자가 있습니다.

getURLcontent()을 사용하여 원시 데이터를 다운로드 할 수 있지만 이진 콘텐츠를 변환 할 수 없습니다. HTML로 변환하십시오.

를 변경하려고합니다.인수이지만 예상 된 결과를 제공하지 않습니다. 이 웹 페이지를 어떻게 스크랩 할 수 있습니까?

EDIT : 상세 모드

> getURL("http://dogecoin.com/", verbose = TRUE) 
* Trying 192.30.252.153... 
* Connected to dogecoin.com (192.30.252.153) port 80 (#0) 
> GET/HTTP/1.1 
Host: dogecoin.com 
Accept: */* 

< HTTP/1.1 200 OK 
< Server: GitHub.com 
< Date: Wed, 25 Oct 2017 10:12:26 GMT 
< Content-Type: text/html; charset=utf-8 
< Transfer-Encoding: chunked 
< Last-Modified: Tue, 16 May 2017 01:27:52 GMT 
< Access-Control-Allow-Origin: * 
< Expires: Wed, 25 Oct 2017 10:05:08 GMT 
< Cache-Control: max-age=600 
< Content-Encoding: gzip 
< X-GitHub-Request-Id: A4D0:66A8:93356A1:D740FF7:59F0638A 
< 
Error in curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : 
    caractère nul au milieu de la chaîne : '\037\x8b\b\0\0\0\0\0\0\003\xed]\xebr\xdbF\x96\xfe\035=E\x9b\xa9\x89\xe4]\x82\xd4͗8\x92R\xb2|\x9d\x91-\x97\xa5\xac7\x95IiA\002$a\x81\0\x82\x8bhf2ﰯ\xb1\xaf\xb1\xfbb\xfb}\xa7\033WB\022E{\xa62\025\xa5*2I\xf4\xbdO\x9f\xcbw\xcei\xec\xdd{vrt\xf6\xe3\xbb\xe7j\x92N\xfd\x83\xb5\xbd\xfc\037\xd7v\016\xd6\024\xfeۻgY\xf2\xc1\xfcw~^\xf9\xb2\xf0\xf1\xdc\024=\xc7\177}\xd5\xc7_\xa5\xf8Y\xff\x91\xbf\xf2\x9fR\033\xe7\xf7\xf1\xaf.\xde\xc7\003\xa5\xe4\xef_\xe5\xef\177\xe1\xaf\xfe\x88V\xf4\xaf\xfa_)φ\xf1\177\xed/JI\177ů|\xae\xfaR\xfe\xaf\xe7\xe7\xdd\xf3>\xfe\xe21?+\xf9\\\xfe9Gs\xbabu\xa2ғ\xd4Y\x93\x9f\x93PM\xed\xf8"\x8bz\xeaҍ\xe7j\xe6\016\022/u{j\026\xcezR²\016\xd6־₩7nj\xcb\xf7\xaf\xf6R/\xf5݃g\xe1\xd8\035\x86^\xb0\xd7\xd7\xdf\xf1`\xca2É\035'n\xba\xdf\xc9ґ\xf5\xb8\xc3\n\xfa\xf70H\xdd\0\xbf\xe7\025\x95\x97(;Pa\xe4\006\030J\026\017]\025\xb9nl\xa5\xa1\xc5\177\x95㍽\xd4\xf6\xd50\x8bc7\030λjd_\x86\xb1\xeb\xa8\xc1\\\x9dN\xbc\x81\xad^\aY\x82\xd1 
> 
+1

문제점을 해결하는 방법을 모르겠지만 여기에 도움이되는 대안이 있습니다 :'library (httr); GET ("http://dogecoin.com/", write_disk ("test.txt")); x <- readLines ("test.txt")' –

답변

1

RCurl::getURL()Content-Encoding: gzip 헤더도 또한 콘텐츠 GZIP 인코딩 된 신호 고자질 처음 두 바이트 "마법"코드 중 검출되지 않을 것으로 보인다.

내가 제안 - 마이클 그랬던 것처럼 - 나는 비트에 들어갈 것이다 이유 httr로 전환,하지만 더 나은 httr 관용구 수 WLD :

library(httr) 

res <- GET("http://dogecoin.com/") 
content(res) 

content() 기능은 원시 응답을 추출하고 RCurl::getURL()을 사용했을 가능성이있는 XML 라이브러리 구문 분석 된 개체와 비슷한 xml2 개체를 반환합니다. 우리가 명시 적으로 내용이 gzip으로 압축되어 getURL()을 알리는하고 여기에

html_text_res <- RCurl::getURL("http://dogecoin.com/", encoding="gzip") 

하지만 업스트림 서버가 결정하면 그 점에서 위험을 내포이다 :

대안 방법은 RCurl::getURL() 일부 목발을 추가하는 것입니다 예를 들어 brotli 인코딩을 사용하려면 오류가 발생합니다. 'getURL() 디코딩 버팀목을 제공하지만, 명시 적으로 gzip을 업스트림 서버를 이야기 한 다음

RCurl::getURL("http://dogecoin.com/", 
       encoding = "gzip", 
       httpheader = c(`Accept-Encoding` = "gzip")) 

:

당신은 여전히 ​​나는이 사이트 다음을 수행 좋을 것 httr에 스위치 대 RCurl를 사용하려는 경우 그 인코딩으로 데이터를 전송해야한다는 것입니다.

그러나 httr은 웹 서버 상호 작용과 콘텐츠를보다 철저하게 처리하기 때문에 더 나은 선택이 될 것입니다.

+0

고맙습니다.'httr' 옵션을 사용하는 것이 좋습니다. – Florent