获取豆瓣电影数据(R与API获取网页数据)
一般成熟的网站都会有反爬虫策略,例如限制访问次数,限制访问 IP,动态显示数据等。爬虫和反爬虫就是一直相爱相杀地互相钳制。如果要通过爬虫来获取某些大型网站的数据,那是一件很费时费力的活。小白总遭遇过在趟过各种坑之前就被封 IP 或封账号的打击(呜呜~说的就是我)。
不过有一些公司心怀开放互联的态度,友好地给大家提供了 api 接口。这一篇博客将以豆瓣电影为例记录如何站在巨人(api)的肩膀上获取数据。不过豆瓣 api 现在貌似也逐渐收起来了,api key 也停止申请了,且用且珍惜了。
>> Required Packages
```r
library(httr)
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 则表示请求成功。
url <- https://api.douban.com/v2/movie/subject/27074316
film_json <- GET(url, query = list(apikey="your_api_key"))
if(status_code(film_json) == 200)
message("success\n")
#### >> Get Text
获取 json 后要读取里面需要的内容,例如获取电影名称,电影导演等:
```r
film_data % paste(collapse=",")
```
json 在浏览器中的文字都是挤成一团的很不好辨认 key-value pairs。在 R console 中执行下面的代码就可以清晰看到各组合了:
```r
toJSON(fromJSON(content(film_json, "text")), pretty=TRUE)
```
#### >> Loop over IDs
上面有提到说如果要获取全部数据那么我们就要尝试遍历所有 id。目前豆瓣对于 api 的访问频率是有限制的,我了解到的是每分钟不超过 40 次。所以在两次访问之间要设置合理的时间差。
而且并不是每个 id 都一定有对应的页面,因此在遍历的过程中还要剔除无效 id。这时候就可以用上 tryCatch 法器了。
basic_url <- "https://api.douban.com/v2/movie/subject/"
film <- data.frame()
for (ii in 1:100){ #just for example not real id
Sys.sleep(runif(1,1,2)) # set time interval
tryCatch(
{
url <- paste0(basic_url, ii)
film_json <- GET(url, query = list(apikey="your_api_key"))
if(status_code(film_json) != 200)
next
film <- rbind(film, getFilmInfo(film_json,ii)) #user-defined function
},
error = function(cond) {
message("Here's the original error message:")
message(cond)
message("\n")
}
)
}
以上只是抛砖引玉,而除了豆瓣以外还有很多可用的 api (可以上 Github 查一查),多加利用哦,数据就是生产力 !
获取豆瓣电影数据(R与API获取网页数据)的更多相关文章
- 如何获取豆瓣电影 API Key
如何获取豆瓣电影 API Key 豆瓣 API Key 不能使用了 ! solutions & !== ? https://frodo.douban.com/api/v2/subject_co ...
- ajax的get方法获取豆瓣电影前10页的数据
# _*_ coding : utf-8 _*_ # @Time : 2021/11/2 11:45 # @Author : 秋泊酱 # 1页数据 电影条数20 # https://movie.dou ...
- 【Python爬虫】:使用高性能异步多进程爬虫获取豆瓣电影Top250
在本篇博文当中,将会教会大家如何使用高性能爬虫,快速爬取并解析页面当中的信息.一般情况下,如果我们请求网页的次数太多,每次都要发出一次请求,进行串行执行的话,那么请求将会占用我们大量的时间,这样得不偿 ...
- Python3获取大量电影信息:调用API
实验室这段时间要采集电影的信息,给出了一个很大的数据集,数据集包含了4000多个电影名,需要我写一个爬虫来爬取电影名对应的电影信息. 其实在实际运作中,根本就不需要爬虫,只需要一点简单的Python基 ...
- python爬取豆瓣电影第一页数据and使用with open() as读写文件
# _*_ coding : utf-8 _*_ # @Time : 2021/11/2 9:58 # @Author : 秋泊酱 # @File : 获取豆瓣电影第一页 # @Project : 爬 ...
- PHP通过ZABBIX API获取主机信息 VS 直接从数据库获取主机信息
最近项目需要获取linux主机的一些信息,如CPU使用率,内存使用情况等.由于我们本身就装了zabbix系统,所以我只用知道如何获取信息即可,总结有两种方法可以获取. 一.通过ZABBIX API获取 ...
- 用python+selenium抓取豆瓣电影中的正在热映前12部电影并按评分排序
抓取豆瓣电影(http://movie.douban.com/nowplaying/chengdu/)中的正在热映前12部电影,并按照评分排序,保存至txt文件 #coding=utf-8 from ...
- python pandas 豆瓣电影 top250 数据分析
豆瓣电影top250数据分析 数据来源(豆瓣电影top250) 爬虫代码比较简单 数据较为真实,可以进行初步的数据分析 可以将前面的几篇文章中的介绍的数据预处理的方法进行实践 最后用matplotli ...
- 用python爬取豆瓣电影Top 250
首先,打开豆瓣电影Top 250,然后进行网页分析.找到它的Host和User-agent,并保存下来. 然后,我们通过翻页,查看各页面的url,发现规律: 第一页:https://movie.dou ...
随机推荐
- 解决Linux下ssh登录后出现 报错 Write failed: Broken pipe 的方法
解决也很简单,在执行 ssh 命令的时候,多加一个参数即可,如下: ssh -p 2200 -o ServerAliveInterval=60 root@8.8.8.8 #服务器 8.8.8.8 的远 ...
- Git内部原理浅析
Git独特之处 Git是一个分布式版本控制系统,首先分布式意味着Git不仅仅在服务端有远程仓库,同时会在本地也保留一个完整的本地仓库(.git/文件夹),这种分布式让Git拥有下面几个特点: 1.直接 ...
- OC-bug: Undefined symbols for architecture i386: "_OBJC_CLASS_$_JPUSHRegisterEntity", referenced from:
bug的提示: Undefined symbols for architecture i386: "_OBJC_CLASS_$_JPUSHRegisterEntity", refe ...
- python中杀死线程
有时候有这样的需要,在某种情况下,需要在主线程中杀死之前创建的某个线程,可以使用下面的方法,通过调用python内置API,在线程中抛出异常,使线程退出. import threading impor ...
- liteos信号量(八)
1. 概述 1.1 基本概念 信号量(Semaphore)是一种实现任务间通信的机制,实现任务之间同步或临界资源的互斥访问.常用于协助一组相互竞争的任务来访问临界资源. 在多任务系统中,各任务之间需要 ...
- FusionSphere产品功能
华为Fusion产品 FusionSphere解决方案的三种场景 服务器虚拟化 NFVI:运营商基于openstack kvm协议的解决方案 云数据中心 FusionSphere服务器虚拟化解决方案 ...
- Truck History POJ - 1789
题目链接:https://vjudge.net/problem/POJ-1789 思路: 题目意思就是说,给定一些长度为7的字符串,可以把字符串抽象为一个点, 每个点之间的距离就是他们本身字符串与其他 ...
- mybatis多对多关联查询
多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...
- day4_变量和作用域
全局变量与局部变量: 全局变量: 定义变量时,变量左边没有缩进,就是全局变量,可以被当前py文件的任何地方给引用 局部变量: 有缩进的变量就是局部变量 函数的作用域: def test1(): age ...
- Gym101667 H. Rock Paper Scissors
将第二个字符串改成能赢对方时对方的字符并倒序后,字符串匹配就是卷积的过程. 那么就枚举字符做三次卷积即可. #include <bits/stdc++.h> struct Complex ...