编写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 相关文章推荐
仅用50行Python代码实现一个简单的代理服务器
Apr 08 Python
python打开文件并获取文件相关属性的方法
Apr 23 Python
Python3实现Web网页图片下载
Jan 28 Python
Python程序中的观察者模式结构编写示例
May 27 Python
如何在Python函数执行前后增加额外的行为
Oct 20 Python
django项目搭建与Session使用详解
Oct 10 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
Python实现直播推流效果
Nov 26 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
django从后台返回html代码的实例
Mar 11 Python
python字符串拼接.join()和拆分.split()详解
Nov 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
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
php使用fputcsv实现大数据的导出操作详解
2020/02/27 PHP
PHP强制转化的形式整理
2020/05/22 PHP
让复选框只能选择一项的方法
2013/10/08 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
layui中的switch开关实现方法
2019/09/03 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
Django 反向生成url实例详解
2019/07/30 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
什么是Python变量作用域
2020/06/03 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
小学生志愿者活动方案
2014/08/23 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
四年级小学生评语
2014/12/26 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python