前言
由于之后要做一个实验,需要用到大量豆瓣用户的电影数据,因此想到了从豆瓣电影的“看过这部电影 的豆瓣成员”页面上来获取较为活跃的豆瓣电影用户。
链接分析
这是看过”模仿游戏”的豆瓣成员的网页链接: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中是这样的:
12345678910111213141516171819 | <table width=\”100%\” class=\”\”> <tr> <td width=\”80\” valign=\”top\”> <a href=\”http://movie.douban.com/people/46770381/\”> <img class=\”\” src=\”http://img4.douban.com/icon/u46770381-16.jpg\” alt=\”七月\” /> </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 <span class=\”allstar40\” title=\”推荐\”></span> </p> </td> </tr> </table> |
首先用读取到的html初始化soup=BeautifulSoup(html)。本次需要的信息仅仅是用户id和用户的电影主页,因此真正有用的信息在这段代码中:
123456789 | <td width=\”80\” valign=\”top\”> <a href=\”http://movie.douban.com/people/46770381/\”> <img class=\”\” src=\”http://img4.douban.com/icon/u46770381-16.jpg\” alt=\”七月\” /> </a> </td> <td width=\”80\” valign=\”top\”> <a href=\”http://movie.douban.com/people/46770381/\”> <img class=\”\” src=\”http://img4.douban.com/icon/u46770381-16.jpg\” alt=\”七月\” /> </a> </td> |
因此在Python代码中通过td_tags=soup.findAll(‘td’,width=’80’,valign=’top’)找到所有
td=td_tags[0],a=td.a就可以得到
123 | <a href=\”http://movie.douban.com/people/46770381/\”> <img class=\”\” src=\”http://img4.douban.com/icon/u46770381-16.jpg\” alt=\”七月\” /> </a> |
通过link=a.get(‘href’)可以得到href属性,也就用户的电影主页链接。然后通过字符串查找也就可以得到用户ID了。
完整代码