[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.但是道高一尺魔高一 ...
随机推荐
- arm str 指令
str 指令格式: str{条件} 1源寄存器 ,2存储器地址 eg: str r0,[r1],#8;将r0中的数值赋值给r1,然后在r1地址上+立即数8,再写入r1中: str r0,[r1,#8] ...
- mysql中,执行delete语句时出现Lock wait timeout exceeded问题
问题描述: 当我插入一条记录时,在调用save方法的时候出现了异常(记录重复了),导致了后面的commit语句不能执行了.这时我在数据库中删除重复记录时发现该表已经被锁上了.即出现错误.但过了一会再次 ...
- java命令行运行带外部jar
假设:java 代码路径为com.jdw.test,其中调用了外部jar包 则需要将jar包解压后,放入com同级目录 然后再com目录启动命令行 java com.jdw.test.HelloWor ...
- cf468A 24 Game
A. 24 Game time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- 2.6. Statistical Models, Supervised Learning and Function Approximation
Statical model regression $y_i=f_{\theta}(x_i)+\epsilon_i,E(\epsilon)=0$ 1.$\epsilon\sim N(0,\sigma^ ...
- poj 1664 放苹果_整数拆分
题意:略 用手机敲的代码真是泪流满面,终于过了 #include<iostream> using namespace std; int dp[110][110]; void solve() ...
- spring 3配置文件中如何注入map list set等类型
首先写个 javabean类吧,如下 package com.bean; import java.util.List; import java.util.Map; import java.util.P ...
- C#字符串处理 及字符串格式化
本文来自:http://www.cnblogs.com/xuerongli/archive/2013/03/23/2976669.html string字符串是char的集合,而char是Unicod ...
- 让Qt for Windows Phone 8.1在真机上执行
让Qt for Windows Phone 8.1在真机上执行 前面几篇博文是为这篇文章做铺垫的,终于目的为的是使用Qt框架制作出可以在Windows Phone 8.1真机上执行的程序.因为Qt f ...
- CCTF-PWN1&&PWN3
CCTF-PWN1&&PWN3 PWN1比较有意思,在得到输入的数据后使用shutdown将标准输入,标准输出和标准错误关闭了读写功能的读.也就是不能进行交互了,要保证一次输入就能拿到 ...