编写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实现字符串匹配算法代码示例
Dec 05 Python
python selenium UI自动化解决验证码的4种方法
Jan 05 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
详解python读取image
Apr 03 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
python日期与时间戳的各种转换示例
Feb 12 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
python小程序之飘落的银杏
Apr 17 Python
如何Python使用re模块实现okenizer
Apr 30 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
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
用python批量下载apk
2020/12/29 Python
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
美国NBA官方商店:NBA Store
2019/04/12 全球购物
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
如何进行Linux分区优化
2013/02/12 面试题
聘任书的写作格式及范文
2014/03/29 职场文书
集体生日活动方案
2014/08/18 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
win10更新失败无限重启解决方法
2022/04/19 数码科技