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用于url解码和中文解析的小脚本(python url decoder)
Aug 11 Python
Python采用raw_input读取输入值的方法
Aug 18 Python
Python中声明只包含一个元素的元组数据方法
Aug 25 Python
Python原始字符串(raw strings)用法实例
Oct 13 Python
举例区分Python中的浅复制与深复制
Jul 02 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
浅谈django中的认证与登录
Oct 31 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
详解numpy的argmax的具体使用
May 27 Python
python装饰器常见使用方法分析
Jun 26 Python
详解如何用TensorFlow训练和识别/分类自定义图片
Aug 05 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 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
PR值查询 | PageRank 查询
2006/12/20 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
javascript引导程序
2008/10/26 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
js内置对象处理_打印学生成绩单的简单实现
2016/09/24 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
python的常见矩阵运算(小结)
2019/08/07 Python
pytorch sampler对数据进行采样的实现
2019/12/31 Python
python 删除系统中的文件(按时间,大小,扩展名)
2020/11/19 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
python中re模块知识点总结
2021/01/17 Python
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
大学生军训自我评价分享
2013/11/09 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
交通事故和解协议书
2014/09/25 职场文书
2014年教研工作总结
2014/12/06 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL