请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: crossin先生

Python 实战(5):拿来主义

[复制链接]

1

主题

0

好友

19

积分

新手上路

Rank: 1

发表于 2015-7-6 11:41:19 |显示全部楼层
加载了两遍后提示
{u'msg': u'You API access rate limit has been exceeded.  Contact api-master@douban.com if you want higher limit. ', u'code': 1998, u'request': u'GET /v2/movie/top250'}
豆瓣太小气了
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2015-7-6 16:05:07 |显示全部楼层
lovepythoner 发表于 2015-7-6 11:41
加载了两遍后提示
{u'msg': u'You API access rate limit has been exceeded.  Contact  if you want highe ...

果然又印证那个定律:我在课里说了什么api,很快这个api就不能用了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

48

积分

新手上路

Rank: 1

发表于 2015-7-12 14:20:19 |显示全部楼层
打印出结果,发现只有 20 条。又查了下文档,原来 Top250 接口还有两个可选参数:start 和 count,表示从第几位开始取,取多少条。

那么把代码调整下,外面增加一层循环。为了避免连续请求太快,在每次循环中,通过  time.sleep 方法停顿 3 秒钟。另外,把取到的电影 id 都存入一个变量中:

import urllib
import json
import time

movie_ids = []
for index in range(0, 250 ,50):
    print index
    response = urllib.urlopen('http://api.douban.com/v2/movie/top250?start=%d&count=50' % index)
    data = response.read()
    # print data

    data_json = json.loads(data)
    movie250 = data_json['subjects']
    for movie in movie250:
        movie_ids.append(movie['id'])
        print movie['id'], movie['title']
    time.sleep(3)
print movie_ids

老师,这里不太理解外面增加一层循环是什么意思。
代码运行后只是前20条在不停重复,怎么办?
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2015-7-12 17:47:03 |显示全部楼层
lincoln 发表于 2015-7-12 14:20
打印出结果,发现只有 20 条。又查了下文档,原来 Top250 接口还有两个可选参数:start 和 count,表示从第 ...

外层循环是让请求地址里的start参数不断递增,这样每次去请求的结果都是顺着往后的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

6

积分

新手上路

Rank: 1

发表于 2016-1-17 22:56:17 |显示全部楼层
你好,我理解成把豆瓣上的数据抓取下来然后插入数据库,再根据前几节web实战课的内容从数据库中读取电影的数据,补全代码后实现了更多页面的效果。但是不懂为啥我只要更改了运行的主程序doupan.py里的内容,再刷新页面,又会重新等待数据库再导入一次数据。。。。app = web.application(urls,globals())是因为这条语句会把文件中所有函数再执行一遍吗,怎样让它不再重新插入数据呢?

1.jpg
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2016-1-18 13:43:51 |显示全部楼层
waterseven 发表于 2016-1-17 22:56
你好,我理解成把豆瓣上的数据抓取下来然后插入数据库,再根据前几节web实战课的内容从数据库中读取电影的 ...

你这段添加的代码直接写在了程序里,每次启动都会执行。

如果不需要,可以把它注视掉。或者写在一个方法里,只有访问某个用来刷新的页面时,才去调用它
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

发表于 2016-3-18 21:49:27 |显示全部楼层
输出的id信息不对咋办
错误.png
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

发表于 2016-3-18 21:54:10 |显示全部楼层
crossin先生 发表于 2015-5-26 20:13
不知道,你运行了啥,完全没看出原因……

附件的代码我没有看出错误啊
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2016-3-18 23:08:50 |显示全部楼层
spritezhong 发表于 2016-3-18 21:49
输出的id信息不对咋办

你把这里的movie打印出来看看,好像是movie里面没有id这个属性
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

12

积分

新手上路

Rank: 1

发表于 2016-5-2 15:12:59 |显示全部楼层
crossin先生 发表于 2016-3-18 23:08
你把这里的movie打印出来看看,好像是movie里面没有id这个属性

先生,这个问题我也遇到了,movie里有id这个属性的。
因为正好是第20个,我一直以为是第一个循环里的问题。后来在思考中断恢复的时候我在想能不能通过movie_id这个list来恢复,结果发现这个中断的原因是第21个电影《搏击俱乐部》的movie[id]是1292000,这个id在API抓取信息的网站上是无效的,即网页:
http://api.douban.com/v2/movie/subject/1292000
的访问结果是:
{"msg":"movie_not_found","code":5000,"request":"GET \/v2\/movie\/subject\/1292000"}
所以无法提取相关的参数。
后来我用蠢方法通过修改movie_id遍历后发现这样有问题的id一共有5个:
搏击俱乐部 1292000
熔炉           5912992
电锯惊魂    1417598
杀人回忆    1300299
罪恶之城    1309027

顺便,先生请问入错出现了这样的中断,该怎么恢复呢?我的方法很没效率,是人工修改程序把这个id之前的id全删掉再重新运行一次。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-3-29 20:30 , Processed in 0.027333 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部