[Python]从豆瓣电影批量获取看过这部电影的用户列表
前言
由于之后要做一个实验,需要用到大量豆瓣用户的电影数据,因此想到了从豆瓣电影的“看过这部电影 的豆瓣成员”页面上来获取较为活跃的豆瓣电影用户。
链接分析
这是看过"模仿游戏"的豆瓣成员的网页链接: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/">
<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和用户的电影主页,因此真正有用的信息在这段代码中:
<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 width="80" valign="top">的块。
td=td_tags[0],a=td.a就可以得到
<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了。
完整代码
#coding=utf-8
##从豆瓣网页中得到用户id ##网页地址类型:http://movie.douban.com/subject/26289144/collections?start=0
## http://movie.douban.com/subject/26289144/collections?start=20 from BeautifulSoup import BeautifulSoup
import codecs
import time
import urllib2 baseUrl='http://movie.douban.com/subject/25895276/collections?start=' proxyInfo='127.0.0.1:8087'
proxySupport=urllib2.ProxyHandler({'http':proxyInfo})
opener=urllib2.build_opener(proxySupport)
urllib2.install_opener(opener) #将用户信息(id,主页链接)保存至文件
def saveUserInfo(idList,linkList):
if len(idList)!=len(linkList):
print 'Error: len(idList)!=len(linkList) !'
return
writeFile=codecs.open('UserIdList3.txt','a','utf-8')
size=len(idList)
for i in range(size):
writeFile.write(idList[i]+'\t'+linkList[i]+'\n')
writeFile.close() #从给定html文本中解析用户id和连接
def parseHtmlUserId(html):
idList=[] #返回的id列表
linkList=[] #返回的link列表 soup=BeautifulSoup(html)
##<td width="80" valign="top">
##<a href="http://movie.douban.com/people/liaaaar/">
##<img class="" src="/u3893139-33.jpg" alt="Liar." />
##</a>
##</td>
td_tags=soup.findAll('td',width='',valign='top')
i=0
for td in td_tags:
#前20名用户是看过这部电影的,
#而后面的只是想看这部电影的用户,因此舍弃
if i==20:
break
a=td.a
link=a.get('href')
i_start=link.find('people/')
id=link[i_start+7:-1]
idList.append(id)
linkList.append(link)
i+=1
return (idList,linkList) #返回指定编号的网页内容
def getHtml(num):
url=baseUrl+str(num)
page=urllib2.urlopen(url)
html=page.read()
return html def launch():
#指定起始编号:20的倍数
ques=raw_input('Start from number?(Multiples of 20) ')
startNum=int(ques)
if startNum%20 != 0:
print 'Input number error!'
return
for i in range(startNum,200,20):
print 'Loading page %d/200 ...' %(i+1)
html=getHtml(i)
(curIdList,curLinkList)=parseHtmlUserId(html)
saveUserInfo(curIdList,curLinkList)
print 'Sleeping.'
time.sleep(5)
[Python]从豆瓣电影批量获取看过这部电影的用户列表的更多相关文章
- 『Python』Python 调用 ZoomEye API 批量获取目标网站IP
#### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...
- TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具
怀着鸡动的心情跟大家介绍一款国产开源运维软件TriAquae,轻松帮你搞定大部分运维工作!TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具,可以允许用户通过一台控制端管理上千 ...
- python爬虫08 | 你的第二个爬虫,要过年了,爬取豆瓣最受欢迎的250部电影慢慢看
马上就要过年啦 过年在家干啥咧 准备好被七大姑八大姨轮番「轰炸」了没? 你的内心 os 是这样的 但实际上你是这样的 应付完之后 闲暇时刻不妨看看电影 接下来咱们就来爬取豆瓣上评分最高的 250部电影 ...
- 爬虫实战【12】使用cookie登陆豆瓣电影以及获取单个电影的所有短评
昨天我们已经实现了如何抓取豆瓣上的热门电影信息,虽然不多,只有几百,但是足够我们进行分析了. 今天我们来讲一下如何获取某一部电影的所有短评论信息,并保存到mongodb中. 反爬虫 豆瓣设置的反爬虫机 ...
- 【Python项目】简单爬虫批量获取资源网站的下载链接
简单爬虫批量获取资源网站的下载链接 项目链接:https://github.com/RealIvyWong/GotDownloadURL 1 由来 自己在收集剧集资源的时候,这些网站的下载链接还要手动 ...
- 使用Python批量获取学生期末考试成绩
以下是我们学校对于期末考试成绩临时查询的一个网站 我突发奇想,可不可以通过爬虫的方式批量获取成绩信息 于是说干就干 首先观察网页的请求 通过查看,我们可以很明显看到网站查询是通过对https://wx ...
- Python登录豆瓣并爬取影评
上一篇我们讲过Cookie相关的知识,了解到Cookie是为了交互式web而诞生的,它主要用于以下三个方面: 会话状态管理(如用户登录状态.购物车.游戏分数或其它需要记录的信息) 个性化设置(如用户自 ...
- Python爬虫个人记录(四)利用Python在豆瓣上写一篇日记
涉及关键词:requests库 requests.post方法 cookies登陆 version 1.5(附录):使用post方法登陆豆瓣,成功! 缺点:无法获得登陆成功后的cookie,要使用js ...
- Python3.x:免费代理ip的批量获取并入库
Python3.x:免费代理ip的批量获取并入库 一.简介 网络爬虫的世界,向来都是一场精彩的攻防战.现在许多网站的反爬虫机制在不断的完善,其中最令人头疼的,莫过于直接封锁你的ip.但是道高一尺魔高一 ...
随机推荐
- gdb零散学习心得。
引用: 记录学习心得.未来将统一整理. 一.基础知识 1:细节整理. 1,启动GDB的前置要求. 1)使用gcc/g++时,添加-g的指令.例如:g++ -g test.cpp -o test 2)如 ...
- C#传递参数大集合
方法的参数是个值得特别注意的地方.方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array).传值参数无需额外的 ...
- linux中BASH_SOURCE[0]
在C/C++中,__FUNCTION__常量记录当前函数的名称.有时候,在日志输出的时候包含这些信息是非常有用的.而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非 ...
- AngularJS如何使用ngRepeat过滤排序
NG重复指令,带过滤器,像这样: <li ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitT ...
- 初始AngularJS
<!-- AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 AngularJS 应用程序. ng-model 指令把元素值(比如输入域的值)绑 ...
- listview滚动到底部
方法一: // msgListView是ListView控件 // adapter是ListView绑定的Adapter,如果不方便直接使用,也可以通过ListView的getAdapter()方法获 ...
- RemoteViews的内部机制
1.RemoteViews的构造方法public RemoteViews(String packageName,int layoutId) 第一个表示当前应用的包名(反射机制需要),第二个表示加载的布 ...
- Ecsotre 参考
2.dbschema dbschema 字段属性 ‘type’ => ‘int unsigned’, //字段类型 ‘extra’ => ‘auto_increment’,//定义自增 ‘ ...
- Ubuntu14.04安装配置SVN及Trac
还是个实习生的时候,项目管理十分欠缺,会出现很多问题,痛定思痛,决定要改变现状,养成良好的项目管理习惯,看网上工具很多,在这里尝试使用SVN作代码版本控制,使用trac作为项目管理追踪.本文采用的操作 ...
- SQL Server 阻塞排除的 2 方法
背景知识: 是什么造成了阻塞? 从锁的观点来看.可访问对象前一定要对对象加锁不管你是读还是写,如果用户A以经持有对象,说明A以在对象上加锁,如果这时B 也想访问这个对象.它也要对对象加锁.重点来了如果 ...