编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法


Posted in Python onJanuary 20, 2016

抓取豆瓣电影TOP100
一、分析豆瓣top页面,构建程序结构
1.首先打开网页http://movie.douban.com/top250?start,也就是top页面
然后试着点击到top100的页面,注意带top100的链接依次为

http://movie.douban.com/top250?start=0
http://movie.douban.com/top250?start=25
http://movie.douban.com/top250?start=50
http://movie.douban.com/top250?start=75

2.然后通过查看源码,发现电影名的代码如下:

<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
如图,因为有一些英文名等描述,通过正则抓取有些干扰,可能还需要后续过滤。

根据以上信息,此程序主要分以下3个步骤:

二、构建url地址池

  • 抓取top100电影名称
  • 依次打印输出

依次写出代码

1.构建url地址池。代码如下:

import urllib2
import re
# ----------确定url地址池------------
pre_url = 'http://movie.douban.com/top250?start='
top_urls = []
# 因为top100,每页25部电影,故为4页,从零开始
for num in range(4):
  top_urls.append(pre_url + str(num * 25))

2.抓取top100电影名称

# ------------抓取top100电影名称----------
top_content = []
top_tag = re.compile(r'<span class="title">(.+?)</span>')
for url in top_urls:
  content = urllib2.urlopen(url).read()
  pre_content = re.findall(top_tag, content)
  # 过滤不符合条件的list,得到最后的top100的list
  for item in pre_content:
    if item.find(' ') == -1:
      top_content.append(item)

3.打印输出

top_num = 1
for item in top_content:
  print 'Top' + str(top_num) + '  ' + item
  top_num += 1

三、整理代码
我还是python新手,还没有太多的pythonic思想,也没有代码优化技巧,只能说是整理。
其次,个人习惯,在简单的代码里面我还是喜欢少用函数,尽量不隐藏代码的逻辑。
以下代码请参考,并欢迎提意见,希望得到大家的意见,谢谢!
整理后的代码如下:

# coding=utf-8
'''
本代码为自动抓取豆瓣top100电影代码
@pre_url url地址前缀,在这里为http://movie.douban.com/top250?start=
@top_urls url地址池
@top_tag 为抓取电影名正则表达式
'''

import urllib2
import re

pre_url = 'http://movie.douban.com/top250?start='
top_urls = []
top_tag = re.compile(r'<span class="title">(.+?)</span>')
top_content = []
top_num = 1

# ----------确定url地址池------------
# 因为top100,每页25部电影,故为4页,从零开始
for num in range(4):
  top_urls.append(pre_url + str(num * 25))


# ------------抓取top100电影名称,并打印输出----------
top_tag = re.compile(r'<span class="title">(.+?)</span>')
for url in top_urls:
  content = urllib2.urlopen(url).read()
  pre_content = re.findall(top_tag, content)
  # 过滤并打印输出
  for item in pre_content:
    if item.find(' ') == -1:
      print 'Top' + str(top_num) + '  ' + item
      top_num += 1

抓取用户头像图片

import urllib.request
import re
import time
 
#获取输入的帖子单页html
def getHtml2(url2):
  html2=urllib.request.urlopen(url2).read().decode('utf-8')
  return html2
 
#抽取图片相关列表,并下载图片
def gettopic(html2):
  reg2=r'http://www.douban.com/group/topic/\d+'
  topiclist=re.findall(reg2,html2)
  x=0
  #限制下载的图片数
  for topicurl in topiclist:
    x+=1
  return topicurl
 
 
#下载图片到本地
def download(topic_page):
  reg3=r'http://img3.douban.com/view/group_topic/large/public/.+\.jpg'
  imglist=re.findall(reg3,topic_page)
  i=1
  download_img=None
  for imgurl in imglist:
#取图片ID为文件名
    img_numlist=re.findall(r'p\d{7}',imgurl)
    for img_num in img_numlist:
       
      download_img=urllib.request.urlretrieve(imgurl,'D:\python\code\girls\%s.jpg'%img_num)
      time.sleep(1) 
      i+=1
      print(imgurl)
  return download_img
 
#调用函数
page_end=int(input('请输入结束时的页码:'))
num_end=page_end*25
num=0
page_num=1
while num<=num_end:
  html2=getHtml2('http://www.douban.com/group/kaopulove/discussion?start=%d'%num)
  topicurl=gettopic(html2)
  topic_page=getHtml2(topicurl)
  download_img=download(topic_page)
  num=page_num*25
  page_num+=1
 
else:
  print('采集完成!')
Python 相关文章推荐
python如何让类支持比较运算
Mar 20 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
Python线程池模块ThreadPoolExecutor用法分析
Dec 28 Python
几行Python代码爬取3000+上市公司的信息
Jan 24 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
Jun 12 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
python神经网络编程实现手写数字识别
May 27 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
python实现excel公式格式化的示例代码
Dec 23 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
Jan 20 #Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
Jan 20 #Python
使用python实现省市三级菜单效果
Jan 20 #Python
八大排序算法的Python实现
Jan 28 #Python
详解C++编程中一元运算符的重载
Jan 19 #Python
Python中使用Queue和Condition进行线程同步的方法
Jan 19 #Python
简单总结Python中序列与字典的相同和不同之处
Jan 19 #Python
You might like
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
我的群发邮件程序
2006/10/09 PHP
php模板中出现空行解决方法
2011/03/08 PHP
php跨站攻击实例分析
2014/10/28 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
Python中生成器和yield语句的用法详解
2015/04/17 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
html5通过postMessage进行跨域通信的方法
2017/12/04 HTML / CSS
优秀的茶餐厅创业计划书
2014/01/03 职场文书
创业培训计划书
2014/05/03 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
小学入学感言
2015/08/01 职场文书
诚信考试主题班会
2015/08/17 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL