python大规模获取豆瓣影评_Python 获取豆瓣用户电影收藏数据

通过豆瓣API获取用户的影评信息,存入到字典中格式为 {电影名:评分}

# -*- coding: utf-8 -*-

'''

Created on May 19, 2012

@author: Edison

'''

import urllib2

import json

import string, pickle

def getData(name, start_index, movie_dict):

'''获取用户的电影数据'''

MAX_RESULTS = 50  #douban目前API一次最多返回50条记录

API_KEY = 'xxx'

req = urllib2.Request('http://api.douban.com/people/'+name+'/collection?cat=movie&status=watched&alt=json' +

'&apikey='+API_KEY+

'&max-results=' + str(MAX_RESULTS)+

'&start-index='+ str(start_index))

response = urllib2.urlopen(req).read()

mfile = open('movies.json',"w+")

mfile.write(response.encode('utf-8'))

mfile.close()

json_data = json.loads(response)

#如果获取到所有的用户数据

if 0==len(json_data['entry']):

return

else:

count = 0

for entry in json_data['entry']:

movie_name = entry["db:subject"]["title"]["$t"]

if "gd:rating" in entry: #部分电影没有任何评分,就不存入字典

movie_rate = string.atoi(entry["gd:rating"]["@value"])

movie_dict[movie_name] = movie_rate

else:

movie_rate = 'no_rate'

print count

count += 1

#递归获取所有数据

start_index += MAX_RESULTS

print start_index

getData(name, start_index, movie_dict)

if __name__ == "__main__":

start_index = 0

name_a='xxx'

movie_dict_a = {}

getData(name_a, start_index, movie_dict_a)

outf = file('xxx_aquar25_movie_dict','wb') #{moive_name:rate,moive_name:rate}

pickle.dump(movie_dict_a, outf)  #序列化到文件中

outf.close()

关于中文编码

字符是一种表现形式,它在内存中都是以字节8bit存储的,str是8bit的字符,而Unicode是16bit字符,Unicode在内存中存储时也是以byte进行存储的,因此print utf-8编码的字符串都是一系列字节数字。unicode字符可以和普通字符串一样进行各种操作,甚至作为字典的key。如字典{u'\u4e54\u6cbb\u514b\u9c81\u5c3c': u'\u7537'},实际上是{'乔治克鲁尼':'男'} 乔治克鲁尼用utf-8编码的字节序列为'\xe4\xb9\x94\xe6\xb2\xbb\xe5\x85\x8b\xe9\xb2\x81\xe5\xb0\xbc'

字节序列str===>str.decode('字节序列的编码')====>unicode字符串(如u=u'\u4600')====>u.encode("gb2312")

一般情况下,在程序中处理字符串时都使用unicode对象,即u开头的字符,而只有在输出的时候再对字符串使用encode()按照需要进行编码。在用数据进行测试时,不仅要使用编码值<127的字符,更要使用编码值大于255的字符,如汉字来进行测试保证程序的兼容性。

豆瓣批量获取看过电影用户列表,并应用kNN算法预测用户性别 首先从豆瓣电影的“看过这部电影豆瓣成员”页面上来获取较为活跃的豆瓣电影用户获取数据 链接分析 这是看过"模仿游戏"的豆瓣成员的网页链接:http://movie.douban.com/subject/10463953/collections。 一页上显示了20名看过这部电影豆瓣用户。当点击下一页时,当前连接变为:http://movie.douban.com/subject/10463953/collections?start=20。 由此可知,当请求下一页内容时,实际上就是将"start"后的索引增加20。 因此,我们可以设定base_url='http://movie.douban.com/subject/10463953/collections?start=',i=range(0,200,20),在循环中url=base_url+str(i)。 之所以要把i的最大值设为180,是因为后来经过测试,豆瓣只给出看过一部电影的最近200个用户。 读取网页 在访问时我设置了一个HTTP代理,并且为了防止访问频率过快而被豆瓣封ip,每读取一个网页后都会调用time.sleep(5)等待5秒。 在程序运行的时候干别的事情好了。 网页解析 本次使用BeautifulSoup库解析html。 每一个用户信息在html中是这样的: 七月 (银川) 2015-08-23   首先用读取到的html初始化soup=BeautifulSoup(html)。本次需要的信息仅仅是用户id和用户电影主页,因此真正有用的信息在这段代码中: 因此在Python代码中通过td_tags=soup.findAll('td',width='80',valign='top')找到所有的块。 td=td_tags[0],a=td.a就可以得到 通过link=a.get('href')可以得到href属性,也就用户电影主页链接。然后通过字符串查找也就可以得到用户ID了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值