编写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 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
Python中用startswith()函数判断字符串开头的教程
Apr 07 Python
用Python实现换行符转换的脚本的教程
Apr 16 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
Python、PyCharm安装及使用方法(Mac版)详解
Apr 28 Python
Python中用post、get方式提交数据的方法示例
Sep 22 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 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 mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
php socket通信简单实现
2016/11/18 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
js常用数组操作方法简明总结
2014/06/20 Javascript
jQuery实现统计复选框选中数量
2014/11/24 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
Node.js 中使用 async 函数的方法
2017/11/20 Javascript
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
利用JS代码自动删除稿件的普通弹幕功能
2019/09/20 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
python3实现高效的端口扫描
2019/08/31 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
Python批量启动多线程代码实例
2020/02/18 Python
基于Python的OCR实现示例
2020/04/03 Python
500行python代码实现飞机大战
2020/04/24 Python
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
法律进学校实施方案
2014/03/15 职场文书
商业融资计划书
2014/04/29 职场文书
python实现语音常用度量方法的代码详解
2021/05/25 Python
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python