python3.5.4爬取豆瓣中国内地电影票房总排行输出到excel
首先,作为练手,我也是看别人的博客文章学习写爬虫的,过程中遇到很多问题,不过经过自己的努力完成了此项任务,虽然过程波折,但是收获不会少,作为自学可谓加深印象。先说下需求,使用Python3.5版本获取豆瓣950多部电影排行信息,包含电影名称、导演、主演、编剧、类型、时长、上映时间、评分、票房、评分人数等一系列信息。
参考文章:https://blog.csdn.net/Fighting_No1/article/details/50926008?locationNum=8&fps=1
#!/usr/bin/python
#-*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import re
import urllib.request
import xlwt#得到页面全部内容
def askURL(url):fakeHeaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; rv:16.0) (Gecko/20100101 Firefox/16.0)'}#伪装请求头request = urllib.request.Request(url, headers=fakeHeaders)#发送请求proxy = urllib.request.ProxyHandler({'http': 'http://192.168.1.11:1080'})#设置代理opener = urllib.request.build_opener(proxy)#打开代理urllib.request.install_opener(opener)#使用代理try:response = urllib.request.urlopen(request)#取得响应html = response.read()#获取网页内容return htmlexcept urllib.request.URLError as e:if hasattr(e, "code"):print(e.code)if hasattr(e, "reason"):print(e.reason)#获取相关内容
def getData(baseurl):#re.M或re.MULTILINE:使用^或$时会匹配每一行的行首或行尾#re.S或re.DOTALL:使用.时能匹配换行符# 找到片名findTitle=re.compile(r'<a .*?>(.*?)</a>', re.S|re.M)#找到评分findRating=re.compile(r'<span class="rating_nums">(.*)</span>')#找到评价人数findJudge=re.compile(r'<span>(.*)</span>')#找到影片相关内容:导演,主演,类型,制片国家,年份findAbstract=re.compile(r'<div class="abstract">(.*)</div>', re.S)#找到发行类别、上映时间、总票房findQuote=re.compile(r'<blockquote class="comment">(.*)</blockquote>', re.S)datalist = []for i in range(0,39):#url每页显示25条数据,所以需要循环遍历url=baseurl+str(i*25)#+'&sort=seq&sub_type='html=askURL(url)soup = BeautifulSoup(html, "html5lib", from_encoding="utf-8")for item in soup.find_all('div', class_='doulist-item'):#找到每一个影片项data = []item = str(item)#转换成字符串titles = re.findall(findTitle, item)#获取电影名称newtitles = re.sub('\s', '', titles[1])#去掉\n符和空白data.append(newtitles) # 添加中文片名rating = re.findall(findRating, item)#获取评分,评分貌似也有为空的if (len(rating) == 1):score = rating[0]data.append(score)#添加评分else:data.append(' ')# 留空judgeNum=re.findall(findJudge, item)[0]#获取评价数量,评价数量貌似也有为空的newJudgeNum = re.findall(r'\d+', judgeNum)#取出数字if len(newJudgeNum) != 0:peoplenum = newJudgeNum[0]data.append(peoplenum)#添加评价数量else:data.append(' ')# 留空a = re.findall(findAbstract, item)#这里可能会有空字符串出现if len(a) != 0:abstract=re.findall(findAbstract, item)[0]abstract = re.sub('\s', "", abstract)#替换/abstract = re.sub('</div>', "", abstract) # 去掉<br>words=abstract.split("<br/>")#测试发现主演有为空值的现象,此处在为空值的位置添加字眼“主演:”,便于切割字符串if (len(words) != 5):words.insert(1, '主演: ') # 留空#对字符串进行切割,得到导演、主演、电影类型、制片国家、电影所属年份director = words[0].split(':')[1]#导演data.append(director) # 放到列表data中mainactor = words[1].split(':')#主演有为空的if len(mainactor) != 0:actor = mainactor[1]data.append(actor)#添加主演else:data.append(' ') # 留空movietype = words[2].split(':')[1]#电影类型data.append(movietype) # 放到列表data中makercountry = words[3].split(':')[1]#制片国家data.append(makercountry) # 存入列表data中movieofyear = words[4].split(':')#电影所属年份if len(movieofyear) != 0:year = movieofyear[1]data.append(year[:4])else:data.append(' ') # 留空else:words=['导演: ', '主演: ', '类型: ', '制片国家/地区: ', '年份: ']director = words[0].split(':')[1] # 导演data.append(director) # 放到列表data中mainactor = words[1].split(':')data.append(mainactor)movietype = words[2].split(':')[1]data.append(movietype)makercountry = words[3].split(':')[1] # 制片国家data.append(makercountry) # 存入列表data中movieofyear = words[4].split(':') # 电影所属年份data.append(movieofyear)quote = re.findall(findQuote, item)# 处理空列表的情况出现if len(quote) != 0:info = re.sub('\s', '', quote[0]) # 去掉\n符和空白else:quote.insert(0, '总票房: | 上映日期: | 发行类别: ')#当发现有空数据时info = quote[0]#对获取到的字符串进行切割处理,以竖线为分割线进行切割separatequote = info.split("|")# 对字符串进行切割,得到总票房、上映日期、发行类别pricehouse = separatequote[0].split(":")[2:]#总票房if len(pricehouse) != 0:data.append(pricehouse[0])else:data.append(' ')releasedate = separatequote[1].split(":")[1:] # 上映日期if len(releasedate) != 0:data.append(releasedate[0])else:data.append(' ')releasetype = separatequote[2].split(":")[1:]#发行类别if len(releasetype) != 0:data.append(releasetype[0])else:data.append(' ')#print(data)datalist.append(data) # 放到大列表datalist中return datalist#将相关数据写入excel中
def saveData(datalist, savepath):book = xlwt.Workbook(encoding='utf-8', style_compression=0)sheet=book.add_sheet(u'豆瓣电影', cell_overwrite_ok=True)col = ('影片名', '评分', '评价人数', '导演', '主演', '类型', '制片国家', '年份', '总票房', '上映时间', '发行类别')for i in range(0, len(col)):sheet.write(0, i, col[i])#列名,表格的第一行开始写。第一列,第二列。。。。for i in range(0, 953):#从第零行开始至952行data = datalist[i]for j in range(0, len(col)):sheet.write(i+1, j, data[j])#数据book.save(savepath)#保存if __name__ == '__main__':baseurl = 'https://www.douban.com/doulist/1295618/?start='datalist = getData(baseurl)savepath = u'中国内地电影票房总排行.xls'saveData(datalist, savepath)
输出效果:
注意事项:这里输出发现第50条数据有问题,可通过手动删除得到其余952条电影信息,暂时不知道原因无法修正,如果你们发现了告诉我一声,我也好改正。我在程序中写入了953行,这样多余的冗余数据可通过手动删除来规避。
转载请标明原作者出处,谢谢
python3.5.4爬取豆瓣中国内地电影票房总排行输出到excel相关推荐
- Python爬取2020年内地电影票房总排行榜
import requests from bs4 import BeautifulSoup from matplotlib import pyplot as plt from matplotlib i ...
- 爬取豆瓣读书Top250,导入sqlist数据库(或excel表格)中
爬取豆瓣读书Top250,导入sqlist数据库(或excel表格)中 获取源代码请访问https://github.com/zhang020801/douban_bookTop250 一.程序源代码 ...
- 第一次写爬虫程序爬取豆瓣5W条电影数据
第一次写爬虫程序爬取豆瓣5W条电影数据 最近工作比较不是很忙,想到之前使用httpclient和jsoup爬取过一次豆瓣电影TOP250,但总觉得数据量太小,不过瘾.于是趁着最近不是很忙的机会,重新写 ...
- Python爬取豆瓣热映电影
Python爬取豆瓣热映电影 # encoding: utf-8import requests from lxml import etree# 1. 将目标网站上的页面抓取下来 headers = { ...
- Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影
文章目录 前言 安装bs4库 网站分析 获取页面 爬取页面 页面分析 其他页面 爬虫系列 前言 经过上篇博客Python爬虫小白教程(一)-- 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在 ...
- 用Python爬取豆瓣首页所有电影名称、每部电影影评及生成词云
1.爬取环境: window 7 Chrome 浏览器 注册豆瓣.注册超级鹰 2.安装第三方库:安装第三方库: 主程序用到的库有 import sys, time import pytesseract ...
- Python 爬取周杰伦歌曲信息,爬取豆瓣top250的电影,并保存至excel中
使用requests.BeautifulSoup模块,在网上爬取信息.有的网页可以直接爬取到,有些则需要分步加载,这时就需要使用network进行分析找到信息对应的请求. 有的会反爬虫,则需要添加he ...
- python爬虫实践之爬取豆瓣高评分电影
目录 概述 准备 所需模块 涉及知识点 运行效果 完成爬虫 1. 分析网页 2. 爬虫代码 3. 整理总结 概述 爬取豆瓣的高评分的电影. 准备 所需模块 re模块 requests模块 涉及知识点 ...
- python scrapy爬取豆瓣即将上映电影用邮件定时推送给自己
本文不是python.scrapy的教程,而是分享一个好玩的点子. python教程请看python教程,scrapy教程请看scrapy教程 爬取豆瓣高分电影教程参考python爬虫入门笔记:用sc ...
最新文章
- 2021年春季学期-信号与系统-第八次作业参考答案-第四小题
- Object.entries(obj)
- python中关于list列表的增删查改操作
- Arrays工具类常见方法
- php mysql 图像_php-向/从MySQL数据库插入/查看图像
- 【心灵鸡汤】谁的青春不迷茫
- php 判断来源 微信客户端_常见WebShell客户端的流量特征及检测思路
- c++ 应输入表达式_【C语言编程入门系列】—— 第五章,C语言基本运算和表达式(一)...
- 诺顿病毒库手工下载地址及英文补丁下载
- Python面向对象加强4.iter与next的用法,枚举器enumerate
- 爬虫笔记——urllib实战之淘宝零食板块爬取
- 100 offer:为什么你不需要做一名全栈工程师?
- 采访了 10 位身价过亿的 CEO,我终于看懂了有钱人的“奋斗”
- Revealing ecosystem services relationships and their driving factors for five basins of Beijing (2)
- Java休眠睡眠方法
- 随心情更新的学习笔记——JS代码之栈的佩兹的糖果盒
- 模电笔记7 多级放大电路的耦合方式及其优缺点和适用电路
- 【饭谈】【超详细】的资深测开的招聘要求,大家看看这符合了值多少钱?
- Ubuntu 域名解析失败解决
- 万邦微信公众号根据关键词取文章列表 API 返回值说明