编写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时区设置方法与pytz查询时区教程
Nov 27 Python
Python库urllib与urllib2主要区别分析
Jul 13 Python
Python中使用items()方法返回字典元素对的教程
May 21 Python
Jupyter中直接显示Matplotlib的图形方法
May 24 Python
python读取文本绘制动态速度曲线
Jun 21 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
python列表推导式操作解析
Nov 26 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
Pycharm 解决自动格式化冲突的设置操作
Jan 15 Python
python绘制箱型图
Apr 27 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分页代码学习示例分享
2014/02/20 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
php字符串函数学习之substr()
2015/03/27 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
PHP中16个高危函数整理
2019/09/19 PHP
制作特殊字的脚本
2006/06/26 Javascript
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
对Python中内置异常层次结构详解
2018/10/18 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
pytorch 求网络模型参数实例
2019/12/30 Python
python中count函数简单用法
2020/01/05 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
行政总监岗位职责
2013/12/05 职场文书
查环查孕证明
2014/01/10 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
行政处罚告知书
2015/07/01 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript