首先,作为练手,我也是看别人的博客文章学习写爬虫的,过程中遇到很多问题,不过经过自己的努力完成了此项任务,虽然过程波折,但是收获不会少,作为自学可谓加深印象。先说下需求,使用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相关推荐

  1. Python爬取2020年内地电影票房总排行榜

    import requests from bs4 import BeautifulSoup from matplotlib import pyplot as plt from matplotlib i ...

  2. 爬取豆瓣读书Top250,导入sqlist数据库(或excel表格)中

    爬取豆瓣读书Top250,导入sqlist数据库(或excel表格)中 获取源代码请访问https://github.com/zhang020801/douban_bookTop250 一.程序源代码 ...

  3. 第一次写爬虫程序爬取豆瓣5W条电影数据

    第一次写爬虫程序爬取豆瓣5W条电影数据 最近工作比较不是很忙,想到之前使用httpclient和jsoup爬取过一次豆瓣电影TOP250,但总觉得数据量太小,不过瘾.于是趁着最近不是很忙的机会,重新写 ...

  4. Python爬取豆瓣热映电影

    Python爬取豆瓣热映电影 # encoding: utf-8import requests from lxml import etree# 1. 将目标网站上的页面抓取下来 headers = { ...

  5. Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影

    文章目录 前言 安装bs4库 网站分析 获取页面 爬取页面 页面分析 其他页面 爬虫系列 前言 经过上篇博客Python爬虫小白教程(一)-- 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在 ...

  6. 用Python爬取豆瓣首页所有电影名称、每部电影影评及生成词云

    1.爬取环境: window 7 Chrome 浏览器 注册豆瓣.注册超级鹰 2.安装第三方库:安装第三方库: 主程序用到的库有 import sys, time import pytesseract ...

  7. Python 爬取周杰伦歌曲信息,爬取豆瓣top250的电影,并保存至excel中

    使用requests.BeautifulSoup模块,在网上爬取信息.有的网页可以直接爬取到,有些则需要分步加载,这时就需要使用network进行分析找到信息对应的请求. 有的会反爬虫,则需要添加he ...

  8. python爬虫实践之爬取豆瓣高评分电影

    目录 概述 准备 所需模块 涉及知识点 运行效果 完成爬虫 1. 分析网页 2. 爬虫代码 3. 整理总结 概述 爬取豆瓣的高评分的电影. 准备 所需模块 re模块 requests模块 涉及知识点 ...

  9. python scrapy爬取豆瓣即将上映电影用邮件定时推送给自己

    本文不是python.scrapy的教程,而是分享一个好玩的点子. python教程请看python教程,scrapy教程请看scrapy教程 爬取豆瓣高分电影教程参考python爬虫入门笔记:用sc ...

最新文章

  1. 2021年春季学期-信号与系统-第八次作业参考答案-第四小题
  2. Object.entries(obj)
  3. python中关于list列表的增删查改操作
  4. Arrays工具类常见方法
  5. php mysql 图像_php-向/从MySQL数据库插入/查看图像
  6. 【心灵鸡汤】谁的青春不迷茫
  7. php 判断来源 微信客户端_常见WebShell客户端的流量特征及检测思路
  8. c++ 应输入表达式_【C语言编程入门系列】—— 第五章,C语言基本运算和表达式(一)...
  9. 诺顿病毒库手工下载地址及英文补丁下载
  10. Python面向对象加强4.iter与next的用法,枚举器enumerate
  11. 爬虫笔记——urllib实战之淘宝零食板块爬取
  12. 100 offer:为什么你不需要做一名全栈工程师?
  13. 采访了 10 位身价过亿的 CEO,我终于看懂了有钱人的“奋斗”
  14. Revealing ecosystem services relationships and their driving factors for five basins of Beijing (2)
  15. Java休眠睡眠方法
  16. 随心情更新的学习笔记——JS代码之栈的佩兹的糖果盒
  17. 模电笔记7 多级放大电路的耦合方式及其优缺点和适用电路
  18. 【饭谈】【超详细】的资深测开的招聘要求,大家看看这符合了值多少钱?
  19. Ubuntu 域名解析失败解决
  20. 万邦微信公众号根据关键词取文章列表 API 返回值说明

热门文章

  1. Discuz论坛的搭建
  2. 【毕业设计】推荐系统构建和应用 毕业设计能做哪些推荐系统
  3. 如何为平板电脑开发android应用程序?
  4. 超小体积5G模块SIM8202G-M2
  5. 隐马尔科夫模型(HMMs)之五:维特比算法及前向后向算法
  6. 自定义View高仿懂球帝我是教练效果
  7. webpack打包优化(polyfill/HappyPack/dllPlugin)
  8. BBS论坛 登录功能
  9. Linux下JAVA WEB服务器的搭建一(JDK\MYSQL\TOMCAT)
  10. 武田提供3期TOURMALINE-MM2试验的更新