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中常用的各种数据库操作模块和连接实例
May 29 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
浅析Python装饰器以及装饰器模式
May 28 Python
python实现可视化动态CPU性能监控
Jun 21 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
Aug 04 Python
Python饼状图的绘制实例
Jan 15 Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
python图片二值化提高识别率代码实例
Aug 24 Python
python创建n行m列数组示例
Dec 02 Python
Python关于拓扑排序知识点讲解
Jan 04 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
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
Express+Nodejs 下的登录拦截实现代码
2017/07/01 NodeJs
Angular脚手架开发的实现步骤
2019/04/09 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
python动态参数用法实例分析
2015/05/25 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
python 字典中取值的两种方法小结
2018/08/02 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
Django发送邮件功能实例详解
2019/09/02 Python
Python dict的常用方法示例代码
2020/06/23 Python
python如何写个俄罗斯方块
2020/11/06 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
结婚喜宴主持词
2014/03/14 职场文书
民生工作实施方案
2014/05/31 职场文书
艾滋病宣传标语
2014/06/25 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
篮球拉拉队口号
2015/12/25 职场文书
导游词之清晏园
2019/11/22 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python