有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息。

1.观察url

首先观察一下网址的结构 http://movie.douban.com/top250?start=0&filter=&type= :

可以看到,问号?后有三个参数 start、filter、type,其中start代表页码,每页展示25部电影,0代表第一页,以此类推25代表第二页,50代表第三页...

filter顾名思义,是过滤已经看过的电影,filter和type在这里不重要,可以不管。

2.查看网页源代码

打开上面的网址,查看源代码,可以看到信息的展示结构如下:

 <ol class="grid_view">
<li>
<div class="item">
<div class="pic">
<em class="">1</em>
<a href="http://movie.douban.com/subject/1292052/">
<img alt="肖申克的救赎" src="http://img3.douban.com/view/movie_poster_cover/ipst/public/p480747492.jpg" class="">
</a>
</div>
<div class="info">
<div class="hd">
<a href="http://movie.douban.com/subject/1292052/" class="">
<span class="title">肖申克的救赎</span>
<span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
<span class="other">&nbsp;/&nbsp;月黑高飞(港) / 刺激1995(台)</span>
</a> <span class="playable">[可播放]</span>
</div>
<div class="bd">
<p class="">
导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
</p> <div class="star">
<span class="rating5-t"><em>9.6</em></span>
&nbsp;<span>646374人评价</span>
</div> <p class="quote">
<span class="inq">希望让人自由。</span>
</p>
</div>
</div>
</div>
</li>

其中<em class="">1</em>代表排名,<span class="title">肖申克的救赎</span>代表电影名,其他信息的含义也很容易能看出来。

于是接下来可以写正则表达式:

 pattern = re.compile(u'<div.*?class="item">.*?<div.*?class="pic">.*?'
+ u'<em.*?class="">(.*?)</em>.*?'
+ u'<div.*?class="info">.*?<span.*?class="title">(.*?)'
+ u'</span>.*?<span.*?class="title">(.*?)</span>.*?'
+ u'<span.*?class="other">(.*?)</span>.*?</a>.*?'
+ u'<div.*?class="bd">.*?<p.*?class="">.*?'
+ u'导演: (.*?)&nbsp;&nbsp;&nbsp;'
+ u'主演: (.*?)<br>'
+ u'(.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;'
+ u'(.*?)</p>'
+ u'.*?<div.*?class="star">.*?<em>(.*?)</em>'
+ u'.*?<span>(.*?)人评价</span>.*?<p.*?class="quote">.*?'
+ u'<span.*?class="inq">(.*?)</span>.*?</p>', re.S)

在此处flag参数re.S代表多行匹配。

3.使用面向对象的设计模式编码

代码如下:

 # -*- coding:utf-8 -*-
__author__ = 'Jz'
import urllib2
import re
import sys class MovieTop250:
def __init__(self):
#设置默认编码格式为utf-8
reload(sys)
sys.setdefaultencoding('utf-8')
self.start = 0
self.param = '&filter=&type='
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'}
self.movieList = []
self.filePath = 'D:/coding_file/python_file/File/DoubanTop250.txt' def getPage(self):
try:
URL = 'http://movie.douban.com/top250?start=' + str(self.start)
request = urllib2.Request(url = URL, headers = self.headers)
response = urllib2.urlopen(request)
page = response.read().decode('utf-8')
pageNum = (self.start + 25)/25
print '正在抓取第' + str(pageNum) + '页数据...'
self.start += 25
return page
except urllib2.URLError, e:
if hasattr(e, 'reason'):
print '抓取失败,具体原因:', e.reason def getMovie(self):
pattern = re.compile(u'<div.*?class="item">.*?<div.*?class="pic">.*?'
+ u'<em.*?class="">(.*?)</em>.*?'
+ u'<div.*?class="info">.*?<span.*?class="title">(.*?)'
+ u'</span>.*?<span.*?class="title">(.*?)</span>.*?'
+ u'<span.*?class="other">(.*?)</span>.*?</a>.*?'
+ u'<div.*?class="bd">.*?<p.*?class="">.*?'
+ u'导演: (.*?)&nbsp;&nbsp;&nbsp;'
+ u'主演: (.*?)<br>'
+ u'(.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;'
+ u'(.*?)</p>'
+ u'.*?<div.*?class="star">.*?<em>(.*?)</em>'
+ u'.*?<span>(.*?)人评价</span>.*?<p.*?class="quote">.*?'
+ u'<span.*?class="inq">(.*?)</span>.*?</p>', re.S)
while self.start <= 225:
page = self.getPage()
movies = re.findall(pattern, page)
for movie in movies:
self.movieList.append([movie[0], movie[1], movie[2].lstrip('&nbsp;/&nbsp;'),
movie[3].lstrip('&nbsp;/&nbsp;'), movie[4],
movie[5], movie[6].lstrip(), movie[7], movie[8].rstrip(),
movie[9], movie[10], movie[11]]) def writeTxt(self):
fileTop250 = open(self.filePath, 'w')
try:
for movie in self.movieList:
fileTop250.write('电影排名:' + movie[0] + '\r\n')
fileTop250.write('电影名称:' + movie[1] + '\r\n')
fileTop250.write('外文名称:' + movie[2] + '\r\n')
fileTop250.write('电影别名:' + movie[3] + '\r\n')
fileTop250.write('导演姓名:' + movie[4] + '\r\n')
fileTop250.write('参与主演:' + movie[5] + '\r\n')
fileTop250.write('上映年份:' + movie[6] + '\r\n')
fileTop250.write('制作国家/地区:' + movie[7] + '\r\n')
fileTop250.write('电影类别:' + movie[8] + '\r\n')
fileTop250.write('电影评分:' + movie[9] + '\r\n')
fileTop250.write('参评人数:' + movie[10] + '\r\n')
fileTop250.write('简短影评:' + movie[11] + '\r\n\r\n')
print '文件写入成功...'
finally:
fileTop250.close() def main(self):
print '正在从豆瓣电影Top250抓取数据...'
self.getMovie()
self.writeTxt()
print '抓取完毕...' DouBanSpider = MovieTop250()
DouBanSpider.main()

代码比较简单,最后将信息写入一个文件,没有什么需要解释的地方。

4.运行截图

5.问题说明

打开文件浏览时发现有个别电影没有抓取下来或者信息中出现html代码,后来排查发现是因为豆瓣有部分电影的信息不全,缺少主演等导致html代码出现差异而导致正则表达式没有匹配到或者匹配出错。

Python爬虫----抓取豆瓣电影Top250的更多相关文章

  1. Python小爬虫——抓取豆瓣电影Top250数据

    python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...

  2. python爬虫 Scrapy2-- 爬取豆瓣电影TOP250

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  3. python 爬虫&爬取豆瓣电影top250

    爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...

  4. python爬虫抓取豆瓣电影

    抓取电影名称以及评分,并排序(代码丑炸) import urllib import re from bs4 import BeautifulSoup def get(p): t=0 k=1 n=1 b ...

  5. Python爬虫-爬取豆瓣电影Top250

    #!usr/bin/env python3 # -*- coding:utf-8-*- import requests from bs4 import BeautifulSoup import re ...

  6. Python:python抓取豆瓣电影top250

    一直对爬虫感兴趣,学了python后正好看到某篇关于爬取的文章,就心血来潮实战一把吧. 实现目标:抓取豆瓣电影top250,并输出到文件中 1.找到对应的url:https://movie.douba ...

  7. Python抓取豆瓣电影top250!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:404notfound  一直对爬虫感兴趣,学了python后正好看到 ...

  8. python2.7抓取豆瓣电影top250

    利用python2.7抓取豆瓣电影top250 1.任务说明 抓取top100电影名称 依次打印输出 2.网页解析 要进行网络爬虫,利用工具(如浏览器)查看网页HTML文件的相关内容是很有必要,我使用 ...

  9. Python3 抓取豆瓣电影Top250

    利用 requests 抓取豆瓣电影 Top 250: import re import requests def main(url): global num headers = {"Use ...

随机推荐

  1. python识别一段由字母组成的字符串是拼音还是英文单词

    环境:win10 python3.6 先说一下算法思想: 首先建立本地拼音库(不带声调).使用贪婪算法将字符串从左向右扫描,将字符串与本地拼音库(这里提供给大家一个)进行匹配,当发现匹配成功时继续扫描 ...

  2. Mahout学习路线图-张丹老师

    前言 Mahout是Hadoop家族中与众不同的一个成员,是基于一个Hadoop的机器学习和数据挖掘的分布式计算框架.Mahout是一个跨学科产品,同时也是我认为Hadoop家族中,最有竞争力,最难掌 ...

  3. likely(x)与unlikely(x) __builtin_expect

    本文讲的likely()和unlikely()两个宏,在linux内核代码和一些应用中可常见到它们的身影.实质上,这两个宏是关于GCC编译器内置宏__builtin_expect的使用. 顾名思义,l ...

  4. GIL解释器,协程,gevent模块

    GIL解释器锁 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CP ...

  5. s5_day12作业

    # day12作业: # 功能实现: # 一个文件夹中,存在多个文件,包括图片,视频,文本等等, # 遍历出时间在2017-06-05至2017-06-09这段时间内创建的所有文件.具体文件夹,自己创 ...

  6. 数据结构&算法(一)_堆、栈(堆栈)、队列、链表

    堆: ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树.将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做 ...

  7. LeetCode 53. Maximum Subarray 最大连续字段和问题

    考察:最大连续字段和问题. 解决问题时间复杂度:O(n) 问题隐含条件:如果给出的数集都是负数,那么最大连续字段和就是,最大的那个负数. eg:{-2,-1}  结果应该输出 -1 而不是 0 int ...

  8. Hive2.2.1概述(待重写)

    概述 hive 是一个包裹着 hdfs 的壳子,hive 通过 hql,将 sql 翻译成 MR ,进行数据查询. Hive是⼀个构建在Hadoop之上的数据仓库 hive的数据存在hdfs上,元信息 ...

  9. angularJS 中的传参

    今天总结一下 angularJS 传参的 3种方式:(配合 ui-router) 现在有两个页面,page1.html 和 page2.html, 现由 page1.html 向 page2.html ...

  10. 【笔记】H5自适应(待)

    参考: 1.盒子模型:http://www.cnblogs.com/sunyunh/archive/2012/09/01/2666841.html 2.浮动:http://www.w3school.c ...