python爬取内容存入Excel实例


Posted in Python onFebruary 20, 2019

最近老师布置了个作业,爬取豆瓣top250的电影信息。按照套路,自然是先去看看源代码了,一看,基本的信息竟然都有,心想这可省事多了。简单分析了下源代码,标记出所需信息的所在标签,ok,开始干活!

鉴于正则表达式的资料已经看了不少,所以本次除了beautifulsoup外,还有些re的使用,当然,比较简单。而爬到信息后,以往一般是存到txt文件,或者数据库中,老是重样的操作,难免有些‘厌倦'。心想,干嘛不存到Excel表呢?对啊,可以存到Excel表。

环境准备:pip install openpyxl  (假设你已配好了python环境)

好了,废话少说,上代码。  

# coding=UTF-8
'''
 function:爬取豆瓣top250的电影信息,并写入Excel文件
'''
import requests
import re
from openpyxl import workbook # 写入Excel表所用
from openpyxl import load_workbook # 读取Excel表所用
from bs4 import BeautifulSoup as bs
import os
os.chdir('C:\Users\Administrator\Desktop') # 更改工作目录为桌面
 
 
def getHtml(src):
 html = requests.get(src).content
 getData(html, src) # 首页链接和其他页不同,所以单独获取信息
 urls = re.findall('href="(.*filter=?)', html) # re获取获取跳转链接的href
 for u in range(len(urls) - 2): # 匹配到的跳转链接最后两个重复,需去掉
  next_url = 'https://movie.douban.com/top250' + urls[u]
  html = requests.get(next_url).content
  getData(html, next_url)
 
 
def getData(html, num_url): # html:网页源码 ,num_url:页面链接
 global ws # 全局工作表对象
 Name = [] # 存储电影名
 Dr = [] # 存储导演信息
 Ma = [] # 存储主演信息
 Si = [] # 存储简介
 R_score = [] # 存储评分
 R_count = [] # 存储评论人数
 R_year = [] # 存储年份
 R_area = [] # 存储地区
 R_about = [] # 存储剧情类型
 soup = bs(html, 'lxml')
 for n in soup.find_all('div', class_='hd'):
  # ts = n.contents[1].text # 得到电影的所有名称
  ts = n.contents[1].text.strip().split('/')[0] # 得到电影中文名
  Name.append(ts)
 for p in soup.find_all('p', class_=''):
  infor = p.text.strip().encode('utf-8') #此处用utf-8编码,以免下面查找 ‘主演'下标报错
  ya = re.findall('[0-9]+.*\/?', infor)[0] # re得到年份和地区
  R_year.append(ya.split('/')[0]) # 得到年份
  R_area.append(ya.split('/')[1]) # 得到地区
  R_about.append(infor[infor.rindex('/') + 1:]) # rindex函数取最后一个/下标,得到剧情类型
  try:
   sub = infor.index('主演') # 取得主演下标
   Dr.append(infor[0:sub].split(':')[1]) # 得到导演信息
   mh = infor[sub:].split(':')[1] # 得到主演后面的信息
   Ma.append(re.split('[1-2]+', mh)[0]) # 正则切片得到主演信息
  except:
   print '无主演信息'
   Dr.append(infor.split(':')[1].split('/')[0])
   Ma.append('无介绍...')
 for r in soup.find_all('div', class_='star'):
  rs = r.contents # 得到该div的子节点列表
  R_score.append(rs[3].text) # 得到评分
  R_count.append(rs[7].text) # 得到评论人数
 for s in soup.find_all('span', 'inq'):
  Si.append(s.text) # 得到简介
 if len(Si) < 25:
  for k in range(25 - len(Si)):
   Si.append('本页有的电影没简介,建议查看核对,链接:' + num_url)
 
 for i in range(25): # 每页25条数据,写入工作表中
  ws.append([Name[i], R_year[i], R_area[i], R_about[i],
     Dr[i], Ma[i], R_score[i], R_count[i], Si[i]])
 
 
if __name__ == '__main__':
 # 读取存在的Excel表测试
 #  wb = load_workbook('test.xlsx') #加载存在的Excel表
 #  a_sheet = wb.get_sheet_by_name('Sheet1') #根据表名获取表对象
 #  for row in a_sheet.rows: #遍历输出行数据
 #   for cell in row: #每行的每一个单元格
 #    print cell.value,
 
 # 创建Excel表并写入数据
 wb = workbook.Workbook() # 创建Excel对象
 ws = wb.active # 获取当前正在操作的表对象
 # 往表中写入标题行,以列表形式写入!
 ws.append(['电影名', '年份', '地区', '剧情类型', '导演', '主演', '评分', '评论人数', '简介'])
 src = 'https://movie.douban.com/top250'
 getHtml(src)
 wb.save('test2.xlsx') # 存入所有信息后,保存为filename.xlsx

代码中已有不少注释,这里说下爬取过程中遇到的小问题。

1.soup的contents方法,返回的是某标签下的子节点列表,但刚开始总是取不到想要的值,输出其长度后,有些傻眼..TM什么情况?有这么多的子节点吗?较真的我又去数了几遍,最后发现,它竟然连"换行"都算作是子节点!莫名地有点方...不知各位有没有遇到过。

python爬取内容存入Excel实例

如图,我按列表下标标记,0,2,4,6,8是换行,但也被算作子节点...

2.还是contents方法,代码中的 '#得到电影所有名称' 处的代码 n.contents[1]获取的除了a标签外,还有其下的span标签,这是为何?它们算一个整体?

python爬取内容存入Excel实例

3.对如下图的电影信息处理时,出现了几处错误,原因有以下几点:

(1)部分电影没有主演信息...

(2)主演信息为这样'主演: ',就一个主演字样,无内容

(3)部分电影没有简介

(4)当主演信息中没有'...'时,获取主演信息受阻

 解决方案:(1)(2)都是主演问题,判断是否存在即可。(我以捕获异常处理)

(3)是简介问题,我无法给出具体哪部电影没有简介,但给了该电影所在的页面链接,可访问核查。(貌似有点笨)

(4)获取受阻是因为后面没有精确定位点,最后以re.split('[1-2]+')方法解决,匹配年份第一位作为分片点

python爬取内容存入Excel实例

本次分享就到这儿了,最后,照旧放几张结果图吧。

python爬取内容存入Excel实例

python爬取内容存入Excel实例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
python简单贪吃蛇开发
Jan 28 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
python框架django项目部署相关知识详解
Nov 04 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
numpy.ndarray 实现对特定行或列取值
Dec 05 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
如何利用python检测图片是否包含二维码
Oct 15 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 Python
python周期任务调度工具Schedule使用详解
Nov 23 Python
Python和Go语言的区别总结
Feb 20 #Python
python整小时 整天时间戳获取算法示例
Feb 20 #Python
python 获取毫秒数,计算调用时长的方法
Feb 20 #Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 #Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 #Python
Python子类继承父类构造函数详解
Feb 19 #Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 #Python
You might like
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
jQuery 使用个人心得
2009/02/26 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
django 发送手机验证码的示例代码
2018/04/25 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
Python json格式化打印实现过程解析
2020/07/21 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
大学自我鉴定范文
2013/12/26 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
入党培养人考察意见
2015/06/08 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
导游词之镜泊湖
2019/12/09 职场文书
python文件与路径操作神器 pathlib
2022/04/01 Python