编写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实现比较两段文本不同之处的方法
May 30 Python
python如何实现远程控制电脑(结合微信)
Dec 21 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
利用Pycharm断点调试Python程序的方法
Nov 29 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
django迁移数据库错误问题解决
Jul 29 Python
python 多进程队列数据处理详解
Dec 23 Python
Python中pyecharts安装及安装失败的解决方法
Feb 18 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
Matplotlib配色之Colormap详解
Jan 05 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+AJAX 投票器功能
2017/11/11 PHP
快速保存网页中所有图片的方法
2006/06/23 Javascript
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
js 通用订单代码
2013/12/23 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
JavaScript简介
2015/02/15 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
jQuery鼠标事件总结
2016/10/13 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
vant picker+popup 自定义三级联动案例
2020/11/04 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
kafka-python批量发送数据的实例
2018/12/27 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
Python中如何导入类示例详解
2019/04/17 Python
基于python的Paxos算法实现
2019/07/03 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
django-csrf使用和禁用方式
2020/03/13 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
物流专业大学应届生求职信
2013/11/03 职场文书
开会迟到检讨书
2014/01/08 职场文书
父亲生日宴会答谢词
2014/01/10 职场文书
希特勒的演讲稿
2014/05/23 职场文书
法律专业自荐信
2014/06/03 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
甲午风云观后感
2015/06/02 职场文书
中学教师教学工作总结
2015/08/13 职场文书
利用Pycharm连接服务器的全过程记录
2021/07/01 Python