经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » R语言 » 查看文章
获取豆瓣电影数据(R与API获取网页数据)
来源:cnblogs  作者:yukiwu  时间:2019/9/2 9:29:21  对本文有异议

一般成熟的网站都会有反爬虫策略,例如限制访问次数,限制访问 IP,动态显示数据等。爬虫和反爬虫就是一直相爱相杀地互相钳制。如果要通过爬虫来获取某些大型网站的数据,那是一件很费时费力的活。小白总遭遇过在趟过各种坑之前就被封 IP 或封账号的打击(呜呜~说的就是我)。

不过有一些公司心怀开放互联的态度,友好地给大家提供了 api 接口。这一篇博客将以豆瓣电影为例记录如何站在巨人(api)的肩膀上获取数据。不过豆瓣 api 现在貌似也逐渐收起来了,api key 也停止申请了,且用且珍惜了。

>> Required Packages


  1. library(httr)
  2. library(jsonlite)


>> Get JSON


豆瓣电影的 url 还是很规律,比如说 id 为 27074316 的电影的 url 就是 https://movie.douban.com/subject/27074316 , 但是 id 的排序并不是规律的。例如一部 2000 年上映的电影的 id 可能会大于 2010 年上映的电影的 id。

豆瓣电影的 id 范围大约为 1300000 到 27200000,但其中可能会有一部分无效的 id。如果需要获取所有豆瓣电影的数据,那么就要遍历所有 id。如果只是需要一部分的数据,就要用到 search key。

比如 id 为 27074316 的电影的 api resource url 是
https://api.douban.com/v2/movie/subject/27074316?apikey={your_api_key}

比如搜索 2018年电影的 api resource url 是
https://api.douban.com//v2/movie/search?q=2018?apikey={your_api_key}

在浏览器中输入上述 url (记得替换为你的 api key) 是可以看见返回的 json 的,而在 R 中要获取 json 就要用到 package httr 中的 GET 函数。如果返回 200 则表示请求成功。

  1. url <- https://api.douban.com/v2/movie/subject/27074316
  2. film_json <- GET(url, query = list(apikey="your_api_key"))
  3. if(status_code(film_json) == 200)
  4. message("success\n")


>> Get Text


获取 json 后要读取里面需要的内容,例如获取电影名称,电影导演等:

  1. film_data <- fromJSON(content(film_json, "text"))
  2. title <- film_data$title
  3. director <- film_data$directors$name %>% paste(collapse=",")

json 在浏览器中的文字都是挤成一团的很不好辨认 key-value pairs。在 R console 中执行下面的代码就可以清晰看到各组合了:

  1. toJSON(fromJSON(content(film_json, "text")), pretty=TRUE)


>> Loop over IDs


上面有提到说如果要获取全部数据那么我们就要尝试遍历所有 id。目前豆瓣对于 api 的访问频率是有限制的,我了解到的是每分钟不超过 40 次。所以在两次访问之间要设置合理的时间差。

而且并不是每个 id 都一定有对应的页面,因此在遍历的过程中还要剔除无效 id。这时候就可以用上 tryCatch 法器了。

  1. basic_url <- "https://api.douban.com/v2/movie/subject/"
  2. film <- data.frame()
  3. for (ii in 1:100){ #just for example not real id
  4. Sys.sleep(runif(1,1,2)) # set time interval
  5. tryCatch(
  6. {
  7. url <- paste0(basic_url, ii)
  8. film_json <- GET(url, query = list(apikey="your_api_key"))
  9. if(status_code(film_json) != 200)
  10. next
  11. film <- rbind(film, getFilmInfo(film_json,ii)) #user-defined function
  12. },
  13. error = function(cond) {
  14. message("Here's the original error message:")
  15. message(cond)
  16. message("\n")
  17. }
  18. )
  19. }



以上只是抛砖引玉,而除了豆瓣以外还有很多可用的 api (可以上 Github 查一查),多加利用哦,数据就是生产力 !

原文链接:http://www.cnblogs.com/yukiwu/p/11436196.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号