编写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 相关文章推荐
Linux下编译安装MySQL-Python教程
Feb 02 Python
python下载文件时显示下载进度的方法
Apr 02 Python
Python类的用法实例浅析
May 27 Python
Python实现两个list对应元素相减操作示例
Jun 09 Python
Python操作csv文件实例详解
Jul 31 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
Python tkinter label 更新方法
Oct 11 Python
一文了解Python并发编程的工程实现方法
May 31 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
Python爬虫实现vip电影下载的示例代码
Apr 20 Python
Python 执行矩阵与线性代数运算
Aug 01 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 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
建立动态的WML站点(二)
2006/10/09 PHP
php相当简单的分页类
2008/10/02 PHP
PHP 模拟$_PUT实现代码
2010/03/15 PHP
PHP PDO函数库详解
2010/04/27 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
PHP查询分页的实现代码
2017/06/09 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
jquery移动节点实例
2015/01/14 Javascript
JavaScript中解析JSON数据的三种方法
2015/07/03 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
js鼠标移动时禁止选中文字
2017/02/19 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
AngularJS表单验证功能分析
2017/05/26 Javascript
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
python使用tornado实现登录和登出
2018/07/28 Python
Python语法分析之字符串格式化
2019/06/13 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
初中生学习的自我评价
2013/11/14 职场文书
酒店总经理助理职责
2014/02/12 职场文书
解除劳动合同协议书
2014/04/14 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
门面租赁合同范文
2019/08/06 职场文书