问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python抓取豆瓣电影排行榜压缩包

发布网友 发布时间:2022-04-18 09:04

我来回答

2个回答

懂视网 时间:2022-04-18 13:26

这个插件可以方便查看包括HTML在内许多内容

打开豆瓣电影排行榜top250网页,发现每页有25部电影,一共10页,其每一页url具有如下特征:

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

......

以此类推因此只需要利用循环对后面的0,25,...225处理即可。

网页点击任何一个电影中文名,右击鼠标“查看元素”查看HTML源代码:wKioL1gayqiA24f3AAGc29LICkg728.png

可以发现电影名称放在 中,同时英文名也放在 中。

可以利用正则表达式(.*)匹配电影的中文名和英文名,但这里只想得到中文名,所以需要过滤英文名。

过滤方法可以利用find(str,pos_start,pos_end)函数实现,剔除英文名字里特有的特征:‘ ’和‘/’,详见代码。

3.代码实现

这里代码比较简单,因此就不用定义函数了。

#!/usr/bin/python
# -*- coding: utf-8 -*- #
import requests,sys,re
from bs4 import BeautifulSoup

reload(sys)
sys.setdefaultencoding('utf-8')
print '正在从豆瓣电影Top250抓取数据......'

for page in range(10):
 url='https://movie.douban.com/top250?start='+str((page-1)*25)
 print '---------------------------正在爬取第'+str(page+1)+'页......--------------------------------'
 html=requests.get(url)
 html.raise_for_status()
 try:
 soup=BeautifulSoup(html.text,'html.parser')
 soup=str(soup) # 利用正则表达式需要将网页文本转换成字符串
 title=re.compile(r'(.*)')
 names=re.findall(title,soup)
 for name in names:
  if name.find(' ')==-1 and name.find('/')==-1: # 剔除英文名(英文名特征是含有' '和'/')
  print name
  # 创建名称,评分
 except Exception as e:
 print e
print '爬取完毕!'

热心网友 时间:2022-04-18 10:34

1.观察url
首先观察一下网址的结构 p250?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="ht.com/subject/1292052/"> 7 <img alt="肖申克的救赎" src="hster_cover/ipst/public/p480747492.jpg" class=""> 8 </a> 9 </div>10 <div class="info">11 <div class="hd">12 <a href="han.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.txt'17 18 def getPage(self):19 try:20 URL = 'ht.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] + '\r\n')60 fileTop250.write('电影名称:' + movie[1] + '\r\n')61 fileTop250.write('外文名称:' + movie[2] + '\r\n')62 fileTop250.write('电影别名:' + movie[3] + '\r\n')63 fileTop250.write('导演姓名:' + movie[4] + '\r\n')64 fileTop250.write('参与主演:' + movie[5] + '\r\n')65 fileTop250.write('上映年份:' + movie[6] + '\r\n')66 fileTop250.write('制作国家/地区:' + movie[7] + '\r\n')67 fileTop250.write('电影类别:' + movie[8] + '\r\n')68 fileTop250.write('电影评分:' + movie[9] + '\r\n')69 fileTop250.write('参评人数:' + movie[10] + '\r\n')70 fileTop250.write('简短影评:' + movie[11] + '\r\n\r\n')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()

代码比较简单,最后将信息写入一个文件,没有什么需要解释的地方。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小孩子的谜语有哪些? 高频UPS不间断电源厂家有推荐的吗? 农历 女:1986-10-16 属虎,男 1985-02-11 属牛,想在2013 年结婚,请问... ...12月21日出生属牛,女阴历1986年10月20日出生属虎,请问2012上半年哪天... 男属牛农历1985年正月16日生日,女属虎1986年10月26日生日,今年九月份左 ... ...属牛 女方:1986年农历10月20日 属虎 11年4月或5月结婚有合适的日子吗... 凌云诺怎么查看技能信息 凌云诺如何查看技能信息 凌云诺查看品阶福利的操作方法 凌云诺怎么查看品阶福利 凌云诺怎么查看本周个人活跃度 凌云诺查看本周个人活跃度的方法_百度... 深圳宝安正规医院割痔疮要多少钱 请问大佬有迷你兔数据恢复工具 V9.1 官方安装版软件免费百度云资源吗 有没有用过迷你兔数据恢复工具的呀?好用吗? 迷你兔数据恢复有没有完全免费的版本,求一个 具有法律效益的借条 关于借条如何才具有法律效益 阴天怎样让洗过的衣服快速干 最具有法律效力的借条 银行卡有利息收入说明卡可以正常使用吗 我朋友给我转了一笔钱,钱未到帐但银行卡上有转账利息收入,只是怎么回事啊 学生社保卡掉了怎么办理 监听耳机的,新弄的耳机插电脑独立声卡上平常不放音的时候有噪音,就像轻微的翁翁声,插集成声卡就没有 创新5.1声卡,开机的时候耳机会出现嗡嗡的声音,放音乐也不是很清楚。是机箱漏电吗还是怎样?怎么解决 学生社保卡弄丢后补办账号换了缴费后学校校验通不过找谁 客所思声卡插上话筒音箱惠嗡嗡响怎么处理 肉卓水的时候放了一盖白酒,然后换水小火煮了二个小时还有酒精吗? 玩英雄联盟时,经常声卡嗡嗡响,怎么办? 罗技g430声卡有嗡嗡声? 我家儿子9岁,老偷偷拿钱,有时拿100多怎么办? 声卡没声 耳机和音响都听到嗡嗡声 怎么回事? 我女儿,今年八岁了,老是拿大人的钱,我们该怎样教育她呢? 关于冥婚的恐怖小说 冥婚txt全集下载 跪求冥婚小说,最好带介绍谢谢! 找一本冥婚小说,女主姓樊,家里只要是女孩就要结冥婚 找一本关于冥婚的现代言情小说,跪求小说名! 百度的畅读模式怎么不能语音播放了? 不能用阅读模式 充电时重启后电量猛增,怎么回事 使用python2.7如何提取第四行第二列的字符串, 为什么手机本来没电了,重新开机就满电了 苏州云支付刷脸靠谱吗? 刷脸支付云单商户版,手机坏了,如何从新下裁个云单商户牌呢? 有谁能说下,苏州亿店云刷脸支付行么? 信联的成立将对行业产生什么影响? 什么移动支付好用又不贵? 美商信联融资担保有限公司怎么样? 信联设立能否重塑市场格局吗? 信联融智(北京)科技发展有限公司怎么样? 重庆两江新区信联产融小额贷款有限公司怎么样? 国商信联主要是做什么的?