设为首页 收藏本站
查看: 926|回复: 0

[经验分享] [Python]从豆瓣电影批量获取看过这部电影的用户列表

[复制链接]

尚未签到

发表于 2015-11-30 13:44:54 | 显示全部楼层 |阅读模式
前言
  由于之后要做一个实验,需要用到大量豆瓣用户的电影数据,因此想到了从豆瓣电影的“看过这部电影 的豆瓣成员”页面上来获取较为活跃的豆瓣电影用户。

链接分析
  这是看过"模仿游戏"的豆瓣成员的网页链接: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中是这样的:



  <table width="100%" class="">
<tr>
<td width="80" valign="top">
<a href="http://movie.douban.com/people/46770381/">
DSC0000.jpg
</a>
</td>
<td valign="top">
<div class="pl2">
<a href="http://movie.douban.com/people/46770381/" class="">七月
<span style="font-size:12px;">(银川)</span>
</a>
</div>
<p class="pl">2015-08-23
&nbsp;<span class="allstar40" title="推荐"></span>
</p>
</td>
</tr>
</table>
  
  首先用读取到的html初始化soup=BeautifulSoup(html)。本次需要的信息仅仅是用户id和用户的电影主页,因此真正有用的信息在这段代码中:



  <td width="80" valign="top">
<a href="http://movie.douban.com/people/46770381/">

</a>
</td>
  因此在Python代码中通过td_tags=soup.findAll('td',width='80',valign='top')找到所有<td width="80" valign="top">的块。
  td=td_tags[0],a=td.a就可以得到



  <a href="http://movie.douban.com/people/46770381/">

</a>
  通过link=a.get('href')可以得到href属性,也就用户的电影主页链接。然后通过字符串查找也就可以得到用户ID了。

完整代码



1 #coding=utf-8
2 ##从豆瓣网页中得到用户id
3
4 ##网页地址类型:http://movie.douban.com/subject/26289144/collections?start=0
5 ##              http://movie.douban.com/subject/26289144/collections?start=20
6
7 from BeautifulSoup import BeautifulSoup
8 import codecs
9 import time
10 import urllib2
11
12 baseUrl='http://movie.douban.com/subject/25895276/collections?start='
13
14 proxyInfo='127.0.0.1:8087'
15 proxySupport=urllib2.ProxyHandler({'http':proxyInfo})
16 opener=urllib2.build_opener(proxySupport)
17 urllib2.install_opener(opener)
18
19
20 #将用户信息(id,主页链接)保存至文件
21 def saveUserInfo(idList,linkList):
22     if len(idList)!=len(linkList):
23         print 'Error: len(idList)!=len(linkList) !'
24         return
25     writeFile=codecs.open('UserIdList3.txt','a','utf-8')
26     size=len(idList)
27     for i in range(size):
28         writeFile.write(idList+'\t'+linkList+'\n')
29     writeFile.close()
30
31 #从给定html文本中解析用户id和连接
32 def parseHtmlUserId(html):
33     idList=[]   #返回的id列表
34     linkList=[] #返回的link列表
35
36     soup=BeautifulSoup(html)
37     ##<td width="80" valign="top">
38     ##<a href="http://movie.douban.com/people/liaaaar/">
39     ##<img class="" src="/u3893139-33.jpg" alt="Liar." />
40     ##</a>
41     ##</td>
42     td_tags=soup.findAll('td',width='80',valign='top')
43     i=0
44     for td in td_tags:
45         #前20名用户是看过这部电影的,
46         #而后面的只是想看这部电影的用户,因此舍弃
47         if i==20:
48             break
49         a=td.a
50         link=a.get('href')
51         i_start=link.find('people/')
52         id=link[i_start+7:-1]
53         idList.append(id)
54         linkList.append(link)
55         i+=1
56     return (idList,linkList)
57
58 #返回指定编号的网页内容
59 def getHtml(num):
60     url=baseUrl+str(num)
61     page=urllib2.urlopen(url)
62     html=page.read()
63     return html
64
65 def launch():
66     #指定起始编号:20的倍数
67     ques=raw_input('Start from number?(Multiples of 20) ')
68     startNum=int(ques)
69     if startNum%20 != 0:
70         print 'Input number error!'
71         return
72     for i in range(startNum,200,20):
73         print 'Loading page %d/200 ...' %(i+1)
74         html=getHtml(i)
75         (curIdList,curLinkList)=parseHtmlUserId(html)
76         saveUserInfo(curIdList,curLinkList)
77         print 'Sleeping.'
78         time.sleep(5)
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145417-1-1.html 上篇帖子: 10 错误和异常 下篇帖子: 1 python学习——python环境配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表