R语言处理函数超时、写js文件、函数异常如何跳过的简单版、新建文件夹、检测文件是否存在

2 篇文章 0 订阅

今日R语言积累

今天帮别人写个爬虫,爬cnn的文章内容以及包括作者。尝试了很多方法,从只是单纯的静态爬取到使用Rsenlenium爬取,再到phantomjs。中间也遇到很多问题。最后还是再phantomjs的帮助下解决了。

这个中间遇到很多坑,比如在打开cnn网页的时候,使用rvest根本不行,什么内容都下载不了。
使用Rsenlenium的时候,cnn网页有时候会跳出填写邮箱、有时候会跳出接受cookie。只要这样出现,这样一个就失败,获得不了内容,然后就是这个环节卡住,循环跳出,多核并行也一直反馈错误。
后来客户的mac电脑上,他不会安装Rsenlenium。这样他也就没办法运行这种类型的代码。所以放弃了。
后来试了试phantomjs,才算成功。
这里面也遇到一些问题。比如,phantomjs有时候渲染一个网页时间可能要很久,普通的网页也就是几秒,所以找了一个方法,就是控制phantomjs的渲染网页的时间,没想到还真有,这个函数在R.utils包里。函数叫withTimeout()。第一个参数是运行的函数,第二个参数就是设置时间。第三个是如果超时怎么办。可以设置报错、警告、没有任何显示(但是不代表不终止超时函数)。
这个真的是让我增加了见识。

withTimeout(system(paste("phantomjs ", js_file, sep = '')), 
              timeout = 20, 
              onTimeout = "warning")

大家也可看看help。真的有趣。
在这里插入图片描述

还要,因为phantomjs是对js文件进行渲染,所以我要更改js,每一次都不一样,那么我就在想R能不能写js文件??,差了一下,竟然也可以。

js_file <- paste("web_js_2/sec_web_", i, ".js", sep = '')
  file.create(js_file)
  temp_code <- str_replace(base_code, pattern = "web_link", replacement = raw_link[i])
  save_html <- paste("html_2/web_save_in_computer", i, sep = '')
  temp_code <- str_replace(temp_code, pattern = "web_save_in_computer", replacement = save_html)
  write(temp_code, file = js_file)

上面是我的代码一部分,先新建一个js文件file.create(), 然后对一个已经写好的js字符串进行更改,然后保存到js文件,上面的write()函数就是将字符串保存为js文件。下面的就是我写好的一个base_code

base_code <- "// scraper_data

// Create a webpage object
var page = require('webpage').create();

// Include the File System module for writing to files
var fs = require('fs');

// Specify source and path to output file
var url  = 'web_link'
var path = 'web_save_in_computer.html'

page.open(url, function (status) {
 var content = page.content;
 fs.write(path,content,'w')
 phantom.exit();
});"

因为有很多链接,我如果只是保存在工作目录里面,文件很乱,于是我就使用dir.create("my_dir")函数来新建文件夹。我使用file.exists()函数来检查phantomjs是否渲染好文件,并保存为html文件里面。

还要一个就是尝试报错的东西。 因为有的网页结构并不是一样的,相同的提取规则对不同的网页可能就不一样了,导致提取不到东西或者出错误,导致循环就会退出。重点来了,我又很菜,导致我不会写tryCatch()函数,我感觉很麻烦。然后我就查了一下,竟然还真有函数,很简单就可以用来处理这种问题。就是purrr包的 safely()函数,这个函数超级简单,

df_temp <- safely(try_f, data.frame(author = NA,
                                       aritle = NA))(web)

上面web是一个网址,try_f是我写的函数,用来接收web这个变量,如果try_f接受web变量之后,出现错误,那么就将data.frame(author = NA,aritle = NA)传递给df_temp。如果没错误,就返回正确的结果。

上面只是在我的水平下,具体代码因人而异。

欢迎关注公众号:pypi

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanzhoulvpi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值