编写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用ConfigObj读写配置文件的实现代码
Mar 04 Python
python用字典统计单词或汉字词个数示例
Apr 22 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
解决python Markdown模块乱码的问题
Feb 14 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 Python
Python实现语音识别和语音合成功能
Sep 20 Python
python 生成器需注意的小问题
Sep 29 Python
4款Python 类型检查工具,你选择哪个呢?
Oct 30 Python
python语言实现贪吃蛇游戏
Nov 13 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
PHP取整数函数常用的四种方法小结
2012/07/05 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
2013/06/20 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
php依赖注入知识点详解
2019/09/23 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
Python hexstring-list-str之间的转换方法
2019/06/12 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
AJAX的优缺点都有什么
2015/08/18 面试题
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
运动会广播稿50字
2014/01/26 职场文书
工程招投标邀请书
2014/01/30 职场文书
党支部三会一课计划
2014/09/24 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
党校学习个人总结
2015/02/15 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android
如何使用python包中的sched事件调度器
2022/04/30 Python