Python实现的爬取豆瓣电影信息功能案例


Posted in Python onSeptember 15, 2019

本文实例讲述了Python实现的爬取豆瓣电影信息功能。分享给大家供大家参考,具体如下:

本案例的任务为,爬取豆瓣电影top250的电影信息(包括序号、电影名称、导演和主演、评分以及经典台词),并将信息作为字典形式保存进txt文件。这里只用到requests库,没有用到beautifulsoup库

step1:首先获取每一页的源代码,用requests.get函数获取,为了防止请求错误,使用try...except..

def getpage(url):
  try:
    res=requests.get(url)
    if res.status_code==200:
      return res.text
    return None
  except RequestException:
    return None

step2:做每一页的网址解析,打开原网址https://movie.douban.com/top250?,查看网页源代码,可以看到每一个电影的源代码都是从<li>开始,在</li>处结束,写好正则表达式以后爬到的列表的每一条item都有五个元素,因此将其写成字典的形式,这里用到yield函数(关于yield函数的用法,廖老师的有一篇文章比较好懂https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/)

Python实现的爬取豆瓣电影信息功能案例

对单个网页的进行解析的代码如下:

def parsepage(html):
  pat=re.compile('<li>.*?<em class="">(.*?)</em>.*?<img width="100" alt="(.*?)" src=.*?<p class="">'
          +'(.*?)</p>.*?property="v:average">(.*?)</span>.*?<span class="inq">(.*?)</span>.*?</li>',re.S)
  items=re.findall(pat,html)
  for item in items:
    yield{
      'index':item[0],
      'title':item[1],
      'stars':item[2].strip(),
      'score':item[3],
      'concept':item[4]
    }

下面的代码是将每一个item写入文件,这里encoding='utf-8' 和ensure_ascii=False都是使写入文件时中文能保持不变,json.dumps可以将(字典)对象转化成字符串(但前面要先import json),with open的第二个参数为a,表示每次写入时,是往后追加(续接),而不是后一次写入将之前内容覆盖,\n是指要每一次写入一个item之后要换行。

def write_tofile(content):
  with open('doubanfilms.txt','a',encoding='utf-8' ) as f:
    f.write(json.dumps(content,ensure_ascii=False)+'\n')
    f.close()

最后,需要用循环语句将每一页(共10页)内容都进行以上操作。这里,第二页的网址就是在第一页的url上加上一个start=25, 第三页是加上start=50,也就是每一页的start=为25*i。最后一段代码如下:

def main():
  url="https://movie.douban.com/top250?"
  for i in range(0,9):
    url_i=url+'start='+str(25*i)
    html_i=getpage(url_i)
    for item in parsepage(html_i):
      print(item)
      write_tofile(item)
if __name__ == '__main__':
  main()

当然,这一段代码还有一种写法:

def main(start):
  url="https://movie.douban.com/top250?start="+str(start)
  html=getpage(url)
  for item in parsepage(html):
    print(item)
    write_tofile(item)
if __name__ == '__main__':
  for i in range(10):
    main(i*10)

如果想让你的程序跑的更快,可以用多线程爬虫(当然这里其实没有必要):

#在最开始加载Pool包
from multiprocessing import Pool
#最后的执行段改为:
if __name__ == '__main__':
  for i in range(10):
    main(i*10)
  pool=Pool() #在循环外写
  pool.map(main,[i*10 for i in range (10)])

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python基于queue和threading实现多线程下载实例
Oct 08 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
python实现媒体播放器功能
Feb 11 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
Python 变量的创建过程详解
Sep 02 Python
python实现KNN分类算法
Oct 16 Python
python百行代码自制电脑端网速悬浮窗的实现
May 12 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 Python
python超详细实现完整学生成绩管理系统
Mar 17 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 25 Python
Python 绘制多因子柱状图
May 11 Python
Python数据库小程序源代码
Sep 15 #Python
python中树与树的表示知识点总结
Sep 14 #Python
python树的同构学习笔记
Sep 14 #Python
python图形绘制奥运五环实例讲解
Sep 14 #Python
python列表插入append(), extend(), insert()用法详解
Sep 14 #Python
postman传递当前时间戳实例详解
Sep 14 #Python
Python 经典算法100及解析(小结)
Sep 13 #Python
You might like
PHP 分页类(模仿google)-面试题目解答
2009/09/13 PHP
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python3.0与2.X版本的区别实例分析
2014/08/25 Python
Python使用chardet判断字符编码
2015/05/09 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python对绑定事件的鼠标、按键的判断实例
2019/07/17 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
python制作一个简单的gui 数据库查询界面
2020/11/19 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
小学教师读书活动总结
2014/07/08 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
员工趣味活动方案
2014/08/27 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书