编写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中的私有属性
Aug 21 Python
使用Python从有道词典网页获取单词翻译
Jul 03 Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
python中cPickle类使用方法详解
Aug 27 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
python实现诗歌游戏(类继承)
Feb 26 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
Django 路由层URLconf的实现
Dec 30 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
Python文件操作方法详解
Feb 09 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 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教程 插件机制在PHP中实现方案
2012/11/02 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
js select option对象小结
2013/12/20 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
node.js中的path.join方法使用说明
2014/12/08 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
Babel 入门教程学习笔记
2018/06/13 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
python线程、进程和协程详解
2016/07/19 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
Django用户认证系统 User对象解析
2019/08/02 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
Python Django路径配置实现过程解析
2020/11/05 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
儿科护士自我鉴定
2013/10/14 职场文书
技能比赛获奖感言
2014/02/14 职场文书
个人担保书范文
2014/05/20 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
教师个人培训总结
2015/02/11 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
OpenCV实现常见的四种图像几何变换
2022/04/01 Python