用python爬取电影,python抓取vip电影

时间:2022-11-06 23:28:03阅读:4782
本文介绍用Python抓取豆瓣电影TOP250的所有电影的名称,网页地址为: https://movie.douban.com/top250 。在此爬虫中,将请求头定制为实际浏览器的请求头。为有利提供学习资料,请告知您的Python程度: 您的…

本文介绍用Python抓取豆瓣电影TOP250的所有电影的名称,网页地址为: https://movie.douban.com/top250 。在此爬虫中,将请求头定制为实际浏览器的请求头。

为有利提供学习资料,请告知您的Python程度:

您的Python程度 单选 0人 0% 小白 0人 0% 入门 0人 0% 中等 0人 0% 大牛 投票

抓数据源分析

打开豆瓣电影TOP250的网站,使用“检查”功能查看该网页的请求头,如图3-4所示。

按照3.3.2中的方法提取其中重要的请求头:

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36','Host': 'movie.douban.com'}

第一页只有25个电影,如果要获取所有的250页电影,就需要获取总共10页的内容。

通过单击第二页可以发现网页地址变成了:

https://movie.douban.com/top250?start=25

第三页的地址为: https://movie.douban.com/top250?start=50 ,这就很容易理解了,每多一页,就给网页地址的start参数加上25。

项目实践

通过以上分析发现,可以使用requests获取电影网页的代码,并利用for循环翻页。其代码如下:

import requestsdef get_movies(): headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36', 'Host': 'movie.douban.com' } for i in range(0,10): link = 'https://movie.douban.com/top250?start=' str(i * 25) r = requests.get(link, headers=headers, timeout= 10) print (str(i 1),"页响应状态码:", r.status_code) print (r.text) get_movies()

运行上述代码,得到的结果是:

1页响应状态码:200

豆瓣电影TOP250

...

这时,得到的结果只是网页的HTML代码,我们需要从中提取需要的电影名称。接下来会涉及第5章解析网页的内容,读者可以先使用下面的代码,至于对代码的理解,可以等到第5章再学习。

import requestsfrom bs4 import BeautifulSoupdef get_movies(): headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36', 'Host': 'movie.douban.com' } movie_list = [] for i in range(0,10): link = 'https://movie.douban.com/top250?start=' str(i*25) r = requests.get(link, headers=headers, timeout= 10) print (str(i 1),"页响应状态码:", r.status_code) soup = BeautifulSoup(r.text, "lxml") div_list = soup.find_all('div', class_='hd') for each in div_list: movie = each.a.span.text.strip() movie_list.append(movie) return movie_list movies = get_movies()print (movies)

在上述代码中,使用BeautifulSoup对网页进行解析并获取其中的电影名称数据。运行代码,得到的结果是:

['肖申克的救赎','这个杀手不太冷','霸王别姬','阿甘正传','美丽人生','千与千寻','辛德勒的名单','泰坦尼克号','盗梦空间','机器人总动员','海上钢琴师','三傻大闹宝莱坞','忠犬八公的故事','放牛班的春天','大话西游之大圣娶亲','教父','龙猫','楚门的世界','乱世佳人','天堂电影院','当幸福来敲门','触不可及','搏击俱乐部','十二怒汉','无间道','熔炉','指环王3:王者无敌','怦然心动','天空之城','罗马假日',...]

课后作业

读者若有时间,可以实践进阶问题:获取TOP 250电影的英文名、港台名、导演、主演、上映年份、电影分类以及评分。

还想获取更多的爬虫知识吗?点击这里:

用python爬取电影,python抓取vip电影

Python抓取豆瓣电影排行榜

1.观察url
首先观察一下网址的结构 http://movie.douban.com/top250?start=0&filter=&type= :
可以看到,问号?后有三个参数 start、filter、type,其中start代表页码,每页展示25部电影,0代表第一页,以此类推25代表第二页,50代表第三页...
filter顾名思义,是过滤已经看过的电影,filter和type在这里不重要,可以不管。
2.查看网页源代码
打开上面的网址,查看源代码,可以看到信息的展示结构如下:
1 <ol class="grid_view"> 2 <li> 3 <div class="item"> 4 <div class="pic"> 5 <em class="">1</em> 6 <a href="http://movie.douban.com/subject/1292052/"> 7 <img alt="肖申克的救赎" src="http://img3.douban.com/view/movie_poster_cover/ipst/public/p480747492.jpg" class=""> 8 </a> 9 </div>10 <div class="info">11 <div class="hd">12 <a href="http://movie.douban.com/subject/1292052/" class="">13 <span class="title">肖申克的救赎</span>14 <span class="title"> / The Shawshank Redemption</span>15 <span class="other"> / 月黑高飞(港) / 刺激1995(台)</span>16 </a>17 18 19 <span class="playable">[可播放]</span>20 </div>21 <div class="bd">22 <p class="">23 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>24 1994 / 美国 / 犯罪 剧情25 </p>26 27 28 <div class="star">29 <span class="rating5-t"><em>9.6</em></span>30 <span>646374人评价</span>31 </div>32 33 <p class="quote">34 <span class="inq">希望让人自由。</span>35 </p>36 </div>37 </div>38 </div>39 </li>
其中<em class="">1</em>代表排名,<span class="title">肖申克的救赎</span>代表电影名,其他信息的含义也很容易能看出来。
于是接下来可以写正则表达式:
1 pattern = re.compile(u<div.*?class="item">.*?<div.*?class="pic">.*? 2 + u<em.*?class="">(.*?)</em>.*? 3 + u<div.*?class="info">.*?<span.*?class="title">(.*?) 4 + u</span>.*?<span.*?class="title">(.*?)</span>.*? 5 + u<span.*?class="other">(.*?)</span>.*?</a>.*? 6 + u<div.*?class="bd">.*?<p.*?class="">.*? 7 + u导演: (.*?) 8 + u主演: (.*?)<br> 9 + u(.*?) / (.*?) / 10 + u(.*?)</p>11 + u.*?<div.*?class="star">.*?<em>(.*?)</em>12 + u.*?<span>(.*?)人评价</span>.*?<p.*?class="quote">.*?13 + u<span.*?class="inq">(.*?)</span>.*?</p>, re.S)
在此处flag参数re.S代表多行匹配。
3.使用面向对象的设计模式编码
代码如下:
1 # -*- coding:utf-8 -*- 2 __author__ = Jz 3 import urllib2 4 import re 5 import sys 6 7 class MovieTop250: 8 def __init__(self): 9 #设置默认编码格式为utf-810 reload(sys)11 sys.setdefaultencoding(utf-8)12 self.start = 013 self.param = &filter=&type=14 self.headers = {User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)}15 self.movieList = []16 self.filePath = D:/coding_file/python_file/File/DoubanTop250.txt17 18 def getPage(self):19 try:20 URL = http://movie.douban.com/top250?start= + str(self.start)21 request = urllib2.Request(url = URL, headers = self.headers)22 response = urllib2.urlopen(request)23 page = response.read().decode(utf-8)24 pageNum = (self.start + 25)/2525 print 正在抓取第 + str(pageNum) + 页数据... 26 self.start += 2527 return page28 except urllib2.URLError, e:29 if hasattr(e, reason):30 print 抓取失败,具体原因:, e.reason31 32 def getMovie(self):33 pattern = re.compile(u<div.*?class="item">.*?<div.*?class="pic">.*?34 + u<em.*?class="">(.*?)</em>.*?35 + u<div.*?class="info">.*?<span.*?class="title">(.*?)36 + u</span>.*?<span.*?class="title">(.*?)</span>.*?37 + u<span.*?class="other">(.*?)</span>.*?</a>.*?38 + u<div.*?class="bd">.*?<p.*?class="">.*?39 + u导演: (.*?) 40 + u主演: (.*?)<br>41 + u(.*?) / (.*?) / 42 + u(.*?)</p>43 + u.*?<div.*?class="star">.*?<em>(.*?)</em>44 + u.*?<span>(.*?)人评价</span>.*?<p.*?class="quote">.*?45 + u<span.*?class="inq">(.*?)</span>.*?</p>, re.S)46 while self.start <= 225:47 page = self.getPage()48 movies = re.findall(pattern, page)49 for movie in movies:50 self.movieList.append([movie[0], movie[1], movie[2].lstrip( / ),
51 movie[3].lstrip( / ), movie[4],
52 movie[5], movie[6].lstrip(), movie[7], movie[8].rstrip(),53 movie[9], movie[10], movie[11]])54 55 def writeTxt(self):56 fileTop250 = open(self.filePath, w)57 try:58 for movie in self.movieList:59 fileTop250.write(电影排名: + movie[0] + rn)60 fileTop250.write(电影名称: + movie[1] + rn)61 fileTop250.write(外文名称: + movie[2] + rn)62 fileTop250.write(电影别名: + movie[3] + rn)63 fileTop250.write(导演姓名: + movie[4] + rn)64 fileTop250.write(参与主演: + movie[5] + rn)65 fileTop250.write(上映年份: + movie[6] + rn)66 fileTop250.write(制作国家/地区: + movie[7] + rn)67 fileTop250.write(电影类别: + movie[8] + rn)68 fileTop250.write(电影评分: + movie[9] + rn)69 fileTop250.write(参评人数: + movie[10] + rn)70 fileTop250.write(简短影评: + movie[11] + rnrn)71 print 文件写入成功...72 finally:73 fileTop250.close()74 75 def main(self):76 print 正在从豆瓣电影Top250抓取数据...77 self.getMovie()78 self.writeTxt()79 print 抓取完毕...80 81 DouBanSpider = MovieTop250()82 DouBanSpider.main()
代码比较简单,最后将信息写入一个文件,没有什么需要解释的地方。

用python爬取电影,python抓取vip电影

python爬虫抓取电影top20排名怎么写

初步接触python爬虫(其实python也是才起步),发现一段代码研究了一下,觉得还比较有用处,Mark下。 
上代码:

#!/usr/bin/python#coding=utf-8#Author: Andrew_liu#mender:cy"""
一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称
Anthor: Andrew_liu
mender:cy
Version: 0.0.2
Date: 2017-03-02
Language: Python2.7.12
Editor: JetBrains PyCharm 4.5.4
"""import stringimport reimport urllib2import timeclass DouBanSpider(object) :
"""类的简要说明
主要用于抓取豆瓣Top100的电影名称
Attributes:
page: 用于表示当前所处的抓取页面
cur_url: 用于表示当前争取抓取页面的url
datas: 存储处理好的抓取到的电影名称
_top_num: 用于记录当前的top号码
"""
def __init__(self):
self.page = 1
self.cur_url = "h0?start={page}&filter=&type="
self.datas = []
self._top_num = 1
print u"豆瓣电影爬虫准备就绪, 准备爬取数据..."
def get_page(self, cur_page):
"""
根据当前页码爬取网页HTML
Args:
cur_page: 表示当前所抓取的网站页码
Returns:
返回抓取到整个页面的HTML(unicode编码)
Raises:
URLError:url引发的异常
"""
url = self.cur_url        try:
my_page = urllib2.urlopen(url.format(page=(cur_page - 1) * 25)).read().decode("utf-8")        except urllib2.URLError, e:            if hasattr(e, "code"):                print "The server couldnt fulfill the request."
print "Error code: %s" % e.code            elif hasattr(e, "reason"):                print "We failed to reach a server. Please check your url and read the Reason"
print "Reason: %s" % e.reason        return my_page    def find_title(self, my_page):
"""
通过返回的整个网页HTML, 正则匹配前100的电影名称
Args:
my_page: 传入页面的HTML文本用于正则匹配
"""
temp_data = []
movie_items = re.findall(r<span.*?class="title">(.*?)</span>, my_page, re.S)        for index, item in enumerate(movie_items):            if item.find("&nbsp") == -1:
temp_data.append("Top" + str(self._top_num) + " " + item)
self._top_num += 1
self.datas.extend(temp_data)    def start_spider(self):
"""
爬虫入口, 并控制爬虫抓取页面的范围
"""
while self.page <= 4:
my_page = self.get_page(self.page)
self.find_title(my_page)
self.page += 1def main():
print u"""
###############################
一个简单的豆瓣电影前100爬虫
Author: Andrew_liu
mender: cy
Version: 0.0.2
Date: 2017-03-02
###############################
"""
my_spider = DouBanSpider()
my_spider.start_spider()
fobj = open(/data/moxiaokai/HelloWorld/cyTest/blogcode/top_move.txt, w+)    for item in my_spider.datas:        print item
fobj.write(item.encode("utf-8")+\n)
time.sleep(0.1)    print u"豆瓣爬虫爬取完成"if __name__ == __main__:
main()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

运行结果: 
 

评论

  • 评论加载中...