编写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中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
Python中常见的异常总结
Feb 20 Python
分享8个非常流行的 Python 可视化工具包
Jun 05 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
Jun 13 Python
pytorch 输出中间层特征的实例
Aug 17 Python
详解Python3 pandas.merge用法
Sep 05 Python
Python Numpy库常见用法入门教程
Jan 16 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 Python
利用Python将图片中扭曲矩形的复原
Sep 07 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
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
vue路由跳转时判断用户是否登录功能的实现
2017/10/26 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
Python科学计算环境推荐——Anaconda
2014/06/30 Python
python访问系统环境变量的方法
2015/04/29 Python
Python编程入门的一些基本知识
2015/05/13 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
Python线程同步的实现代码
2018/10/03 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
python使用knn实现特征向量分类
2018/12/26 Python
python 格式化输出百分号的方法
2019/01/20 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
高校毕业生自我鉴定
2013/10/27 职场文书
大学生社团活动总结
2014/04/26 职场文书
李培根演讲稿
2014/05/22 职场文书
春秋淹城导游词
2015/02/11 职场文书
安全保证书怎么写
2015/02/28 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
《迟到》教学反思
2016/02/24 职场文书