编写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实时获取cmd的输出
Dec 13 Python
Python书单 不将就
Jul 11 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
Oct 24 Python
python将时分秒转换成秒的实例
Dec 07 Python
opencv之为图像添加边界的方法示例
Dec 26 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
Python环境配置实现pip加速过程解析
Nov 27 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 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中的日期及时间
2006/11/23 PHP
两种php实现图片上传的方法
2016/01/22 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
JS前端笔试题分析
2016/12/19 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
微信小程序背景音乐开发详解
2019/12/12 Javascript
动态创建类实例代码
2009/10/07 Python
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
python 全局变量的import机制介绍
2017/09/07 Python
基于Python socket的端口扫描程序实例代码
2018/02/09 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
python装饰器练习题及答案
2019/11/01 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
开办饭店创业计划书
2013/12/28 职场文书
生物制药自我鉴定
2014/01/25 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
婚礼司仪主持词
2014/03/14 职场文书
五年级学生评语
2014/04/22 职场文书
岗位说明书范文
2014/05/07 职场文书
2014年派出所工作总结
2014/11/21 职场文书