在网页数据爬取过程中,有时候用rvest::read_html()读取网页的内容和我们直接分析页码的源代码不一样,或者直接就是乱码。这两个常见问题可能是由user agent和编码设置错误有关。关于编码的重新设置可以采用以下这种方法:
用下载的函数(例如download.file)下载网页下来,然后读取出内容,用stringi扩展包中的
stri_enc_detect探测出字符串的编码,然后用string::stri_encode将原编码转换成为UTF8就可以了。

destfile<-'laocai'
download.file('http://....',destfile)
fchar<-readChar(destfile,file.info(destfile)$size,useBytes =TRUE)
stringi::stri_enc_detect(fchar)
fut<-stringi::stri_encode(fchar,from='GB18030',to="UTF8",to_raw=FALSE)
fhtml <- rvest::read_html(fut)
fhtml

关于User Agent的设置,因为默认情况下,rvest的User Agent是curl/7.39.0 Rcurl/1.95.4.6 httr/0.6.1,而我们的浏览器User Agent类似于这样Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36,目标页面的HTTP服务器会检查是不是正常的浏览器访问请求。因此需要手动更改User Agent的设置。
rvest的read_html()函数的参数可以是三种形式:url,string,httr请求。我们可以通过httr请求设置User Agent.

read_html(httr::GET("https://www.baidu.com",user_agent("Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0")))

更多httr请求的设置可以查阅httr包。我们也可以通过html_session(url,…)来模拟浏览器的对话。通过str()可以看到详细的请求和回应信息。

session<-html_session(url,...)
str(session)

下面开始扒取图书网页内容

library(rvest)
library(stringr)
url=sapply(1:3,function(i) str_c("http://it-ebooks.info/book/",i,"/"))
a=list()
length(a)=15
for(i in 1:3){
    try(at<-read_html(url[i],verbose=T))
    if(length(at %>% html_nodes("td.justify span") %>% html_text()) == 0)
        next
    show(i)

    a[[i]]$BookNum <- i

    a[[i]]$BookDescription <- at %>% html_nodes("td.justify span") %>% html_text()

    a[[i]]$Publisher <- at %>% html_nodes('a[itemprop="publisher"]') %>% html_text()

    a[[i]]$By <- at %>% html_nodes("td.justify table tr:nth-child(3) a") %>% html_text()

    a[[i]]$ISBN<-at %>% html_nodes("b[itemprop='isbn']") %>% html_text()

    a[[i]]$Year <- at %>% html_nodes("b[itemprop='datePublished']") %>% html_text()

    a[[i]]$Pages<- at %>% html_nodes("b[itemprop='numberOfPages']") %>% html_text()

    a[[i]]$imgsrc<- paste('http://it-ebooks.info',((at %>% html_nodes("table.ebook_view img"))[1] %>% html_attr("src")),sep="")

    a[[i]]$Download<-at %>% html_nodes("td.justify table tr:nth-child(11) a") %>% html_attr("href")

    a[[i]]$title<- at %>% html_nodes("h1[itemprop='name']") %>% html_text()
}

然后保存为json格式

library(rjson)
json_book<-toJSON(a)
writeLines(json_book,'mybook.json')

导出后终端执行如下命令,转换成可以批量导入elasticsearch的格式

sed -i -e 's/},{/}\n{ "index": {}}\n{/g' booksys01.json